2024.8 做题记录 / 那是曾梦想的世界 所以甘心蛰伏于长夜
P2694
首先不难想到设 \(f[i][j][0/1]\) 表示先手/后手在剩下最后 \(i\) 个数用 \(j\) 个操作是游戏的 A-B 的代价为多少,答案显然就是 \(\frac{f[n][2][0]+sum[n]}{2}\),其中 \(sum\) 是 \(a\) 的前缀和。
转移也是很简单的,\(f[i][j][0]=\max\{f[i+j][k][1]\}+sum[i+j-1]-sum[i-1],f[i][j][1]=\min\{f[i+j][k][0]\}+sum[i-1]-sum[i+j-1]\),其中 \(k\leq 2\times j\),前缀 \(\max/\min\) 优化一下就做完了。
但是注意到这个 20 Mib 的 shaber 空间限制,我们还要压一倍空间,我们发现前缀 \(\max/\min\) 那里只关心 \(\lfloor\frac{j+1}{2}\rfloor\) 这种东西,我们可以 \(/2\) 就通过了,因为这个具体转移稍微不一样,不赘述。
UVA1567
当一个题目过于神仙以至于成为论文题的时候就是 gosh 题了。
首先完全没有思路就去爆搜打表,然后发现对于 \(k=1/2\) 在 \(2^i\) 或者 \(fib(i)\) 的位置会寄掉,然后发现自己开始坐牢完全不会做。
正解是要先考虑一下 \(k=1/2\) 的游戏,我们分别说一说:
-
对于 \(k=1\):考虑把 \(n\) 写成一个二进制串,如果 \(n\neq 2^i\),那么拿走最后一个 \(1\),另一方一定会创造出 \(1\) 来,这样子先手无论如何都不会取成 \(0\),所以先手必胜,那么对于 \(n=2^i\) 这样的东西,你先手动了之后后手可以使用上述策略。
-
对于 \(k=2\):一个不显然但容易证明的结论是一个正整数肯定能被 fib 中不相邻的项相加得到,然后注意到 fib 中不相邻的项倍数一定 \(>2\),然后就是跟 \(k=1\) 一致的策略(把 fib 中拿的项当成 01 二进制串。
那么我们拓展一下到 \(k>2\),题解声称我们应该构造一个数列满足前缀可以构造出一个前缀的数且相邻 fib 串串没有相邻位的 \(1\)。
那我们考虑递推出数列 \(a/b\),\(a_i\) 表示数列第 \(i\) 项,\(b_i\) 表示按照上述规则可以用 \(a_1,\dots,a_i\) 可以按照上述规则拼出 \(1,\dots,b_i\),那么首先显然 \(a_i=b_{i-1}+1\),然后考虑用 \(a_i\) 跟一个 \(b_j(k\times a_j<a_i)\) 合并,不难发现这样是最大且都能取到的。
所以我们直接按照 \(k\) 递推出 \(a\),然后如果 \(n\) 在 \(a\) 里面就是 lose,不然就按照上述策略找出 \(01\) 串串最后一个 \(1\) 对应的 \(a_i\) 即可。
P7443
首先原图的胜负态跟 A 的目标一致,那么代价 \(0\) 跑路就行了,不然目标就是最小代价翻转根的胜负态。
我们先明确一下原图怎么 dp,设 \(f(i)\) 表示在 \(i\) 上的点的胜负性,转移就是,如果 \(i\) 能到达 \(f(y)=0\) 那 \(f(x)\) 就是 \(1\),然后我们考虑一下一条什么样的 \((u,v)\) 可以改变根的状态。
首先对于一个 \(f(u)=1\),去连接一个 \(v\) 肯定不能变成 \(f'(u)=0\),所以肯定 \(f(u)=0\),这个情况下,只有 \(f(v)=0\) 能对 \(f(u)\) 产生一个 \(f'(u)\) 变成 \(1\) 的贡献,首先我们肯定是某个败态连接另一个败态,特别的,\(v\) 不能是 \(u\) 的祖先,否则会死循环。
那么考虑一个败态转成胜态什么情况下可以影响 \(f(root)\),首先 \(u\) 的父亲因为 \(f(u)=0\) 一定有 \(f(fa_u)=1\),然后 \(f'(fa_u)=0\),此时跟 \(u\) 同理可以往上手玩,要求形如一条 \(0/1\) 交错的从根开始的链,底下是 \(f(u)=0\),除了树链的底上那一点外别的点的非链上儿子必须是 \(f(son)=1\),此时的 \(x\) 会产生一个 \(val_x+val_y\) 的贡献,其中 \(y\) 是不在链上的最小败态代价。
最后这个东西显然可以 multiset
维护,但是会 tle/mle 什么的,我们直接往上面挂前缀 \(\min\) 和链上 \(\min\) 就行了喵。
CF140E
对着做法捏了个数据范围的感觉,蚌。
首先先 dp 每一行的东西,\(g[i][j]\) 表示 \(i\) 个数分成 \(j\) 个集合相邻属于不同集合的方案数,显然 \(g[i][j]=g[i-1][j-1]+g[i-1][j]\times (j-1)\) 这样子嘛。
然后考虑相邻行的,设 \(f[i][j]\) 表示前 \(i\) 行第 \(i\) 行用了 \(j\) 种颜色的方案数,那么转移也是显然的,下面用 \(\gets\) 表示一个加法的贡献 >w<
-
对于 \(k\neq j\),有 \(f[i][j]\gets f[i-1][k]\times \binom{m}{j}\times (j!)\times g[l_i][j]\)
-
对于 \(k=j\),有 \(f[i][j]\gets f[i-1][k]\times (\binom{m}{j}-1)\times (j!)\times g[l_i][j]\)
我们提前算好 \(sum_i=\sum f[i][j]\) 就可以快速计算上面的东西了,但是读入模数怎么求不了组合数呢,我们可以把 \(j!\) 约掉 \(C\) 的然后变成 \(m\) 的 \(j\) 次下降幂,然后就做完了。
CF1514D
首先区间没有严格众数答案肯定就是 \(1\),否则考虑众数有 \(x\) 个,别的数有 \(y\) 个,这个可以通过主席树/随机化+vector 求出,后者的话要稍微加一点点小剪。
首先 yy 一个放 \(y+1\) 个众数和 \(y\) 个别的数一组然后没放置的众数单个一组,然后 yy 到一个别的配两个众数这种东西感觉很优秀,然后手玩一下发现这两个贡献一样,那么我们 yy 出来了答案就是 \(x-y\),于是我们做完了。
AT_agc059_a
懒得喷,这种题训练价值感觉有限而且非常容易导致写错解然后红温。
乱推 wa 了不知道多少发之后发现可以找规律,对于长度为 \(n\) 的串串,如果 \(n\) 是偶数,答案永远是 \(\frac{n}{2}\),否则答案要不然是 \(\frac{n-1}{2}\) 要不然是 \(\frac{n+1}{2}\),首尾不同的答案稍微好一点嘛,然后就过了。
然后会发现很好暴力证明,暴力敲一个 \(n\) 小的就是子串可以归纳了,蚌。
CF1420E
先做一点转换,\(1\) 隔开的一段段 \(0\) 计数一下,得到 \(val_1,\dots,val_p\) 这种形状的东西,然后一个时刻一次操作形如 \(val_i\gets val_i-1, val_{i+1/i-1}\gets val_{i+1/i-1}+1\) 这样子。
答案可以是总共的减去废物,\(Ans=\frac{1}{2}\times pre\times (pre-1)-\sum \frac{1}{2}\times val_i\times (val_i-1)\) 这样子,不难转化成最小化 \(\sum val_i^2\)
不太能贪心,看到 \(n\leq 80\),我们弄点暴力 dp 呗,比较典了,考虑跟目标序列的前缀和的差分绝对值之和表示时间呗,设状态前两维度肯定得放什么前 \(i\) 个前缀和为 \(j\),然后第三位和答案分别放 \(\sum val_i^2\) 和 时间,都写了看看哪个能优化就哪个嘛。
那么设 \(f[i][j][k]\) 表示前 \(i\) 个数前缀和为 \(j\) 暂时花费了 \(k\) 的时间(准确来说是那个差分,跟实际时间可能有错差别的喵)的最小配对数,显然有 \(f[i][j][k]=\min\{f[i-1][j-\alpha][k-|sum_i-j|]+\alpha^2\}\) 这样子,是一个高贵的 \(O(n^5)\) 做法。
这个显然可以斜率优化到 \(O(n^4\log n)\),但这个 \(n\) 和 \(\log n\) 其实差别不大,直接优化常数真心不一定会更慢,那我们改成刷表,无用的状态直接调掉就过了。
AT_agc052_b
shaber mx 搬错题面硬控我有没有素质?shaber mx 搬错题面硬控我有没有素质?shaber mx 搬错题面硬控我有没有素质?
考虑钦定一个 \(root\),然后给点点权表示到根的异或和,这样子边权就是连接的两个点的异或,嗯,太对了哥。
然后考虑这个操作的意义是什么,不难发现,操作就是交换点权,但是跟根交换整个树会异或一次该边权,额所以问题就变成了判断是否存在一个 \(\Delta\) 使得原树中的距离都 \(\oplus \Delta\) 之后集合跟目标距离集合相同,然后这个 \(\Delta\) 是用 \(w_{i,1}\) 异或可以表示的。
因为抽象后无序所以这个 \(\Delta\) 不好直接求出,但是注意到题目有一个特殊的 \(n\) 是奇数,那所有的异或起来刚好就是 \(\Delta\) 了,知道 \(\Delta\) 之后带进去判断即可。
还有一个问题就是 \(\Delta\) 是否能在原树上被 xor 得出(真的在考场直接扔线性基里看看就行了),其实是肯定可以的,因为注意到肯定有奇数个可以异或出 \(0\),因为根距离为 \(0\)。
P3977
看到数据范围其实就能搞点暴力了,我们状压一行棋子,考虑一个摆放 \(S\),我们预处理出其上/下一行能攻击到的集合是 \(L[S]/R[S]\),本行会不会互相攻击 \(chk[S]\)。
对于一个行集合 \(i\),下一行能转移到集合 \(j\) 的条件就是 \(R[i]\) 不交 \(j\),\(L[j]\) 不交 \(i\),这个矩阵快速幂加速一下就行了。
P8867
首先这个缩点双是显然的,然后假设我们选一个点集 \(S\),边双树上两边都有点的边必须要,大概就是一个最小覆盖的连通块这种形状,然后别的边随便选,我们根据连通块来 dp 方案数。我们预处理出 \(node[]/edge[]\) 表示点双的点数/边双数,\(cn[]/cm[]\) 表示点/边数量的子树和。
我们考虑求出 \(f[x]\) 表示连通块的顶端在 \(x\) 的方案数,然后答案就是 \(\sum f[x]\times 2^{cm[root]-cm[x]}\),现在考虑 \(f[x]\) 怎么转移:
-
\(x\) 上有选点 \(f[x]\gets (2^{node[x]}-1)\times 2^{edge[x]}\times \prod (f[y]+2^{cm[y]+1})\)
-
\(x\) 上没有选点 \(f[x]\gets 2^{edge[x]}\times (\prod (f[y]+2^{cm[y]+1})-\prod 2^{cm[y]+1}-\sum f[y]\times 2^{cm[x]-cm[y]-1-edge[x]})\)
转移的时候注意直接转移的部分先做完再做相互影响的部分。
AT_agc040_c
相邻删除有点像那个 unr t1,相邻删除那对于奇数位的 A/B
做一个反转,然后不难发现条件变成了 \(cnt(A),cnt(B)\leq \frac{n}{2}\)。
枚举放了 \(i\) 个 A
,那么答案就是 \(\sum \binom{n}{i}\times f[n-i]\),其中 \(f[x]\) 表示在 \(x\) 里面选不超过 \(\frac{n}{2}\) 个的方案数,显然 \(f[x]=\sum_{j=0}^x \binom{x}{j}\),这个显然可以递推,\(f[0]=1\),\(f[i]=2\times f[i-1]-\binom{i-1}{\frac{n}{2}}\),然后就做完了 >w<
AT_agc017_c
手玩一下,比较直观的是假设有 \(cnt(x)\) 个 \(x\),就覆盖一个区间 \([x-cnt(x)+1,x]\) 这样子比较能贡献,然后发现交叠的部分怎么样都必须改,答案就是重叠部分的大小,其实也是空白部分的大小,类似莫队地维护就可以啦。