NOIP2023 爆炸记

NOIP2023 爆炸记

Day -4

33dai 模拟赛 \(100 + 20 + 20 + 0 = 140\),A 构造给大样例,直接变找规律题,难绷。

B 没想到是矩阵,感觉正解不难写但是很难想到第一步,C 题 dls 都说难推,获得摸鱼的正当理由,哈哈😎。

通过了东方永夜抄 Easy 难度,收藏了cz 的东方题单😋。

Day -3

33dai 模拟赛 \(100 + 27 + 50 + 35 = 212\),竟然是榜二,同机房大佬做出来了 C %%%。

A 很妙,这棵树有 BIT 的性质,\(father(a)\)就是 \(a - lowbit(a)\),根据 \(\sum v \le 10^6\),可以想到暴力跳父亲,统计当前子树内的贡献,也就是 \(\binom{v}{d}\),注意消去儿子的贡献。

B 很妙,观察到 \(n^2\) 可 DP,类敲砖块,这时候对 DP 的优化就是观察性质,由于一定存在一种方案直接全部方案一,代价是 \(3k\),所以方案二的行数不能小于 \(O(\sqrt {k})\),推一下发现差不多是 \(780\),所以直接大力 DP 就做完了。

C 很妙,反向考虑,从递增序列推到原序列,然后根据每次左右端点跳到中间的性质,可以从 \(n\)\(1\) 地确定每一个位置的操作。

D 很妙,我不会。

Day -2

ZR VP,\(90+70+20+0 = 180\) 爆了。

A 谔谔,并查集维护互相跳到的空格,哈希表要卡常,unordered_map 会被卡。

B 很妙,首先观察到如果没有 TG 改最后一个即可,否则找到第一个适合的位置作为左端点,然后枚举右端点,用哈希+二分去判断两个字符串的大小,然后做完了。

D 神题,括号有祖先关系,所以考虑一棵括号树,这时候如果 \(u, v(u < v)\) 同级肯定直接对冲,否则必须要先爬到相同的高度再对冲,爬祖先的这一步有两种爬法,一种是一直往左爬到父亲的左括号,一种是往右爬到右括号,这里倍增 \(l_{i, j}\) 表示 \(i\) 往左爬 \(2^j\) 步最左到哪,\(r_{i, j}\) 对称,那就可以往上爬直到存在一种方法可以跑到 \(v\) 右侧,这时候我们不跑过去,而是让 \(v\) 也爬过来,最后直接对冲即可,这题可以很简化,如代码:

for(int i = 0; i < n; i ++)
    l[i][0] = min(max(0, i - 1), to[i]), r[i][0] = max(min(n - 1, i + 1), to[i]);
for(int j = 1; j < 20; j ++) {
    for(int i = 0; i < n; i ++) {
        l[i][j] = min(l[l[i][j - 1]][j - 1], l[r[i][j - 1]][j - 1]),
        r[i][j] = max(r[l[i][j - 1]][j - 1], r[r[i][j - 1]][j - 1]);
    }
}
for(int i = 1, a, b, tmp, ll, rr, ans; i <= q; i ++) {
    cin >> a >> b;
    a --, b --;
    if(a > b) swap(a, b);
    if(a == b) {
        cout << 0 << '\n';
        continue;
    }
    ll = rr = a, ans = 0;
    for(int j = 19; ~j; j --) {
        tmp = max(r[ll][j], r[rr][j]);
        if(tmp < b) ll = min(l[ll][j], l[rr][j]), rr = tmp, ans += (1 << j);
    }
    a = rr, ll = rr = b; // a = rr 防止冲过头
    for(int j = 19; ~j; j --) {
        tmp = min(l[ll][j], l[rr][j]);
        if(a < tmp) rr = max(r[ll][j], r[rr][j]), ll = tmp, ans += (1 << j);
    }
    cout << ans + 1 << '\n'; // 最后互相到达还需要一步
}

Day -1

woc,怎么就 Day -1 了。

33信心赛,\(100 + 100 + 100 + 66 = 366\),T4 bitset 忘记特判第一个点了-33pts😎.

A 质因数分解求 lcm 然后除一下就完了,证明显然。

B 直接让 y 成为根,之后记 x 能走到的最高处是 \(u\),然后计算 \(u\) 子树里面的最大深度,深度 - 1 + \(dep_u\) 就是答案。

C 很妙,可以发现,所有偶数最多选一个,所有 \(\bmod 3 = 0\) 的数最多选一个,所有 \(\bmod 4 = 0\) 的数最多选一个,但是这个限制没有偶数紧,所以不用管,进一步考虑到所有提供限制的数实际上只有质数,而 \(72\) 以内的质数只有 \(20\) 个,进一步观察到,如果两个不相同的数最大公因子 \(d > 72\),则它们肯定无法放在一个长度为 \(72\) 的区间,所以状压 \(20\) 个质数的限制是否被满足,然后直接 DP 即可。

D 很草,观察到可以用 bitset 优化暴力,观察到对于 99pts bitset 都可以草过去,观察不到 33pts 要特判,观察不到 100pts 要用多项式,观察不到直接卡时可以 100pts 😪😪。

Day 0

摸了一天。

Day 1

T1 二分哈希秒了,直接开码,30min 差不多写完调完,发现大样例跑了 1.2s,卡常卡到了 1.1s,1h 时直接扔了 10pts 不拿也罢。

T2 一眼带权并查集,然后发现直接合并会假掉,想了 1h 不会。

T3 联想到 CCPC K,结果发现根本不一样,然后想 \(O(n^3)\) 解,最后没调出来。

T4 随便 DP 搞搞拿了 36pts,然后发现特殊性质 B 好像很好做,写了 8pts。

出来估分 \(90 + 40 + 10 + 44 = 184\),感觉有省一。

回家拿到代码发现云斗出数据了,T1 交上去 CE 了,好像完蛋了。

int mod[2] = {998244353, 1e9 + 7};

这个东西在 Dev 下会 Warning 但是不报错,原因是数组不会自动强转,考试的时候没管直接丢了,实际上这个在别的编译器下都会直接报错,Dev 你好 nb 啊😅,教训是一定要注意 Dev 的 Warning,不然会完蛋😭。

T4 的 性质 B 好像也挂了,已经彻底爆炸了,洗洗睡了。

posted @ 2023-11-18 17:13  MoyouSayuki  阅读(63)  评论(0编辑  收藏  举报
:name :name