CF 杂题乱做 #1
CF 杂题乱做 #1
Problem A. CF2133D Chicken Jockey
一开始就先把栈分成若干个部分,然后从底至上一个个杀是最优的。
设 \(f_i\) 为杀掉 \(1\sim i\) 的最小代价,转移即可。
Problem B. CF2133E I Yearned For The Mines
对于一条链,直接扫就行。所以现在需要用 2 操作把树分成若干条链。
从叶子开始贪心。若 \(x\) 下面只有一条路径,直接从儿子把路径接过来;若有两个,令其作为两条路径的中转点,其父亲必须进行 2 操作;若有 \(\ge 3\) 条路径,那么 \(x\) 就要进行 2 操作。
对于两条路径的节点,将 \(x,fa_x\) 和两个儿子分成一组;对拥有 \(\ge 3\) 条路径的节点,将 \(x\) 和它的儿子分为一组。组与组之间无交,所以 2 操作不超过 \(\frac n 4\)。
Problem C. CF2134D Sliding Tree
一次操作最多使得直径增加 \(1\),所以总操作次数为 \(n-1-D\)。
只需输出第一步,所以 \(O(n)\) 找就行。
Problem D. CF2134E Power Boxes
从头到尾扔一次,不能确定 \(a_i\) 当且仅当 \(f_{i+1}=f_{i+2}\)。这样的点不会相邻,而且可以交换一次再问再确定。
确定点只需问一次,不确定点需要先交换,再问一次。不超过 \(\lceil \frac {3n} 2 \rceil\) 次操作。
Problem E. CF2136D For the Champion
绝对值很烦,先分别向下向左移动 \(2\times 10^9\) 步,那么 \(ans=\min(x_i-c+y_i-d)=\min(x_i+y_d)-c-d\),可以知道 \(X+Y\) 的值。然后向右移动 \(4\times 10^9\) 步,\(ans=\min(c-x_i+y_i-d)=\min(y_i-x_i)+c-d\),可以知道 \(X-Y\) 的值。\(8\) 次询问,可过。
Problem F. CF2136E By the Assignment
先考虑一个环,上面的 \(a_i\) 必须全相等,如果为奇环就必须全为 \(0\),否则可以为 \([0,V-1]\) 中的任何数字。
对于一般图,先缩边双,边双间独立。对于一个边双,有 \(0,1,V\) 三种情况,分讨一下,全部乘起来即可。
Problem G. CF2136F2 From the Unknown
先考虑 easy ver。令 \(N=10^5\),先问 \(N\) 个 \(1\),可以知道 \(Q=\lceil \frac N W\rceil\) 的值。
由 \(WQ\ge N\land W(Q-1)<N\),得到 \(W\in \left[\left\lceil \dfrac N Q \right\rceil,\left\lceil\dfrac{N}{Q-1}\right\rceil-1\right]\)。设为 \([L,R]\)。
由于 \(\lceil \frac N {2L} \rceil=\lceil \frac{\lceil \frac N L \rceil}{2}\rceil\ne \lceil \frac N R \rceil\),于是 \(2L>R\)。又由于 \(2(R-L)<10^5\),所以第二次询问可以构造为 \(L,1,L,2,L,3,\cdots,L,R-L\),得到 \(len=(W-L)+2(R-W)\),得到 \(W=2R-L-len\)。
然后加上 hard ver 的限制。第一次询问改为 \(M\) 个 \(B\),其取值稍后讨论。可以得到 \(P=\lceil \frac M{\lfloor \frac W B\rfloor}\rceil\)。
如果返回了 \(0\),那么 \(W<B\),可以问 \(B^2\) 个 \(1\),由于 \(\lceil \frac{B^2}{W}\rceil\) 的值是唯一的,所以可以唯一确定 \(W\)。
如果没有返回 \(0\),那么沿用上面的策略,可以得到 \(\lfloor\frac W B \rfloor\in[\lceil \frac M P\rceil,\lceil \frac M{P-1}\rceil-1]=[L,R]\),\(W\in[B\times L,B\times R+B-1]\)。
打个暴力找一下 \(M,B\),\(M=10655,B=114\) 是可过的。
Problem H. CF2130E3 Interactive RBS
首先找出一个 \(()\),然后可以随便用左右括号了。
先问一遍 \([1,n]\),如果为 \(0\) 则为 \()))))))(((\) 状物,二分一下分界点即可。 如果不为 \(0\),也可以二分找出 \(()\)。
E1,可以用 \('(\ (\ i\ i\ (\ j \ '\) 确定两个位置。
E2,考虑确定 \(i_1,i_2,\cdots,i_m\),用 " \(2^{j-1}\) 个 \((\) 和 \(2^{j-1}\) 个 \(i_j\) " 确定 \(i_j\),中间用 \('('\) 隔开。若 \(a_{i_j}=')'\) 会贡献 \(2^{j-1}\)。\(m\) 可以取到 \(8\)。
E3,用 \(k_j\) 个 \('(\ i_j\ '\) 确定 \(i_j\),中间用 $'(' $ 隔开。若 \(a_{i_j}=')'\) 会贡献 \(\frac{k(k+1)}{2}\),所以 \(\frac{k_j(k_j+1)}{2}>\sum_{p<j} \frac{k_p(k_p+1)}{2}\)。
Problem I. CF2151F Attraction Theory
一个 \(p\) 序列合法,当且仅当 \(p\) 不降,且 \(p_i-p_{i-1}=1\),且除了最小和最大的数字,其余数字都出现了奇数次。
对于一个 \(f_i\),设 \(f_i\) 为 \(p_j=i\) 的 \(j\) 的个数。先设 \(f\) 只在 \([1,k]\) 中有值,需要满足 \(\sum f_i=n\) 且 \([2,k-1]\) 内的都是奇数。限制很烦,所以再设一个 \(f_i=2g_i+d_i\),\(d_1,d_k\) 可以取 \(1,2\),其余只能取 \(1\)。
枚举 \(d_1=x,d_2=y\),设 \(S=n-k-(x-1)-(y-1)\),那么 \(\sum g_i=\frac S 2\)。\(S\) 必须是偶数。
然后发现 \(g_i\) 是对称的,所以可以说 \(E(g_i)=\frac S{2k}\)。化一下式子,得到 \(ans=C(2E(g_i)+1)\sum a_i+C\times a_1\times[x=2]+C\times a_k\times[y=2]\),其中 \(C=\binom{\frac S 2+k-1}{k-1}\)。
然后就可以算所有情况的答案了。
Problem J. CF2151G2 Hidden Single
G1:把序列分成两半,每个数字两边问一下,若两边都出现就一定不是答案,否则就可能是答案。问过一遍后就可以确定答案在哪一边,递归下去即可。还需要记一下哪些数字在当前区间和区间外都出现一次,这些数字问一次在哪一半就可以扔掉。
G2:在随机情况下,考虑判断一个数字是否是答案。把序列分成两半,\(\frac 1 2\) 的概率两边都出现,需要问两次;\(\frac 1 4\) 的概率只在左边,问一次;\(\frac 1 4\) 的概率只在右边,问两次。设期望为 \(X\),则 \(X=\frac 2 2+\frac{X+\frac 3 2}{2}\),得 \(X=\frac 3 2\)。
直接做不可过,那么沿用 G1 的第一层,用 \(\frac 7 4 n\) 的代价筛选出 \(\frac 1 4n\) 个可能的答案,只对这些可能的答案做即可做到期望 \(\frac {21} 8 n\) 次询问。询问前 shuffle 一下即可。
Problem K. CF2160F Twin Polynomials
多项式 \(f(x)\) 合法,当且仅当 \(a_i=\sum_{a_j=i} j\)。
由于 \(a_0\) 没有被固定,且 \(a_0x^0\) 这一项不会对其他项造成贡献,所以可以先确定其他 \(a_i\),然后令 \(a_0=\sum_{a_i=0} i\)。
磨一下样例,找一下性质,我们断言,一个 \(f(x)\) 合法,当且仅当对于每一个 \(i\) 满足三个条件之一:
- \(a_i=0\);
- \(a_i=i\);
- \(a_i=j,a_j=i \ (j\ne 0\land j\ne i)\)。
设 \(f(x)\) 合法,\(i\) 是第一个不满足条件的位置。显然 \(a_i\ne 0\land a_i\ne i\)。
首先对于 \(\forall j\in[0,i-1],a_j\ne i\),否则 \(j\) 就是不合法的,矛盾。
若 \(i\) 之后不存在 \(a_j=i\),那么 \(a_i=0\),矛盾。
若 \(i\) 之后存在一个 \(a_j=i\),那么 \(a_i=j\),矛盾。
若 \(i\) 之后存在 \(\ge 2\) 个 \(a_j=i\),拿出两个来,\(a_j=\sum_{a_x=j} x=i,a_k=\sum_{a_y=k} y=i\)。每个 \(x,y\) 一定都是 \(<i\) 的,\(a_x,a_y\) 不满足,矛盾。
若所有 \(a_i=-1\),那么不难得到 \(f_i=2f_{i-1}+(i-1)f_{i-2}\),特判 \(a_n\ne 0\) 即可。
若一些位置被确定了,先把不合法的判掉,然后把剩下拿出来的做一样的 dp 即可。
https://codeforces.com/contest/2160/submission/343479360
Problem L. CF2160G2 Inverse Minimum Partition
先考虑 G1。分出相邻的每两段之间,前一段的末尾一定比后一段的开头小,否则可以把后一段的开头扔到前面,两段贡献都不升。
所以可以将原序列缩成若干个极长不升连续段,同一个段之间不可能有断点。然后若一段的末尾比后面一段的末尾大,则这两段可以合并,答案不劣。缩完后,序列就只剩下后缀最小值是有用的。
然后可以设 dp:\(f_i=f_j=\lceil\frac {v_i}{v_{j+1}} \rceil\),可以直接斜率优化做到 \(O(n)\) 或 \(O(n\log n)\)。
https://codeforces.com/contest/2160/submission/343501196
再考虑 G2。直接套 G1 不可做,我们需要更多性质。
首先整个序列的答案不会超过 \(2\log V\):从后向前扫,每次向前分出贡献 \(\le 2\) 的段,每分出一段数字至少除以 \(2\)。
然后每一段的贡献不会超过 \(3\):否则可以从中间划开让贡献更小。
按照 G1 的 dp,需要设 \(f_{l,r}\) 为 \([l,r]\) 的最小答案,状态数已经炸了。将值域记进状态,设 \(f_{i,v}\) 为以 \(i\) 为右端点,答案为 \(v\) 时最靠左的左端点。再处理出 \(p_{i,v}\) 表示以 \(i\) 为右端点,划分出一个贡献为 \(v\) 的段最靠左的左端点。
初值 \(f_{i,0}=i+1,f_{i,1}=p_{i,1}\),转移 \(f_{i,v}=\min_{1\le k\le 3}(\min_{f_{i,v-k}\le j<f_{j,v-k-1}} p_{j-1,k})\)。对每个 \(k\) 处理出 st 表即可。
复杂度 \(O(n(\log n+\log V))\)。

浙公网安备 33010602011771号