做题记录 26.3.23

\(\textcolor{purple}\odot\) CF241B Friends

\(\{a\}\) 建立 \(\text{Trie}\),二分答案,转化为给定 \(x\)\(M\),求出 \(\text{Trie}\)\(\oplus x >M\) 的数量和它们 \(\oplus x\) 后的和

前者可以拆分为 \(\text{Trie}\)\(O(\log V)\) 个子树,对于后者,在插入时对于每个子树保存一个长度为 \(O(\log V)\) 的桶,每一个数表示子树内当前这一位为 \(1\) 的数量,则容易 \(O(\log V)\) 求出一个子树内全体数 \(\oplus x\) 的和

时间复杂度 \(O(n\log^3 V)\)

代码

将二分部分和在 \(\text{Trie}\) 上扫的过程结合,可以做到 \(O(n\log^2 V)\)

\(\textcolor{purple}\odot\) CF1779G The Game of the Century

最外层三条边首尾相接时显然无需操作(任意一点都可到达边界,都可从边界到达,而边界上任意两点之间可达)

否则显然同时翻转三个给定字符串,交换三者的顺序都不影响答案,假定 \(s_1\)\(s_2\)\(n\) 位为 \(0\)\(s_3\)\(n\) 位为 \(1\)

即下方为右到左,左右两侧为上到下

\(l\)\(s_1\) 后缀 \(0\)\(s_3\) 后缀 \(1\) 数量的较小值,即上方边长为 \(l\) 的正三角形不含从下往上的边,显然必须翻转 \(l\) 条边,不妨设翻转左侧边缘最上方的 \(l\)

左下角同理需要翻转一个前缀,若前缀和后缀需要翻转的长度总和 \(>n\),则显然只需要翻转整个左边缘

以上翻转过程显然是必要的,可证是充分的

容易做到 \(O(n)\)

代码

\(\textcolor{black}\odot\) AT_agc054_d [AGC054D] (ox)

()ox 两部分分开,前者先贪心地调整为匹配的括号串,可证之后两者内部一定不会发生交换

由此可以 \(dp\),令 \(f_{i,j}\) 表示前 \(i\)() 和前 \(j\)ox 的答案

时间复杂度 \(O(n^2)\)

代码

参考

\(\textcolor{black}\odot\) AT_agc057_c [AGC057C] Increment or Xor

存在解的必要条件为 \(\forall 0\le i<2^{n-1}\)\(a_{i+2^{n-1}}\equiv a_i\pmod{2^{n-1}}\)

若此时 \(a_{0\sim 2^{n-1}-1}\) 的最高位都是 \(0\),即 \(a_{0\sim 2^{n-1}-1}\)\(0\sim 2^{n-1}-1\) 的排列,显然只能将所有数异或上 \(a_0\)

否则若 \(a_i\)\(0\le i<2^{n-1}\))最高位为 \(1\),则全体异或 \(\overline{a_i}\) 然后加一即可

于是转化为全局加一,全局异或,单点查询的数据结构问题,容易用 \(\text{Trie}\) 解决

显然操作次数不超过上限

时间复杂度 \(O(n2^n)\)

代码

参考

\(\textcolor{black}\odot\) AT_agc055_d [AGC055D] ABC Ultimatum

对于一个串 \(S\),令 \(a_i\) 表示 \(1\sim i\)A 的数量,同理定义 \(b_i,c_i\)

定理 \(1\):合法的必要条件为 \(\max_i(a_i-c_i)+\max_i(b_i-a_i)+\max_i(c_i-b_i)\le n\)

证明:显然 ABC 的数量 \(\ge\) \(\max_i(a_i-c_i)\),另外两个同理,而 ABCBCACAB 总数量 \(\le n\)

定理 \(2\):以上条件充分

证明:

  • 考虑构造证明
  • \(c_A=\max_i(a_i-c_i)\)\(c_B=\max_i(b_i-a_i)\)\(c_C=\max_i(c_i-b_i)\)
  • 对于第 \(i\)A,取第 \(i+c_B\)B(若 \(i+c_B>n\) 则减去 \(n\),下同),取第 \(i+c_B+c_C\)C,显然在环意义上顺序为 A->B->C,且恰好 \(n\) 个环
  • 即原串可以划分为 \(n\)ABCBCACAB

容易做到 \(O(n^6)\)

代码

参考

NFLS #35479. 永久集市

枚举每条链,若终止状态需要的 B 数量少于当前有的 B 的数量,则将多余的 A 移到链顶端,反之移动 B,所有链都处理后跨越中间点交换每个链链首多余部分,最后在链内部交换

容易做到 \(O(nm)\)

代码

更方便的算法为枚举每条边,删去这条边后存在两个连通块,计算其中一侧初始状态和终止状态 B 数量的差值的绝对值,最后累加,时间复杂度 \(O(nm)\)

NFLS #35481. 海上的小船

对于每一种出现两次的,设两次分别在 \(u,v\),以 \(u-v\) 的链上某条边为根,子树 \(u\) 到子树 \(v\) 的所有路径都不合法,放到 \(\text{DFN}\) 序上,是 \(O(1)\) 个区间对

转化为若干次矩形覆盖,最后查询没有覆盖的数量,容易扫描线做到 \(O(n\log n)\)

代码

NFLS #35480. 记分板

枚举第一名为 \(i>1\),检查是否可行

\(1\)\(i\) 同时通过的题目放到最前面,对于其它人若在这些题中存在没有通过的,则字典序必然小于 \(1\)\(i\),从而可以忽略它们

接下来为了保证 \(1\) 小于 \(i\),紧跟的题目需要满足 \(1\) 没有通过而 \(i\) 通过,且前面剩余的人(即和 \(1\)\(i\) 一样通过了前面所有题)必须都不通过这一题,否则它们的字典序大于 \(1\) 而不合法

还需要存在一题 \(1\) 通过而这些人没有通过,将这一题紧跟在后面,若不存在这样一题则无解(除非不存在剩余的其它人)

容易用 bitset 做到 \(O(\sum \frac{(n+m)nm}\omega)\)

代码

NFLS #35482. 冷藏仓储

假设到一个位置后将那个位置目前所有的都拿到手上,要跨越时再留下一部分

\(dp_{l,r,0/1}\) 表示到达过 \([l,r]\),目前在 \(l/r\),要达到 \([1,n]\) 的情况下,手上至少要多少

对于一组询问 \((x,y)\),显然可以达到当且仅当 \(\min(dp_{x,x,0},dp_{x,x,1})\le y+f_x\)

边界为 \(dp_{1,n,0/1}=0\),考虑如何转移

只考虑 \(dp_{l,r,0}\)\(dp_{l,r,1}\) 对称)

若向左,则

\[dp_{l,r,0}\gets h_{l-1}+\max(0,dp_{l-1,r,0}-f_{l-1}) \]

若向右到 \(r\),变为 \(dp_{l,r,1}\),则

\[dp_{l,r,0}\gets \max(\cdots\max(\max(dp_{l,r,1}-h_{r-1})+h_{r-1}-h_{r-2})+h_{r-2}-\cdots-h_l)+h_l \]

化简后第二个转移只和 \(h\) 的区间 \(\max\) 有关,可以做到 \(O(n^2)\)

注意访问连续性

代码

参考

\(\textcolor{black}\odot\) AT_agc060_e [AGC060E] Number of Cycles

定理 \(1\):存在解的 \(k\) 的上界为 \(n+f(a)\),对应的 \(x_i=i\)

证明:

  • 若存在 \(x_i\ne i\),则交换 \(x_i\)\(x_{x_i}\) 后,\(f(x)\) 加一,\(f(y)\) 至多减一,\(k\) 不降
  • 反复操作,直到 \(x_i=i\),则 \(k\) 达到上界

定理 \(2\):合法的 \(k\) 必须和上界 \(n+f(a)\) 奇偶性相同

证明:

  • 对于任意一组合法的 \(x\),交换 \(x_i\)\(x_j\) 后,\(f(x)\)\(f(y)\) 分别 \(+1\)\(-1\),从而总和不变,\(+2\)\(-2\),即奇偶性不变

先令 \(x_i=i\),考虑不断调整之使得 \(k\) 下降到满足要求

枚举 \(a\) 的每个置换环,依次记录编号得到序列 \(p_{1\sim n}\)

\(2\)\(n\) 枚举 \(i\),要将 \(x\)\(p_{1\sim i}\) 连成一个环,\(y\)\(p_{1\sim i}\) 连成不超过 \(2\) 个环(具体取决于 \(k\) 的奇偶性),令 \(l\) 表示 \(y\)\(p_{1\sim i}\) 中和 \(p_1\) 不在同一环的某个点(若不存在则为 \(0\)),考虑如何处理 \(i\)

\(y\)\(p_{i-1}\)\(p_{i}\) 不属于同一个环,则交换 \(x_{p_{i-1}}\)\(x_{p_i}\)\(l\) 不变,\(k\)\(2\)

\(y\)\(p_{i-1}\)\(p_i\) 在同一个环中,且 \(l\ne 0\),则交换 \(x_l\)\(x_{p_i}\)\(l\gets 0\)\(k\)\(2\)

否则 \(l\gets p_i\),交换 \(x_{p_1}\)\(x_{p_i}\)\(k\) 不变

此过程中 \(k\) 的变化在其取值范围上是连续的,满足要求时退出

容易做到 \(O(n)\)

代码

参考

posted @ 2026-03-24 06:45  Hstry  阅读(1)  评论(0)    收藏  举报