2022NOIP前集训
20221004
T1
不需要卡常的卡常题。
首先 \(p\) 数组一看就能去掉。
然后把删除反过来,变成后缀最小值。
有结论是从 \(1\) 开始的最长上升子序列只有 \(\log\) ,所以复杂度就是 \(log^2\) 的。
T2
显而易见的按照 小于、等于、大于 分成 \(0,1,2\) 。要求最后留下 \(1\) 。
因为 \(1\) 和 \(2\) 是可以直接去掉 \(2\) 的,所以 \(0\) 才是影响答案的因素。
首先连着的 \(0\) 缩成一个,然后如果 \(0\) 的个数大于等于 \(1+2\) 的个数就 No 。
证明考虑一个 \(0\) 至少会抵消掉一个 \(1\) 或 \(2\) ,这是必要性。
只要每次消三个,保证至少有一个 \(0\) 就能做到上面的效果。这是充分性。
写的时候先把连续的 \(0\) 缩起来,然后找到一个等于 \(m\) 的,左边缩一次右边缩一次即可。
……比较粗略但是手玩一下容易懂。
T3
没想到啊……提示的部分分竟然是最小的一档……
一个简单的暴力是 \(O(4^mn)\) 的 DP 。 加上 \(n=1\) 可以拿到 \(40\) pts 。
毫无提示价值的部分分
一个有提示价值的部分分是 \(m=1\) ,将一个自由位取出后其他位任意取,该位取 0/1 中有且仅有一个合法方案。
启示我们找一个自由位计算贡献。
考虑另外一种 DP:设 \(f_{i,j,S,0/1}\) 为对从高到低前 \(i\) 位,第 \(i\) 位处理到第 \(j\) 个数,取值范围的状态为 \(S\) ,当前位的异或和为 \(0/1\) 的方案数。
\(S\) 的状态有三种:1 靠左边界、 2 不靠左边界但靠右边界、 3 自由 。
其中 1 可以转到 2 或 3 ,区别在于转的时间不同;2 可以转到 3.
考虑枚举最高位且最靠前的自由位计算贡献,其较低位由其他数的取值情况确定,因此其他数的较低位任意取。
枚举自由位出现在哪个数,处理其前面的数要求不出现自由位,后面的数随意。
前者是不需要 DP 求的,因为情况唯一;后者要 DP……
20221005
绝对不能再让 XC 组题了!
T1
ARC013D
经典的折线
为了去重,钦定接触 \(y=0\) 的折线贡献。
T2
先是基础的贪心,从后往前能不取就不取。
然后有结论是不取的段是 \(O(\sqrt V)\) 的,所以把暴力改成线段树的话复杂度就是 \(O(n \sqrt V \log n)\) 的。
T3
小常数做法:
扔到 dfn 序上,先算出 \(h_i\) ,然后记录 前缀/后缀/子树 内的最小值及出现次数判断是否贡献。
T4
Splay 维护链,链的特殊形式决定了它可以用 \(x+y\) 排序。
但事实上也不必加这个 key 值,直接合并时确定好顺序,Splay 在维护过程中是不会改变的。
20221007
T1
签到,贪心取最长链为只走一次。
T2
DP 硬上(?)
设 \(f_{i,S,S'}\) 为从高往低前 \(i\) 位,是否贴上界的状态为 \(S\) ,是否大于前一项的状态为 \(S'\) 。
暴力 DP,中间的转移可以预处理,复杂度 \(2^{21} \times 500\) 。
T3
容斥,\(| S_x \, \cup \, S_y | = |S_x| + |S_y| - |S_x \, \cap \, S_y|\) 。
考虑计算后者,设 \(p_i\) 为 \(i\) 左侧第一个 \(x\) 满足 \(a_x \ge a_i\) ,那么一个数 \(x\) 被包含在 \(S_y\) 里当且仅当 \(p_x <y \le x\) ,扫描线即可。
20221018(20221019)
jz题。质量还不错?
T1
先写出一个很基础的暴力,然后发现 \(a_i>0\) 时 \(T\) 的增长是指数级别的,因此去掉 \(a_i=0\) 之外的答案不会很大。
那么把这一部分算出来,再双指针合并一下 \(a_i=0\) 的答案即可。
T2
将变化关系写出来发现是若干个环,且用题设条件知 \(x\) 和 \(p-x\) 一定不在同一环内。
枚举破环成链之后方案是固定的,\(O(1)\) 计算变化即可。
其实没有题设条件也可以做,单环甚至比双环要好做。
把单环像双环一样缩起来,与双环的区别在于有一条特殊边,而这条特殊边的贡献是确定的,其他也可以扫一遍算贡献。
T3
容斥,扫描线。
T4
做个双射,若 \(pre_i \in [l,r]\) ,\(pre_i \rightarrow i-pre_i\) ;若 \(pre_i \not \in [l,r]\) , \(pre_i \rightarrow 0\) 。
那么就是真正意义上的 LCP 了。
用哈希和主席树维护一下,查询时二分,复杂度 \(O(n \log ^2 n)\) 。
20221022
bnds,质量挺行。
T1
不要推式子不要推式子不要推式子
令 \(d=\gcd\{a,b\}, \, a=a'd ,\, b=b'd\),那么有 \(a'b' \le \frac{L}{d}\),
枚举 \(a',b'\) ,二者要求同余,由上式可以得到 \(d\) 的上限,要求的和为 \(d|a'x-b'y|\) 。
复杂度 \(O(L \le L \log L)\) 。
T2
预处理根到每一个点的桶和对于任意 \(k\) 的答案。
树上路径拆作两边然后合并算贡献。
T3
注意到 \(n\) 个操作的分段函数实际上至多只有 \(n+1\) 段,因此可以线段树维护块内操作的分段函数。
查询时分成 \(\log\) 段一直做就好。
10.24杂题
MoQZ Two Arrays
二分答案,图上点变成 0/1 ,变成一个简单一些的博弈题,Alice 到 1 ,Bob 到 0 ,不能走到一个一样的格子。
必胜条件是一定在最大匹配中。
好题。
pzr CCO 2021
好题。
咕咕咕
20221110
T1
T2
观察覆盖过程,发现只有两种转移方式
20221114
T3 文件名又打错了。
T2 一个 int 数组开成了 bool 数组,pollard_rho 还不是很会。
T1
贪心,从底至上做,每次取最深的一个点移到当前位置,容易证明正确性。
用可并堆或者线段树合并维护。
T2
Pollard_rho 板子。
题解做法给的竟然不是 Pollard_rho 而是一个神必 MR 做法,想不明白用了 MR 不肯用 PR 是什么心理。
T3
\(2 \times 2\) 的特殊情况有结论:只要每行每列的异或和不变,就能用题中操作转化。
将操作每 4 个一起做,拼成新操作,这样就能分成 \(A \times B\) 个相当于上面 \(2 \times 2\) 特殊情况的子问题。
考虑这样做的局限性:一些单独的操作无法被表示。
手玩一下可以发现,中间的任意一个操作都可以用 新操作+第一行第一列的操作 表示。
那么只需要枚举第一行第一列的操作情况,剩下的用结论解决。
T4
每个区间保留左端点,
设 \(f_i\) 为以 \(i\) 为结尾的最小开头,初始化 \(f_i=i+K\) 。
答案为 \(\sum (i-f_i+K)/K\)。
容易发现只需要维护 \(\sum f_i\)
往右加点是简单的,往左加点其实也只用处理 \(f_i\) 的出现次数。
可以回滚莫队解决。
20221116
没啥大锅,T2 写假了,T4 不是很够时间想部分分。
T2
把环之外的点先处理了,然后从环上任意一个没被覆盖的点开始枚举 \(k\) 个作为起点,暴力跑整个图。
T3
把已知信息转化成知道若干前缀和。
那么确定一个数 \(a_i\) 当且仅当 \(pre_{i-1}\) 和 \(pre_{i}\) 都已知,用 exgcd 可以对两个数算出这样的答案。
变成多个数,加个容斥就行,枚举集合 \(S\) 和 \(T\) ,容斥系数为 \((-1)^{|S|+|T|}\) 。
容易发现只有 \(\gcd(\operatorname{lcm}(S) , \operatorname{lcm}T)=1\) 时才会对答案有贡献,因此求答案的过程是枚举超集。
复杂度 \(O(3^m \log n)\) 。
T4
奇奇怪怪 DP 题。
一个数至多被移动一次,移动数的顺序显然是无关紧要的,那么考虑从大到小移数。
设 \(f_{i,j}\) 为已经处理 \(i+1 \sim n\) ,将 \(i\) 移到原序列 \(j\) 位置的最小代价。
如果移动 \(i\) ,贡献为 \(now(i) + now(j)\) ;
如果不移动 \(i\) ,则需要 \(i\) 与 \(i+1\) 之间的数全部移开,因此对 \(pos_i+1 \sim j\) 都会多 \(\max \{ i-a_j,0 \}\) 的代价。
20221117
题意错的太离谱,考场策略已经不重要了。
T1
不同置换环先分开,结论是长度为 \(n\) 的环贡献为 \(2^{lowbit(n)}\) ,证明考虑构造。
T2
出题人想必被线代作业迫害了
套 BEST 定理,问题变成求基尔霍夫矩阵的 \(\det\) ,这样是 \(O(n^3)\) 的。
加速求 \(\det\) 过程,换阶公式:
证明考虑行列式 \(\det \begin{pmatrix} A & B \\ C & D \end{pmatrix}\) 的两种求值方式即可。
T3
原题,二分求第 \(k\) 大。
\(O(n \log ^2 n)\) 的做法是容易的,ODT 做到 \(O(n \log n)\) 。
T4
《WD 与地图》 第二次出现在联考。
20221119
《半真模拟》(大雾
T1
拓扑。
T2
填的过程肯定是贪心的,那么要求相当于在 \(v_i\) 的位置消耗 \(siz_i\) 个比它小的数,(\(siz_i\) 指其子树内的空点 减去 在更小子树内的空点)。
前缀和扫一遍就行。
T3
70pts 的部分分是判断是否存在完美匹配。
联想到网络流。
限制每条边的流量与人数取 min ,容易发现这是正确的。
二分人数,最大流判断是否可行即可。
T4
有显而易见的 \(O(3^n n^2)\) 做法。
然后观察性质。
显然最优方案的树是 DPS 树,不存在横插边。
那么枚举了点集和根之后,下面挂的子树一定各自是一个连通块,转移唯一。
做到了 \(O(2^n n^2)\) 。

浙公网安备 33010602011771号