ARC&AGC
ARC 部分一般会跳过 difficulty \(\geq 3200\) 的题。
ARC208
20251012
A,B 略。
ARC208 C
有意思数学题。
考虑若存在 \(n<C\),那么 \(n_0=X\operatorname{xor}C\) 一定是一个解。
考虑 \(\operatorname{highbit}(C)=2^k\)。如果 \(\operatorname{highbit}(n)\leq k\),那么 \(X<2^k\),所以 \(n_0>X\)。这里 \(2^k\leq n<2^{k+1}\) 时,注意到 \(n\operatorname{xor}C<2^k\)。
于是考虑 \(n>C\)。此时 \(n\operatorname{xor}C<2n\)。分类讨论:
- \(X=n\operatorname{xor}C<n\)
- 判断一下是否满足要求。
- \(X=n\operatorname{xor}C-n\)
- 此时 \(X=n+C-2(n\operatorname{and}C)-n\)。
- 于是 \(m=\frac{C-X}{2}=n\operatorname{and}C\)。
- 于是判断是否 \(m\subseteq C\)。如果是,那么为了满足 \(n>C\),构造 \(n=m+2^{50}\)。
ARC208 D $^?$
这种构造到底是怎么想出来的。完全没有头猪啊。特别是 \(n\) 是偶数。
我们观察到,如果矩阵 \(a(i,j)\) 是满足要求的,那么对于任意排列 \(p\),对下标做置换的 \(a(p(i),p(j))\) 满足要求。
于是直接构造 \(a(i,j)=(i+j-1)\bmod n+1\),然后可以找到一个排列 \(p\)。
当然,还有一种做法是(赛时想法),把矩阵表示为 \((i,j,a(i,j))\) 的 \(n^2\) 个三元组,然后变成构造 \((i,a(i,j),j)\)。通过一些奇妙思考构造。
然后是 \(n\) 是偶数。存在一种较为直接的思考是 @FFToroto 的完全图边染色。
然后这里复述一下官方题解的做法:
ARC207
20251005
ARC207 A
dp。考虑从前到后填数。
注意到一个匹配的贡献只和两端点有关,所以我们贡献提前计算。
设 \(f(i,j,k)\) 表示 dp 到第 \(i\) 次,前面有 \(j\) 次还没匹配,总贡献为 \(k\) 的方案数。
然后枚举第 \(i\) 次是 \(a<i,a=i,a>i\) 向 \(i\) 匹配。
对于 \(a=i\) 向 \(>i\) 的位置匹配,一种做法是直接枚举个数。
但是注意到方案数其实可以分步 dp 求解。也就是类似完全背包。
复杂度 \(O(n^4)\) 或 \(O(n^5)\)。
细节调了半个小时。
ARC207 B
构造。考虑如下构造思路:
对于点 \(i\),让 \(i\) 两步之内到达除了 \(n+1-i\) 之外的所有点。
\(S=\{i|i\in[1,\frac{n}{2}]\},T=\{i|i\in(\frac{n}{2},n]\}\)。
然后 \(i\in S,j\in T,i+j\neq n+1\) 连边 \((i,j)\)。
ARC207 C
3log 暴力:注意到对于固定的 \(r\),\([l,r]\) 的区间或只有 \(O(\log V)\) 种。
所以 dp 有 \(f(i,j)\) 表示 dp 到 \(i\),区间或的 popcount=j 的答案。
然后转移是一个二维数点。直接在线做是 \(O(n\log^2n\log V)\)。
离线扫描线少一个 \(\log\)。
注意 popcount 可以到 \(30\) 而不是 \(29\)。。
\(O(n\log V)\) 做法。可以改计数(CF2038 D)。
直接用数据结构找上一段的结尾在哪里还是太奢侈了。考虑分步 dp。
注意到固定 \(l\),段的按位或的不同个数只有 \(O(\log V)\) 个,因为 不同按位或的 popcount 也是不同的 所以一共 \(O(\log)\) 个。固定 \(r\) 同理。
所以我们维护:\(f(i,j)\) 表示最后一段的右端点是 \(i\),\(v(i,j)\) 表示以 \(i\) 为右端点,popcount=j 的段的 \(\text{OR}\) 值(根据上文,是唯一的)。
然后转移的时候,只要找到左端点是 \(i+1\) 的,第一个按位或比 \(v(i,j)\) 大的段进行转移。
有点绕。换句话说就是:
令 \(\text{OR}[l,r]\) 表示 \(a_l\operatorname{OR}a_{l+1}\cdots \operatorname{OR}a_r\)。
\(f(i,j)\) 向 \(f(k,w)\) 转移,其中 \(k>i,\text{OR}[i+1,k-1]<v(i,j)\leq \text{OR}[i+1,k]\) 且 \(w=\text{popcount}(\text{OR}[i+1,k])\)。
这样每个状态只有 \(\leq 1\) 次转移,只要精细实现就是 \(O(n\log V)\) 的。
然后考虑不开新段的转移。那么有 \(f(i,j)\to f(i+1,\operatorname{popcount}(j\operatorname{OR}a_{i+1}))\)。
于是复杂度就是 \(O(n\log V)\) 的。
精细实现的细节:预处理出 \(L(i)\) 表示固定 \(l=i\) 的段,每个按位或值的,第一个右端点集合。然后在转移的时候双指针即可。因为 popcount 更大的,(在这里)按位或值显然更大。
ARC207 D
二者称为 A,B。
首先有结论:A,B 都只会尽可能平衡的切,也就是最后留下的一定是中心部分。
于是我们直接忽略两侧的行列,只保留中间的 \(O(1)\) 行列,然后直接做 dp 即可。复杂度 \(O(\sum nm)\)。
稍微说明一下。我们考虑当前先手切了一刀,后手要跟一刀:
- 如果后手想要把最后的位置往两侧偏,意味着这样做可以让后手反败为胜:
- 如果先手阻止(切对侧),那么是无法完成的。
- 否则不阻止,意味着先手认为这样切可以反败为胜,那么矛盾。
- 反之同理。
如果最后的几步分析不清楚,那么我们只要注意到,最后剩下的位置不会偏出中间的三行三列,于是最后剩三行三列的时候跑 dp。
更细节的分析:
我们想要把所有情况归纳到 \(n,m\) 奇偶不同的情况。
\(n=m=1\) 判掉。
考虑 \(n,m\) 同奇偶的情况,此时枚举先手四种操作,然后递归下去变为 \(n,m\) 奇偶不同。
假设此时 \(n\) 奇 \(m\) 偶。
首先一定不会偏出中间三行。
考虑博弈过程:
对于最后所在的列,根据结论,一定是最中间两列。
如果 B 操作到中间上面一行,那么 A 只要第一次操作第一行即可。
如果 B 操作到中间下面一行,那么 A 只要第一次操作最后一行即可。
于是:
-
如果中间一行的中间两个位置有草莓,那么 A 一定可以通过先切左右拿到。
-
否则,如果存在一列,中间上面一行和下面一行都有草莓,那么 A 同样可以通过先切左右拿到。
否则 A 无法胜利。因为 B 可以通过操作(对称切)把局面变回 A 仍然无法胜利的局面。
ARC206
20250922
A,B 略。
ARC206 C
好难绷啊。。
考虑任意一个位置的指向。考虑 \(a_x=y\)。我们考虑最小的限制: 这样比较方便观察性质。
对于长度为 \(2\) 的限制,我们发现如果 \(|x-y|\neq 1\),那么,有 \(i<x,a_i=i+1\) 且 \(i>x,a_i=i-1\)。
所以全局最多有一个 \(|x-y|\neq 1\) 的情况。我们枚举这个位置。
否则我们枚举 \(a_i=i+1\) 和 \(a_i=i-1\) 的交界位置。
赛时我一开始在想什么???在想最后树的结构长什么样,甚至在想括号匹配,一点没考虑固定一个位置的限制,从小的限制出发确定 \(a\) 的状态。
ARC206 D
平凡构造是 \(k,1,\cdots k-1,k+1,\cdots,n\)。
然后考虑 \(k=0\) 当且仅当 \(n\geq 8\)。
然后 \(k=1\) 当且仅当 \(n\geq 5\)。
随便构造。
~ ARC206 E
ARC205
20250907
ARC205 A
首先有一个操作上界是第一步可以操作的方案数,然后我们发现,一定可以构造出这样的方案,然后做完了。
ARC205 B
仍然是考虑上界,一个点的黑色邻边和一开始的奇偶性必须相同。然后考虑在此限制上取到上界,我们发现一定可以通过调整法调整非上界的情况。
ARC205 C
显然合法当且仅当不同方向的段不交,并且同方向的段不包含。
一个简单的判断的方法是,按照 \(s\) 排序,要求 \(t\) 递增。
然后两个方向分别标号,做完了。
ARC205 D
dp 或者贪心。
考虑 \(f(x)\) 表示 \(x\) 子树内最多匹配,然后如果有一个子树的剩余点数超过其他的剩余和,那么需要拆掉其他子树的匹配来做。
ARC205 E
meet in the middle。对低 \(10\) 位暴力更新前缀和,高 \(10\) 位查询的时候再暴力枚举子集。
ARC204
20250908
ARC204 A
考虑这样操作有取 \(\max(C,\cdots)\) 的,我们可以枚举最后一次取到 \(C\) 的操作,这样最终的值可以表示为 \(\max_i v_i\),\(v_i\) 表示第 \(i\) 个操作取到 \(C\),之后都不考虑对 \(C\) 取 \(\max\) 的答案。
做一个差分,答案是 \(F(R)-F(l-1)\)。
\(F(R)\) 表示 \(\max_i v_i\leq R\) 的方案数。可以 dp,设 \(f(i,j)\) 表示 dp 到 \(a_i\),加入到了 \(b_j(j\leq i)\),\(\max_{k\leq i}v_k\leq R\) 的方案数。
然后转移就是 \(f(i,j)\to f(i+1,j)\) 以及 \(f(i,j)\to f(i,j+1)\)。
ARC204 B
考虑对置换环 dp,然后考虑设 \(f(l,r)\) 表示当前环是原环 \([l,r]\) 部分的点。注意到一定存在一次操作,其端点是 \(l\) 或 \(r\)。所以枚举另一点 \(k\)。
然后有转移 \(f(l,r)=f(l,k-1)+f(k,r)+[a_l\equiv a_k\pmod n]\)。
但是复杂度 \(O(n^3k^3)\),过不了。
然后注意到,我们其实只要枚举 \(a_l\equiv a_k\pmod n\) 的 \(k\),以及 \(k=l+1,k=r\) 的情况就可以覆盖所有答案了。
因为一个没有贡献的操作是不急于做的,完全可以(通过 \(k=l+1,r\) 缩小边界)把机会让给有贡献的操作。
~ ARC204 C
ARC203
20250909
ARC203 A
注意到最优策略是,每组选一半人都赢,一半都输,然后注意 \(m\in\text{odd}\) 的时候还可以有一个赢。所以答案是 \(n\lfloor\frac{m}{2}\rfloor+[m\in\text{odd}]\)。
ARC203 B
考虑如果有 \(>1\) 个 \(1\),那么 \(0\) 可以随便移动,所以只要 \(1\) 的个数相同就行了。
如果有恰好 \(1\) 个 \(1\),那么如果 \(1\) 在两端点,那么无法移动。特判一下。
ARC203 C
\(k< n+m\) 是简单的。
考虑 \(k=n+m\),分类讨论:
- 一条长度为 \(n+m-2\) 的路径,随便打穿其他两堵墙,方案数 \(\binom{n+m-2}{n-1}\binom{n(m-1)+(n-1)m-(n+m-2)}{2}\)。
- 去除一个格子四周都被打穿的方案数(被算了两遍),枚举这个格子,有 \(\binom{n+m-4}{n-2}(n+m-3)\)。
- 考虑打穿长度为 \(n+m\) 路径的情况。
发现路径一定是有恰好一次向左或向上。然后考虑向左的情况。
这个向左操作的上一次和下一次操作都要是向下,所以我们先不考虑这个,这样路径方案数是 \(\binom{n+m-4}{n-3}\),然后插入这个“下左下”的方案数,要求后面必须有一个向右的操作,所以方案数是 \((m-1)\binom{n+m-4}{n-3}\)。
所以答案是 \(\binom{n+m-2}{n-1}\binom{n(m-1)+(n-1)m-(n+m-2)}{2}-\binom{n+m-4}{n-2}(n+m-3)+(m-1)\binom{n+m-4}{n-3}+(n-1)\binom{n+m-4}{m-3}\)。
ARC203 D
只考虑 \(n>2\),至少有 \(1\) 个 \(0\) 的情况。
考虑 \(00\) 段最后只能变成 \(0\dots 0\),并且其他段无法变成全零段。
如果不存在 \(0\dots 0\) 段,可以简单分类讨论两侧的数:
- \(0\{0,1\}^*0\),此时一定有 \(B=010\)。
- \(0\{0,1\}^*1\),有 \(B=01\)。
- \(1\{0,1\}^*0\),有 \(B=10\)。
- \(1\{0,1\}^*1\),有 \(B=11\)。
所以我们先找到 \(A\) 中长度大于 \(1\) 全零的段,然后以这个分子情况考虑,发现两个这样的段中间填一个 \(1\) 就可以构造出来,设 \(c\) 是长度大于 \(1\) 全零的段的个数,中间的方案数是 \(3c-1\)。
然后考虑左右两侧,讨论是类似的:
对于左侧不是全零段:
- \(a_1=0\),那么 \(B_L=01\)。
- \(a_1=1\),那么 \(B_L=1\)。
右侧同理。
设 \(vL,vR\) 表示左右端点是否不是全零段。
也就是答案是 \(3c-1+[vL] (1+[a_1=0])+[vR] (1+[a_n=0])\)。
ARC202
20250911
ARC202 A
一种做法是贪心选择“谷”向两侧合并。用链表维护。
写起来比较麻烦。考虑这个东西可以这样维护:加入右侧一个位置,考虑左侧会怎么合并。
如果让左侧形成了一个“谷”,那么需要把左侧合并到某一边。考虑单调栈维护递减序列,然后考虑左侧(栈顶 \(p\))和其左侧(次栈顶 \(t\))和右侧(当前位置 \(v\))的大小关系。
如果 \(t\leq v\),那么把 \(p\) 合并到 \(t\)。注意是 \(\leq\),因为我们要贪心地合并。
否则 \(p\) 合并到 \(v\)。
相应的修改 \(t,v\)。复杂度 \(O(n)\)。
ARC202 B
把竖直方向一次跳两步看做跳一步,答案不变。考虑对于 \(m\bmod 2=1\) 的情况,注意到如果我们确定了前 \(n\) 步,那么对于每一行,转移已经确定。
所以此时,我们枚举前 \(n\) 步有多少个向右走的,然后简单组合数。
对于 \(m\bmod 2=0\) 的情况,注意到如果我们确定了前 \(2n\) 步,那么对于每一行,转移已经确定。
同理枚举。
ARC202 C
设 \(\displaystyle R_x=\frac{10^x-1}{9}\),则有性质 \(\gcd(R_x,R_y)=R_{\gcd(x,y)}\)。
于是我们要求的就是 \(\text{lcm}(a_1,\cdots a_m)\)。
有 \(\gcd-\text{lcm}\) 容斥:\(\text{lcm }S=\prod_{T\subseteq S\neq\varnothing}(\gcd T)^{(-1)^{|T|-1}}\)。
于是我们每次加入一个 \(v\),我们需要求出 \(\prod_{v\in T}(\gcd T)^{(-1)^{|T|-1}}\)。
这可以通过记录 \(c_i\) 表示 \(\gcd T=i\) 的 \(T\) 的个数进行递推。
那么我们要求出 \(\Delta c_k,k|v\)。考虑求出 \(d_k=\sum_{k|i}c_i\),然后 \(\Delta c_k\) 可以递推求出。
那么我们在更新 \(c_k\gets c_k+\Delta c_k\) 时,顺便更新 \(d_i\gets d_i+\Delta c_k,i|k\)。
复杂度 \(O(n\log^2 n)\)。
ARC202 D
考虑两维分开。
枚举两维不移动的次数 \(x,y\),那么方案数 \(\binom{t}{x}\binom{t-x}{y}X(x)Y(y)\)。
考虑 \(X(x)\) 表示移动 \(t-x\) 次,不越过 \(1,n\) 的方案数。
这是经典的双线反射容斥,可以 \(O(\frac{t}{n})\) 解决单次。
然后做一个卷积得到 \(\displaystyle A_i=\sum_{x=0}^i\dfrac{X(x)}{x!}\dfrac{Y(i-x)}{(i-x)!}\)。答案就是 \(t!\sum_i A_i(t-i)!\)。
然后这个复杂度是 \(O(\frac{t^2}{n})\),所以当 \(n\leq \sqrt t\) 的时候要拼一个 \(O(tn)\) 的暴力 dp。
所以平衡一下,复杂度是 \(O(n^{1.5})\)。
ARC201
ARC201 A
首先分类讨论。
- \(b\geq a+c\),那么一定都能选上。
- \(b<a+c\),那么先假设 \(a\) 能选多少选多少,可以选择 \(d=\min(a,b)\) 个,然后 \(c\) 可以选 \(d2=\min(b-d,c)\) 个。然后有 \(\min(d,c-d2)\) 个可以从 \(a\to c\)。
然后得出这么选当前有 \(sa\) 个 \(a\),\(sc\) 个 \(c\)。然后根据 \(\sum \min(d,c-d2)\) 分类讨论。
ARC201 B
考虑从大到小不好考虑,所以从低位到高位这样没有后效性。
然后如果当前位 \(d\) 是 \(1\),那么需要选择一个。在枚举更大的一位 \(d+1\) 的时候,需要把大小为 \(2^d\) 的贪心合并为 \(2^{d+1}\)。
~ ARC201 C
~ ARC201 D
ARC201 E $^?$
考虑拆贡献。
然后有贡献 \((r-l)(d-u)\),那么拆成 \(rd-ru-ld+lu\)。
然后这些个东西随便线段树维护一下。
ARC200
~ ARC200 A
~ ARC200 B
~ ARC200 C
~ ARC200 D
~ ARC200 E
ARC199
~ ARC199 A
~ ARC199 B
~ ARC199 C
ARC198
A 略。
~ ARC198 B
~ ARC198 C
AGC001
20250910
A,B,C 略。
~ AGC001 D
~ AGC001 E
~ AGC001 F
AGC002
20250912
A,B,C 略。
~ AGC002 D
~ AGC002 E
~ AGC002 F
AGC003
20250918~20250919
A,B,C 略。
~ AGC003 D
~ AGC003 E
~ AGC003 F
AGC004
20250928~20250930
A,B,C 略。
AGC004 D
有点坑。
需要注意到的是,如果 \(a_1\neq 1\),那么 \(1\) 或 \(a_1\) 走 \(k\) 步一定有一个 \(\neq 1\)。
所以 \(a_1=1\)。然后对于其他的,贪心做。
具体地,dfs 回溯的时候,如果子树深度 \(=k-1\),那么把 \(a\) 变为 \(1\),并且丢弃该子树。
~ AGC004 E $^?$
~ AGC004 F $^?$
AGC005
20250930~20251002
A,B,C 略。
* AGC005 D
直接计数不好做。考虑容斥。
考虑按照 \(\bmod 2k\) 分组。对于组内的元素,枚举有多少个 \(a_i=i\pm k\),这样的方案数是可以直接组合数计算的。
然后背包一下做完了。
注意到复杂度瓶颈在于背包。。所以可以上 NTT 加速。
AGC005 E $^?$
好难的题。
设红方是抓捕的一方,蓝方反之。
注意到无解,当且仅当蓝方可以跑到一条蓝边,使得边的端点在红树上距离 \(\geq 3\)。
所以先不妨假设蓝边在红树上距离 \(\leq 2\)。我们注意到一个重要性质是,此时蓝方跑不出红方的子树。
于是问题变成,这样的情况下蓝方最多走几步。这是简单的。
然后判断无解就是看是否存在一条路径使得终点是满足要求的蓝边,同时路径上红方都无法先于蓝方到达。
AGC005 F
考虑拆贡献,那么我们只关心一条边的贡献。
一条边的贡献就是两侧都有被选中的点的方案数 \(\binom{n}{k}-\binom{sz}{k}-\binom{n-sz}{k}\)。
然后可以简单得到平方暴力。随便卷积优化一下。
AGC006
20251006~20251009
A,B 略。
AGC006 C
首先,根据期望的线性性,同时我们的操作只有加减,所以我们只要对期望做对称即可。
也就是 \(E(a_i)=E(a_{i-1})+E(a_{i+1})-2E(a_i)\)。
然后看到这个式子,就应该意识到,做差分,那么意味着交换了 \(E(a_i)-E(a_i-1)\) 和 \(E(a_{i+1})-E(a_i)\) 这两个差分。
然后一切都简单了。使用倍增维护这个交换的操作的结果。
* AGC006 D
注意到答案具有可二分性。假设二分答案 \(x\),那么把 \(\leq x\) 的置为 \(1\),\(>x\) 的为 \(0\),那么如果最上面的是 \(1\),则答案 \(\leq x\)。
对于只有 \(0,1\) 的情况,是好做的。只要找到中心两侧最近的 \(a_i=a_{i+1}\) 的位置即可。
AGC006 E
注意到列之间是独立的,所以我们可以看做是一个序列 \(a\),每次选择 \(i\),交换 \(a_{i-1},a_{i+1}\),并且让 \(a_{i-1},a_i,a_{i+1}\) 取反。问是否可以变为 \(1\cdots n\)。
这里 \(a_i=kj(k\in\{-1,1\},j\in[1,n])\) 表示 \(i\) 列包含了 \(3j-2,3j-1,3j\),如果 \(k=-1\),则被翻转了。
例如 \(a=1\) 表示从上到下 \(1,2,3\),\(a=-2\) 表示从上到下 \(6,5,4\)。
然后我们发现,如果操作 \(i\),那么会让 \(a_j(j\equiv i\pmod 2)\) 的负号个数的奇偶性变化,并且会让 \(a_j(j\not\equiv i\pmod 2)\) 构成的序列的逆序对数奇偶性变化。
于是我们可以得出合法的必要条件是,两个序列 \(b,c\) 的逆序对数的奇偶性和 \(c,b\) 的负号个数的奇偶性相同。
然后打表发现这个条件是充要的。做完了。
构造证明:先通过操作把 \(c\) 序列的负号去掉,然后通过:
操作 \(([i-2,i],[i,i+2])\times 3\) 这六次,可以把 \(i-1,i+1\) 这两列取反。
这样不改变负号奇偶性,同时显然可以把任意偶数个负号全部去掉。
AGC006 F $^?$
观察到,\((x,y)(y,z)\to(z,x)\),形成了一个三元环。
看到关键是 \(k\) 元环(或者边相关的限制),这样可以考虑给图 \(k\) 染色。
然后观察可得:
- 如果一个弱连通块里面无法三染色,那么弱连通块会成为完全图。
- 如果弱连通块存在三种颜色,并且成功染色,那么最后每种颜色之间都是满连接的。
- 否则不变。
AGC007
20251007~
A,B 略。
AGC007 C $^?$
很难吧。。
观察到:这个操作是对称的,所以对称的边的期望是相同的。
于是对称的边的权值可以平均一下。这样我们发现所有边的权值都是一样的了。
然后考虑一次操作的影响。
称从左到右第 \(i\) 条边为第 \(i\) 条边。
我们考虑第一次操作:
对于第 \(i\) 条边,若当前长度为 \(d\),有 \(\frac{1}{2n}\) 的概率使操作后的第 \(i\) 条边的长度变为 \(3d\)。
观察一下,这样第 \(i\) 条边的期望长度是 \(\frac{3d}{2n}+\frac{(n-1)d}{2n}=\frac{n+1}{n}d\)。
于是做完了。。因为这样每条边只是乘了一个 \(\frac{n+1}{n}\),仍然保持等差数列的性质。
于是模拟 \(n\) 次操作,每次把期望乘上 \(\frac{n+1}{n}\),答案加上期望即可。
AGC007 D
注意到肯定是分成一些 \([l_i,r_i]\) 段。然后路线形如 \(l_1\to r_1\to l_1\to r_2\to l_2\to \cdots\to l_{m-1}\to r_m\to l_m\to E\)。
然后有转移 \(f_i=\max_j f_j+a_i-a_j+\max(2(a_i-a_{j+1}),T)\)。
因为 \(\sum a_i-a_j=E\),所以留到最后加上。
然后 \(f_i=\max_j f_j+\max(2(a_i-a_{j+1}),T)\)。
然后显然 \(j\) 分成两段转移,前面是 \(2(a_i-a_{j+1})\),后面是 \(T\)。
双指针维护。复杂度线性。
AGC007 E
先无脑二分。
考虑直接 dp,有 \(f(x,i)=j\) 表示 \(x\) 到子树内第一个叶子的距离为 \(i\) 的时候,从最后一个叶子到 \(x\) 最短距离是 \(j\)。
然后考虑转移。设 \(x\) 的两个儿子的 dp 是 \(g=f(ls),h=f(rs),vl=a_{ls},vr=a_{rs}\)。
那么有转移 \(f(x+vl)\gets h(g(x)+vl+vr)+vr\quad(g(x)+vl+vr\leq lim)\)。
\(g,h\) 交换类似。
然后我们发现,对于叶子,有效的 dp 值只有 \(f(x,0)=0\),然后每次向父亲转移,只会转移 \(|g|+|h|\) 的大小。看起来复杂度不对。
但是注意到,如果 \(|g|>|h|\),那么一定有多个 \(g\) 对应到同一个有效的 \(h\),这样有很多不同的 \(f(x+vl)\) 的值都是一样的。我们只要保存最小的就好了。
注意到二分值域是 \(O(V\log n)\)。
于是复杂度是 \(O(n\log n\log V\log\log n)\)。
AGC007 F
还挺好想。
考虑贪心。显然是 \(s\) 上的字符顺序不变的映射到 \(t\) 的一段(可以为空)上。
于是我们维护 \(s\) 每个映射到非空段的字符的包线。也就是贪心地走,每行最右可以走到哪里。
记第 \(i\) 行为 \(pos_i\),那么加入一个新字符,我们发现 \(pos_i\gets pos_{i-1}-1\)。
以及如果操作前,\(pos_{lst}\leq r\),那么就应该新增一段。
这样暴力是 \(O(n^2)\) 的。然后全局操作 shift,decrease 可以打 tag。于是是优化到线性。
或者注意到我们只要维护和之前不一样的 pos,于是我们不断弹出 pos 的尾部。同时只可能在首部插入新的 pos。于是只要维护 dec 的 tag。比较好写。
AGC008
20251009~20251012
A,B,C,D 略。
AGC008 E $^?$
考虑 \(i\) 向 \(a_i\) 连边。图形成一个基环树森林。
我们考虑从 \(p\) 倒推 \(a\)。
先考虑如果连通块是一个环,分奇偶讨论:
首先都可以有 \(p_i=a_i\)。
- 奇环,那么若 \(p_{p_i}=a_i\),则 \(a_i\) 是和 \(p_i\) 置换环大小相同的一个奇环。
- 偶环,那么若 \(p_{p_i}=a_i\),则 \(a_i\) 是两个大小相同的,是 \(p_i\) 置换环一半的两个环。这里可能要稍微组合数一下。
然后是不是环的基环树:
考虑一个 \(p\) 的置换环,我们发现如果 \(p\) 有的是 \(p_{p_i}=a_i\),有的是 \(p_i=a_i\),我们发现 \(a\) 是一个内向基环树,并且环上子树都是链。
于是考虑这样的基环树怎么构造出 \(p\)。我们发现奇环树的一条链,对于链上第一个点是 \(a_i=p_i\) 还是 \(a_i=p_{p_i}\),可以有两种填法,而链上后面的点只能是 \(a_i=p_{p_i}\)。
当然也可能这条链比较长,第一个点只能是 \(a_i=p_i\)。或者更长的情况就无解。
然后乘起来就好了。
AGC008 F
有意思题。
假设都是关键点。考虑把一种染色情况唯一表示为 \((x,d)\)。
我们考虑定了一个根,对于父亲的 \((f,d)\),如果 \(d\) 比某个儿子 \(x\) 的 \(dep_x\) 大,也就是完全覆盖了 \(x\) 的子树,那么也可以表示为 \((x,d+1)\)。
为了唯一表示,我们不妨优先表示为更靠叶子的点的组合。
所以要求 \((f,d)\) 的 \(d\) 要比 \(\min_{i\in son(f)}dep_i\) 小。
这是好算的。但是有个问题。对于一个点,可能还没填满子树,先把子树外的全填满了。这当然也会算重。怎么办。
考虑以直径中点为根即可。
如果有不是关键点的,类似讨论。
同样结论的,还有:
把一个染色情况,作为 \(d\) 最小的对的贡献。
设 \(f_i,g_i\) 为以 \(i\) 为根的最深子树,次深子树,则答案为 \(\sum \min(f_i-1,g_i+1)+1\)。
如果有不是关键点的,那么还存在一个下界。也是稍微推一下。
AGC009
20251013~20251015
A,B 略。
~ AGC009 C
~ AGC009 D
~ AGC009 E
很麻烦的构造。
AGC010
20251015~20251020
A,B 略。
~ AGC010 C
~ AGC010 D $^?$
~ AGC010 E $^?$
AGC011
20251017~20251022
A,B 略。
~ AGC011 C $^?$
~ AGC011 D
~ AGC011 E $^?$
~ AGC011 F $^?$
AGC012
20251017~20251022
A,B 略。
AGC012 C
刚做完 agc074c。考虑归纳构造的思路。
首先一个重要的观察是:对于序列 1 2 ... n 1 2 ... n,贡献是 \(2^n\)。
观察发现,一个贡献一定是形如 \(AA\),其中 \(A\) 是 1 2 ... n 的子序列。
进一步的,固定后缀是 1 2 ... n,在后缀的前方加入 \(n\),可以把问题递归到 \(\frac{N-1}{2}\),加入 \(1\),则可以把问题递归到 \(N-1\)。
所以需要用到的数只有 \(O(\log A)\) 个。
AGC012 D
显然不同颜色之间交换,只有按重量排序后的一段前缀可以交换。并且这些点可交换关系是团。
构造就是让全局重量最小的球做工具进行交换。
要注意的就是,\((c,w)\) 可以和其他颜色交换,要么满足 \(w+mnw_c\leq X\),要么满足 \(w+\min_{i\neq c} mnw_i\leq Y\)。否则无法交换。
AGC012 E $^?$
首先一个显然的 dp 是,\(f(i,S)\) 表示 dp 到 \(a_i\),使用了 \(S\) 中的,是否可行。然后不会了。
首先套路的,因为 \(f\) 表示的是可行性,考虑找到某一维的单调性,变成最优化以减少一维。
我们发现,把 \(i\) 这一维去掉,变成 \(f(S)\) 可以到达的最大 \(i\)!!怎么我没有想到??
然后闭着眼睛做。
AGC012 F $^!$
好牛啊啊啊。不会就是不会。
假设 \(a\) 不同。首先倒着考虑。
然后观察性质,发现如果后面有 \(a_i,a_{i-1}\) 这一段,那么对于 \(j<i-1,a_j\leq \min(a_i,a_{i-1})\) 或 \(a_j\geq \max(a_i,a_{i-1})\)。也就是路径不会再走进之前跳过的区间内。
这种优秀的结构,启发我们这样设计 dp:令 \(f(i,l,r)\) 表示 dp 到 \(i\),左右两侧有 \(l,r\) 个位置可以走的方案数。
dp 状态显然是不重的。然后最重要的是:我们发现,对于第 \(i\) 个位置,其可达区间是 \([i+1,2n-i-1]\)。同时,对于任意一个 \(f(i,l,r)\),只要 \(l\neq 0(r\neq 0)\) 一定可以构造出下一步到达可达区间端点的方案。
不知道这一步到底是怎么想到的。。
也就是,转移是 \(f(i,l,r)\to f(i-1,l+1+1,0\leq c<r+1+1)\)。
\(l\) 同理。然后还有 \(f(i,l,r)\to f(i-1,l+1,r+1)\) 表示各删去左右两侧的一个位置。
直接做。
AGC074
20251026~20251027
D,E 太难不做。
AGC074 A
绕了一个大弯。
考虑最简单的一个策略。我们找到一条路径上不填,其他都填。
然后是有问题的。再做思考,发现只要多条路径的 \(p\) 区间不交就可以选。
于是直接 dp 即可。
所以十几二十分钟就做出来的是怎么想到的。?
AGC074 B
真的比 A 简单吧。。。。
首先不妨直接猜测每次操作只会移动 \(1\) 个 \(1\)。
在这个前提下,一次操作本质上就是把两个 \(1\) 方向相反的移动相同距离。
然后发现可以直接找到策略:我们把 \(a,b\) 的 \(1\) 按照顺序匹配,然后找到方向相反,且不跨越其他 \(1\) 的一对匹配,直接操作。
显然存在这样一对匹配。每次操作至少会让一个 \(1\) 正位。
所以对于 \(cnt_1\leq \lfloor\frac{n}{2}\rfloor\) 的情况,可以操作。否则对 \(0\) 这样操作(也就是 \(01\) 翻转)。
AGC074 C $^?$
先假设 \(N=2^n\)。
首先是构造 \(P\) 的思路,是比较常见的:\(P_0=0,P_i=i-1+2^{10+\text{lg}(i-1)}\)。其思想就是可以通过 ban 掉高位来提取 LIS。
但是就是不会构造 \(A\)。。
考虑 归纳构造 :我们通过 ban 掉每个集合的某个元素,递归到子问题。在这个问题里,就是通过 ban 相邻两个位置最低位不同的那个 \(1\) 实现的。
考虑这种情况下,如果要求的 \(|LIS|>2^{n-1}\),那么可以找到 \(a=(|LIS|-2^{n-1}-1)2^{10}\)。
否则通过 ban 最低位,可以让 \(P(2k+1),P(2k+2)\) 两个数变得相等。
注意还要 ban \(2^{10}\),让 \(P(1)=P(2)\)。
然后是 \(N\neq 2^n\)。
考虑如果让第一次归纳之后的情况仍然相同,就比较好构造。
所以我们从后向前删除 \(P(2k+1)\) 这些元素。直到 \(|P|=N\)。
\(A\) 的构造特判第一次就 \(|LIS|>2^{n-1}\) 的情况。
方法 \(2\) 其实也是归纳构造。
考虑已知 \(N=1,N=2\)。
设 \(2^x>\max P,\max A\)。
然后考虑 \(N\to N+1\),就是 \(P'\gets P+2^x,A'\gets (2^{x+1}-1)+A\)。
这样显然不够。我们需要快速扩展。
于是 \(N\to 2N+1\) 的构造来了。
我们让 \(P'\gets P+(P\text{ or }2^x)+2^{x+1},A'\gets (2^{x+2}-1)+(A(1)+2^{x+1})+A(1)+\cdots +(A(n)+2^{x+1})+A(n)\)。
我只能说很牛。。

浙公网安备 33010602011771号