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\) 数组的答案即可。

posted @ 2023-10-10 17:12  programmingysx  阅读(13)  评论(0编辑  收藏  举报