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 好像也挂了,已经彻底爆炸了,洗洗睡了。