20231010
20231010 NOIP#17总结
时间安排
7:50~8:30
看题,\(A,B\) 一眼切,\(D\) 会 \(30\) 分,别的不会。
8:30~8:50
写 \(A,B\) 的正解。
8:50~9:20
写 \(D\) 的 \(30\) 分,再拼一个特殊性质包。
9:20~10:20
写 \(E\) 的第一档暴力,奈何题目错了我还读错了,调了这么长时间等于没调。
10:20~11:45
一直乱搞 \(C\) 题然后拿到了 \(10\) 分的好成绩。
总结反思
- 仔细读题
- 加快比赛节奏
题解
A.三分
考虑答案是谷函数直接三分答案。
B.二分+KMP
当前缀的长度变小时,出现次数一定单调不减,变大时出现次数一定单调不增。
所以二分答案,用 \(KMP\) 判断出现次数即可。
C.背包
预处理出 \(g[i][j]\) 表示第 \(i\) 个集合选 \(j\) 个数的最大异或和。
利用 \(g\) 数组做分组背包即可求出前 \(i\) 个集合选 \(j\) 个的最大异或和,便可以得到答案了。
考虑 \(2000\) 以内的数异或和最大只能到 \(2047\) ,对于每一个集合设 \(f[j][k]\) 表示选 \(j\) 个数,异或和为 \(k\) 时最少用的数的个数,对 \(k\) 做背包即可解决,然后就能用 \(f\) 来更新 \(g\) 了。
D.数据结构
预处理前缀和。
枚举每个起点,可以利用双指针求出有不多于 \(M\) 种灯笼的最大的右端点,再利用数据结构求解 \(ans=[a[l]\geq X]+\sum_{i=l+1}^r 2*[sum[i]-sum[l-1]\geq X]\) ,即维护 \(sum[i]\geq sum[l-1]+X\) 的个数。这个可以用多种方法求解,自己写的权值主席树。
E.基环树DP
题目给出的是一个基环树森林,且换长均为偶数,所以走两遍还等于没走。
设 \(f[x][0/1]\) 表示左 \(/\) 右脚走到 \(x\) 点时的最大答案。
先考虑对于一棵树有转移方程 \(f[v][0]=a[v]+\max(0,f[x][1])\ \ \ \ f[v][1]=\max(0,f[x][0])-a[v]\)
对于环,先复制一倍并维护其前缀和,则当前点的答案为 \(\max\{sum[i]\}-sum[x-1]\) 这个可以用单调队列做滑动窗口维护。
走两遍环等于没走,但可以走“一圈半”,所以利用同样的方法再维护一遍,注意此时 \(v[x]\) 要取反。
对于每个点做两遍分别计算左右脚踏入时当前点 \(f\) 数组的答案即可。