联赛前第四阶段总结

这次终于进小机房了QwQ,可是这样就得离开叶队了,啊,这可太不好了呀
虽然小机房没有氛围吧,但是有种不一样的感觉

联赛模拟测试14

A 虎

  • 看到这道T1我十分蒙,没啥思路,尤其是不知道那些可以不用变成黑边的怎么处理,然后就打了父亲都是1的和全是黑边的,后者还打挂了。
  • 其实这道题和昨天的Graph特别像,也是偶数条边就不用往上传,奇数条边,如果x能传就传上去,一个Dfs就搞定了。
bool Dfs(int x) {
    bool b = 0;
    for (int i = head[x]; i; i = e[i].next) {
        int y = e[i].t;
        if (!Dfs(y)) continue;
        if (b) ans++;
        b = !b;
    }
    if (b && !w[x]) ans++;
    return ((w[x] == 1) || (b && w[x] == 2));
}

int main() {
    n = read();
    for (int i = 2; i <= n; ++i) {
        Add(read(), i);
        int y = read(), z = read();
        w[i] = !z ? 2 : y ? 0 : 1;
    }//w为0表示不能改变,1表示需要改变,2表示可以改变
    Dfs(1);
    printf("%d
", ans);
    return 0;
}

B 陶陶摘苹果

  • 一开始看错题了以为是求最长上升子序列,一看20分5000的数据(O(n^2log(n)))就不想做了,但一看还有3个小时,T3又那么恶心,就肝这道题。写完最长上升子序列后突然发现读错题了,直接O(n)扫m遍,这就很可做。
  • 后来想了想怎么优化,就想到了改一个点都会改那些,发现对前面是没有影响的,然后在改的地方后面找第一个大于前面最大值的点,预处理出来这个点到最后的答案就好了
  • 然后我就开始了无尽的预处理,先O(n)的把1~i的答案求出来,在用ST表+二分查找+线段树区间加把i~n的答案求出来,最后询问的时候在用二分回答。
  • 最后切掉了这道题,说实话感觉真不赖

C 开心的金明

  • 一看这麻烦的题面整个人都傻了,瞎打了个暴力就去肝T2了,最后得了20分,就是两个样例
  • 正解贪心,模拟一下过程。
  • 用set维护结构体,表示电脑的价格和数量,每次都买最便宜的,如果超过e限制,就每次删最贵的,

D 笨小猴

  • 这个题之前学长讲过,当时挺在状态,想了一会就想出来了,就是按a从小到大排序,然后每两个都选b值大的那个,最后把a值最大的选上,一定能保证b值符合条件,然后画个柱状图找最差情况模拟一下就知道这是对的。


联赛模拟测试13

A Tree

  • 考试时用最大生成树的思路瞎推了推,发现可能是边权加起来,然后对拍起来没啥问题,就这样了A了

B Permutation (Unaccepted)

  • 能往后放的就往后放,本来以为是TLE50分,结果是WA了,看别人都90分,问了问叶队,得多跑几遍,然后我加个while(1)就90分了QwQ

C Graph

  • 这道题前20分的点没过,就把树的点过了。
    其实其它图的解法和树的非常类似,对于每个联通块先搞出一棵Dfs树来,反祖边就把祖先拆开一个点成为子节点,然后按照树处理就好了(不用真的拆开,只是一种思路)
bool Dfs(int x, int fa) {
    dfn[x] = ++dfc;
    int a, b = 0;
    for (int i = head[x]; i; i = e[i].next) {
        int y = e[i].t;
        if (y == fa || dfn[y] > dfn[x]) continue;
        if ((dfn[y] && dfn[y] < dfn[x]) || Dfs(y, x)) {
            if (b) ans[++cnt] = (Node) {a, x, y}, b = 0;
            else a = y, b = 1;
        }
    }
    if (fa && b) ans[++cnt] = (Node) {a, x, fa};
    return !b;
}

D 十字绣

  • 这个题都写过题解,但考试的时候只回想起了一丢丢,暴力还不会打,于是愉快的拿到了10分的好成绩,


晚间测试5

真是越考名次越低,总名次都掉到第8了 QwQ

A 容易题

  • 考场上发现将每位能选的数的和相乘就是答案,拍了拍没啥问题,然后100%的数据就用map搞了搞就过去了。

B 兔子与樱花

  • 看了半天没看懂题,瞎打了个暴力水了20分。
    正解是贪心,从叶子节点往上搜,每个节点的子节点能删就删(先按贡献从小到大排序)


联赛模拟测试12

爆了20分。

A 松鼠的新家

  • 树上差分板子题。

B trade

  • 堆优化反悔贪心,每次找前面最小的,如果有比当前小的,算在答案里,并且另加入一遍这个点的价值,如果后面选了这个点,就相当于在这时买了又卖。

C sum

  • 本来1~4,11~16都可以暴力碾过去,但是写的时候没注意,11~14单独写了一种方法,然后不知怎么就挂了,只拿了40分
    因为从(S_{n, m})可以O(1)得推到(S_{n,m+1},S_{n,m-1},S_{n+1,m},S_{n-1, m}),询问可以离线,可以将询问想成区间,这样就可以用莫队来解决,然后叶队手把手教了我奇偶优化莫队(叶队太巨了!)。

[S_{n,m+1}=S_{n,m}+C_n^{m+1} ]

[S_{n,m-1}=S_{n,m}-C_n^m ]

[S_{n+1,m}=2 imes S_{n,m}-C_n^m ]

[S_{n-1,m}=frac{S_{n,m}+C_{n-1}^m}{2} ]


D building (Unaccepted)

  • 前4个点没对,5~8个点对了可真是神奇,前20分的代码还改了一次,但还是挂了,只拿了20分。


晚间测试4

A 字符串

  • 一看见题目上说1的个数不能少于0的个数,那就往卡特兰数上想。把坐标系画出来后不知道到对称点的方案树怎么求,只能打了个表,算出来结果是(C(n+m,m)-C(n+m,m-1))

B 哪一天她能重回我身边 (Unaccepted)

  • 暴力Dfs的时候回溯的时候逗号达成分号,然后仅有的20分没了...


联赛模拟测试11

这次状态还可,挂了-20分
纯暴力选手Rank3???

A One

  • 线性约瑟夫问题,考试的时候打了30分暴力,前7名就我30分,别人都是60,100。
    然而在网上并没有找到这类题的题解,就问了xyx和lzs,正解是推式子,从0开始编号,最后剩下一个肯定是0号,然后推出在2个人的时候是几号,最后推出在n个人的时候是几号
    int x = 0;
    for (int i = 2; i <= n; ++i)//当前序列有多少人
        x = (x + n - i + 1) % i;
    printf("%d
", x + 1);

B 砖块

  • 大模拟,12种情况稍微想想就出来了。

C 数字 (Unaccepted)

  • 考场上想了个错误的80分写法,对拍拍出来了,然后把20分的代码加上个预处理,拿了50分。

D 甜圈

  • 打了个50分n2暴力,结果数据水,拿了70分

  • 正解是将工作顺序看成一字符串,写个线段树维护一下Hash值,然后区间加,区间乘。可是乘法标记和加法标记混一块的实在是想不明白,若竹兄上课讲的那种方法和我考场想的特别像,然后我就按若竹的提示想了出来。

  • 将T个工作拍到线段树上,每个节点储存做的工作区间,[0, 0]表示还没有工作,[-1, -1]表示不合法,然后大力Pushdown一下就可以了,自己想出来可真是高兴

原文地址:https://www.cnblogs.com/Z8875/p/13781348.html