做题笔记25
11.16
模拟赛
0+10+24+0=34。
T1
。
T2
发现最大是 \(c(a_n,x)\)
T3
发现 \(f^2(x)\equiv f(x^2)\bmod 2\)
T4
傻逼
P14470 [COCI 2025/2026 #1] 松鼠 / Zagic
垃圾,把区间询问拆成一堆左右端点往外一个后相同的区间询问和一堆 \([l,i),(j,r]\),你把 \([l,i),(j,r]\) 也拆了,这种区间有 \(\mathcal{O}(nV)\) 个,每次 \(\mathcal{O}(V)\) 个区间查询异或和,可以做到 \(\mathcal{O}(1)\),总复杂度 \(\mathcal{O}(nV^2)\)
11.18
最摆的一集
模拟赛
T1
转化为钦定排列
T2
观察逆序对
T3
\(\sqrt n\log n\rightarrow \sqrt n\),你原来的式子是对于所有的块筛算一遍 \(S(i)=F(i)-\sum_{j\ge 1}S\left(\left\lfloor\frac{i}{p^j}\right\rfloor\right)\),你发现这样算多了,直接从块筛前面 \(x\) 那个推到后面 \(y\),就是把 \(x/p^i\) 和 \(y/p^i\) 相同的我们直接跳过,这样不会转移重了
复杂度是啥呢,\(\forall x\le \sqrt{n\times p^j}\),有 \(\frac{n}{x}\le \sqrt{\frac{n}{p^j}}\),所以这样的只会有 \(\sqrt {\frac{n}{p^j}}\) 个,\(\forall x>\sqrt{n\times p^j}\),其中是 \(p^j\) 的倍数的只有 \(\sqrt{\frac{n}{p^j}}\),所以就是一个等比数列求和,所以是 \(\mathcal{O}(\sqrt n)\)
T4
最大匹配=最小点覆盖,最小点覆盖=n-最大独立集,即你每行每列中选择的点的颜色必须相同,考虑白行集合 \(S\),假如所有列都是白的,然后考虑把一列调整成黑的
对于现在要考虑的一列,记 \(c_{0/1,0/1}\),第一维为格子的颜色,第二维为其所在行的颜色,其贡献为 \(c_{1,1}-c_{0,0}\),但是这个仍然不好维护,考虑 \(c_{1,1}-c_{0,0}=c_{1,1}-(|S|-c_{1,0})=c_{1,1}+c_{1,0}-|S|\),那贡献就是这一列黑色格子的数量减去白色行的个数
于是记一行白色格子的数量为 \(a_i\),一列黑色格子的数量为 \(b_i\),将 \(a\) 降序排序,则答案为
用线段树维护即可,复杂度线性对数
P14170 二分图最大匹配期望
考虑 hall,我们不妨去计数 \(|S|-|N(S)|=k\) 的概率,于是可以枚举最劣的那个 \(|S|\) 和 \(|T|\),但是你发现这样的会有很多,不妨取 \(|S|\) 最小的作为代表元,可以证明这个代表元是唯一的
考虑如果 \(|S|-|N(S)|=|S'|-|N(S')|=v>0\),且 \(|S|=|S'|\)
若 \(S\) 和 \(S'\) 无交,你取 \(|S\cup S'|-|N(S\cup S')|\) 就行,因为 \(N(S\cup S')=N(S)\cup N(S')\),则 \(|N(S\cup S')|\le |N(S)|+|N(S')|\),此时 \(|S\cup S'|-|N(S\cup S')|\ge |S|+|S'|-|N(S)|-|N(S')|=2v\),而 \(v>0\)
否则 \(S\) 和 \(S'\) 有交,你考虑 \(N(S\cap S')\subseteq N(S)+N(S')\),则有 \(|S|+|S'|-|N(S)|-|N(s')|\le |S \cup S'|+|S\cap S'|-|N(S\cup S')|+|N(S\cap S')|\),那么肯定是取等号时最劣,此时 \(S\cup S'\) 和 \(S\cap S'\) 中必有一个 \(\ge v\),如果是一大一小就可以取大的,否则取 \(S\cap S'\) 肯定更优
枚举这个代表元之后,我们观察一下二分图,去掉 \(S\) 和 \(N(S)\) 后,这个图肯定满足 \(|T|\le |N(T)|\),也就是存在关于左部点的完美匹配,否则你选出来其中一个子集出来加到 \(S\) 上一定不劣,于是我们现在要算两个东西,一个是 \(S=A\),\(N(S)=B\) 的满足 \(|A|-|B|\) 是最大的那个的概率 \(g\),另一个是 \(A\) 和 \(B\),满足 \(N(A)=B\),完美匹配的概率 \(f\),考虑容斥,有转移
其中 \(P_{S,T}\) 是考虑 \(S,T\) 的导出子图,满足 \(N(S)=T\) 的概率,\(e_{S,T}\) 是 \(S\) 和 \(T\) 之间没边的概率,最后答案就是
复杂度 \(\mathcal{O}(9^{n})\)
P14509 树上求值 tree
考虑差分,相当于在 \(i\) 处加上 \(f_{i+d}\),在 \(fa_i\) 处加上 \(f_{i+d-1}\),以此类推去做一条到根链,然后再在 \(i\) 处减去 \(f_{i+d-1}\),在 \(fa_{i}\) 处加上 \(f_{i+d-2}\),以此类推,你发现此时 \(x\) 上的权值就是 \(x\) 到根链上所有点的权值和,那么可以直接维护了,你在 \(i\) 处维护一个trie,把 \(i+d\) 扔进去,然后做线段树合并,接着把 trie 中所有数 \(-1\),这个是容易维护的,复杂度 \(\mathcal{O}(n\log V)\)
AT_agc074_b [AGC074B] Swap if Equal Length and Sum
考虑寻找充要是什么,观察一下我们的操作,即交换长度相同且和相同的区间,考虑这两个区间,其在序列上有很强的对称性,而刻画序列上信息,可以考虑数的下标,于是,你发现交换前后所有 \(1\) 的下标和是不变的,这个是必要的,下面可以构造说明其充分性
你再考虑 \(\left\lfloor\frac{n}{2}\right\rfloor\),所以肯定是把 \(0\) 和 \(1\) 中数量更小的那个一一归位,往简单的考虑,我们肯定是想光操作 100...00 和 00...001,这样比较舒服,我们重新令 \(a_i\) 为 \(a\) 中第 \(i\) 个 \(1\) 的位置,\(b_i\) 为 \(b\) 中第 \(i\) 个 \(1\) 的位置,那么我们想要交换的肯定是形如 \(a_{i}<b_i\) 且 \(a_{i+1}>b_{i+1}\) 的,这样你交换了 \(i\) 或者 \(i+1\) 也不会影响别的
于是令 \(l\) 为最大的 \(i\) 满足 \(a_i<b_i\),令 \(r\) 为最小的 \(i\) 满足 \(a_i>b_i\),由于下标和相同,一定能找到这样的 \(l\) 和 \(r\),否则就都排好了,记 \(d=\min(b_{l}-a_{l},a_r-b_r)\),然后交换 \([l,l+d)\) 和 \((r-d,r]\),这样一定能使 \(l\) 和 \(r\) 中的一个归位
做完了,复杂度线性
11.19
AT_arc209_e [ARC209E] I hate ABC
考虑如何求出一个序列的价值,你发现不存在子序列 \(abc\),等价于把原序列划分成三个子串,使得第一个子串中不存在 \(a\),第二个子串中不存在 \(b\),第三个子串中不存在 \(c\),于是可以 dp,记三个变量 \(x,y,z\) 分别表示当前考虑了几个子串,考虑转移:
- 当 \(S_i=A\)
\(x'=x+1\)
\(y'=\min(x,y)\)
\(z'=z\) - 当 \(S_i=B\)
\(x'=x\)
\(y'=y+1\)
\(z'=\min(y,z)\) - 当 \(S_i=C\)
\(x'=x\)
\(y'=y\)
\(z'=z+1\)
最后序列的价值为 \(\min(x,y,z)\),我们可以考虑计数价值 \(\ge K\) 的方案,可以让 \(x>K\) 时把他拉回 \(K\),我们整理一下上面的转移,于是有
- \(x'\leftarrow \min(x+1,k)\),当 \(S_i=A\)
- \(y'\leftarrow \min(y+1,x)\),当 \(S_i=B\)
- \(z'\leftarrow \min(z+1,y)\),当 \(S_i=C\)
考虑用格路去刻画这个东西,发现上面的转移过程实际上对应 \((0,0,0)\) 走到 \((k,k,k)\) 的一条路径,可以走自环,对于一条没有自环的路径,我们考虑把自环塞到哪儿,于是计数能填一个字符/两个字符/三个字符的转移数量分别为 \(p,q,r\),做一个 SEQ 构造,那么这个 \(p,q,r\) 的贡献就是
你发现 \(p,q\le 3K,r=1\),于是我们只计算 \(f(x)\) 为所有的 \(p,q\) 的方案总和,最后给 \(f\) 乘上 \(\frac{1}{(1-x)^{3K}(1-2x)^{3K}(1-3x)}\),算前者可以直接 dp,复杂度 \(\mathcal{O}(K^4)\),后者有一个 \(N\),这太难受了,考虑把分式拆开,也就是 \(\frac{f(x)}{(1-x)^{3K}(1-2x)^{3K}(1-3x)}=\frac{f_1(x)}{(1-x)^{3K}}+\frac{f_2(x)}{(1-2x)^{3K}}+\frac{f_3(x)}{1-3x}\),这样再卷积就只需要算组合数了,现在考虑怎么解出来 \(f_1,f_2,f_3\),考虑中国剩余定理,我们要算的就是
关键就是要算 \((1-ux)^{n}\) 在膜 \((1-vx)^{m}\) 意义下的逆元,可以直接换元,令 \(y=(1-vx)\),于是只需要算 \((ky+b)^{-n}\) 在膜 \(y^m\) 意义下的值,可以做到 \(\mathcal{O}(K^2)\)
总复杂度 \(\mathcal{O}(K^4+TK)\)
#605. 【UER #9】知识网络
追暗示?!
对于每一个颜色,先跑一遍最短路,建出来最短路 DAG,对于这个颜色中的某一个点 \(u\) 到其他颜色的点 \(v\),假如其跑出来的最短路为 \(dis_v\),那么 \(u,v\) 的距离要么是 \(dis_v\) 要么是 \(dis_v-1\),如果是 \(dis_v-1\),其在 \(u\) 最短路 DAG 的后继上,是我喜欢的可达性,直接 bitset,复杂度 \(\mathcal{O}((n+m)k+\frac{n(n+m)}{w})\)
P9850 [ICPC 2021 Nanjing R] Ancient Magic Circle in Teyvat
对于任意四个点的子图,二项式反演,记 \(f_i\) 为钦定 \(i\) 条边的四元子图的数量,答案即为 \(|f_0-f_1+f_2-f_3+f_4-f_5|\)
- \(f_0=\binom{n}{4}\)
- \(f_1=m\times\binom{n}{2}\)
- \(f_2=(n-3)\sum \binom{deg_u}{2}+\binom{m}{2}-\sum \binom{deg_u}{2}\)
- \(f_3=\sum \binom{deg_u}{3}+c_3\times (n-3)+\sum (deg_u-1)(deg_v-1)-3c_3\),其中 \(c_3\) 是三元环个数
- \(f_4=c_4+\sum t_u(deg_u-2)\),其中 \(c_4\) 为四元环个数,\(t_u\) 为覆盖 \(u\) 的三元环个数
- \(f_5=\sum \binom{t_e}{2}\),其中 \(t_e\) 为经过 \(e\) 这条边的三元环个数
复杂度 \(\mathcal{O}(m\sqrt m)\)
AT_agc072_b [AGC072B] AGC Language
先考虑 \(k=1\),对于一个已经确定的序列,其操作次数肯定是 \(\sum_{i=1}^{n}\left\lceil\frac{\max(-s_i,0)}{2}\right\rceil\),因为你每次可以把折线图上一个谷往上扳,现在考虑枚举 \([l,r]\),其对应的答案为 \(\sum_{i=1}^{l-1}\left\lceil\frac{\max(-s_i,0)}{2}\right\rceil+\sum_{i=r+1}^n \left\lceil\frac{\max(-s_i,0)}{2}\right\rceil+\sum_{i=l+1}^{r}\left\lceil\frac{\max(s_i-s_{l}-s_{r},0)}{2}\right\rceil\),现在观察一下 \(l\) 和 \(r\) 的性质
首先,把序列按照 \(s_i=0\) 为分界划分成一些段,其中每一个段一定是全是正数或者全是负数,对于一组 \((l,r)\),其肯定只能取到正数段的最大值的位置,因为 \(s_l\) 或者 \(s_r\) 小于零的时候,你把他们调到旁边的 \(0\) 肯定不劣,然后你对于一个正数段,把 \(l\) 或者 \(r\) 调整到最大值,此时其所在段的贡献不会变,而且你可以把 \(l\) 调整到他左边那个不小于他的,把 \(r\) 调整到他右边那个不小于他的,此时新加的数一定不会被贡献,而且 \(s_l+s_r\) 不会减小,所以 \(l\) 一定是前缀严格最大值,\(r\) 一定是后缀严格最大值
那么最劣的情况下就是 01012101232101234321...,所以能取的 \(l\) 和 \(r\) 只有 \(\mathcal{O}(\sqrt n)\) 个,直接去枚举 \(l\) 和 \(r\),看起来 \(\sum_{i=l+1}^{r} \left\lceil\frac{\max(s_i-s_{l}-s_{r},0)}{2}\right\rceil\) 完全不好算,但是你考虑到 \(l\) 和 \(r\) 都是 localmax,那么不如直接算全局的 \(\left\lceil\frac{\max(s_i-s_{l}-s_{r},0)}{2}\right\rceil\) 的和,你对奇偶性进行一些分讨就能计算出其贡献,我们可以分别记作 \(v_l,v_r,v_{lr}\)
当 \(k>1\),\([l,r]\) 只会分别取第一个 \(n\) 和最后一 \(n\),那么原来的贡献就变成了 \(v_l+v_r+kv_{l,r}\),这是一个一次函数的形式,我们直接把凸包拉出来就行了
复杂度线性对数
#401. 因子统计 (Ex)
记 \(N=\max(n)\) 阈值分治,对于 \(p\le\sqrt N\),直接暴力算出来 \(v_p(n!)\),这个的复杂度是证明到 \(\mathcal{O}(\frac{q\sqrt n}{\log n})\),对于 \(p>\sqrt N\),有 \(v_p\left(\binom{n}{m}\right)=\left\lfloor\frac{n}{p}\right\rfloor-\left\lfloor\frac{m}{p}\right\rfloor-\left\lfloor\frac{n-m}{p}\right\rfloor\),于是如果我们能对于每一个 \(n\),计算 \(\sum_{p>\sqrt N}\left\lfloor\frac{n}{p}\right\rfloor\),就能快速算了,直接前缀和就能做到 \(\sum_{p>\sqrt N}\frac{N}{p}=\mathcal{O}(N)\)
那两个复杂度不会证
#14419. Maximum Segment Sum
考虑最大子段和的过程,维护一个变量 \(u\),每次 \(u\leftarrow \max(u+a_i,0)\),搬到二维平面上,对 \(0\) 取 \(\max\) 的操作有点不好做,你考虑在 \(0\) 下面 \(-1\) 处加一条线,那么原来在 \(x=0\) 处直走的转移可以变成往 \(-1\) 走,现在在 \(-1\) 这个地方考虑,你可以接着走到 \(0\) 上,这对应原路径中连续的两个走 \(x=0\),你可以往下走,这对应原路径上走一个 \(x=0\) 再往上走到 \(1\),也就是我们每碰到一个 \(0\),就把格路翻转一下
现在考虑我们新的格路,我们不妨计数最大子段和 \(\le k\) 的方案,即从 \((0,0)\) 走到 \(x=n\),不能碰到 \(y=k+1\) 和 \(y=-k-2\) 的方案,直接反射容斥,对于每一个 \(k\) 都算一遍,有个调和级数,于是复杂度 \(\mathcal{O}(n\log n)\)
AT_abc383_g [ABC383G] Bar Cover
凸的,写一下 dp 式子:
现在归纳证明 \(f_{i,j}-f_{i-k,j-1}\) 关于 \(j\) 递减,\(f_{i,j}-f_{i-1,j}\) 关于 \(j\) 递增,假设 \(i-1\) 及的都成立,现在说明其对于 \(i\) 成立,有
递减,则能推导到
递减,且
递增
我们还能进一步说明
递减
同时,我们也可以说明,\(i\) 在转移时,存在一个 \(p\),使得 \(\forall j\le p,f_{i,j}=f_{i-1,j},\forall j>p,f_{i,j}=f_{i-k,j-1}+s_i-s_{i-k}\)
直接可持久化平衡树维护即可,复杂度 \(\mathcal{O}(n\log^2n)\)
#9700. Ying’s Cup
二项式反演,算钦定某些点是最小的,限制就是钦定点的邻域都小于他,这时候你发现限制的边有上下两种,很难受,再容斥一遍,把向下的边容斥成没限制的边和有 \(-1\) 的系数的向上的边,只有向上的边就可以做拓扑序计数了,即 \(n!\prod \frac{1}{siz_u}\),直接 dp,记 \(f_{u,i,j,0/1}\) 表示 \(u\) 子树内钦定了 \(i\) 个,其内向子树的大小为 \(j\),\(u\) 是否被钦定,于是有转移
- \(f_{u,i,p,1}\times f_{v,j,q,0}\rightarrow f_{u,i+j,p,1}\)
- \(-1\times f_{u,i,p,1}\times f_{v,j,q,0}\rightarrow f_{u,i+j,p+q,1}\)
- \(f_{u,i,p,0}\times f_{v,j,q,0}\rightarrow f_{u,i+j,p,0}\)
- \(f_{u,i,p,0}\times f_{v,j,q,1}\rightarrow f_{u,i+j,p+q,0}\)
最后 \(f_{u,i,p,*}\times \frac{1}{p}\rightarrow f_{u,i,p,*}\),最后算答案再乘上 \(n!\),那个多项式系数就和所有子树的阶乘消了
这样直接做是 \(\mathcal{O}(n^4)\),你发现第二维是个卷积,于是可以插值优化到 \(\mathcal{O}(n^3)\)
P10440 [JOIST 2024] 环岛旅行 / Island Hopping
从 \(1\) 开始问,每次问 \((1,i)\) 得到一个点 \(u\),然后问 \((u,1)\) 得到与 \(u\) 最近的点 \(v\),此时 \(u\) 和 \(v\) 一定有边,若未确定 \(u\) 的父亲,则 \(v\) 一定为 \(u\) 的父亲,否则 \(u\) 一定为 \(v\) 的父亲,这样每次可以确定一个父亲,总次数 \(2n\)
CF2162H Beautiful Problem
考虑充要是啥,记 \(u\) 为 \(<x\) 的位置的个数,\(v\) 为 \(>x\) 的位置的个数,只被 \(\le x\) 限制不被 \(\ge x\) 限制的位置有 \(s\) 个,只被 \(\ge x\) 限制不被 \(\le x\) 限制的位置有 \(t\) 个,不被限制的位置有 \(w\) 个,那么充要就是
- \(u\le s+w\)
- \(v\le t+w\)
- \(u+v\le s+t+w\)
你发现 \(s\) 和 \(t\) 越大越好,于是考虑算出来 \(s=i\) 时 \(t\) 的最大值,区间包含的你显然可以去了,所以你可以直接 dp,记 \(f_{i,j,0/1}\) 为考虑了前 \(i\) 个区间,当前 \(s=j\),当前区间是哪一种,的 \(t\) 最大值,没交可以直接转移,有交的时候有如下转移:
- \(f_{i-1,j,0}\rightarrow f_{i,j+x_i,0}\)
- \(f_{i-1,j,0}+x_i\rightarrow f_{i,j,1}\)
- \(f_{i-1,j,1}-y_i\rightarrow f_{i,j+x_i,0}\)
- \(f_{i-1,j,1}+x_i\rightarrow f_{i,j,1}\)
其中 \(x_i\) 为第 \(i\) 个区间相对上一个增加的长度,\(y_i\) 为重合的长度,你发现可能有 \(i,i-1,i-2\) 三个区间都相交的情况,但这种肯定不优,所以直接 dp 就行了,复杂度 \(\mathcal{O}(n^2)\)
11.20
我能在患有失忆症的情况下连续卷题吗?我能在患有失忆症的情况下连续卷题吗?我能在患有失忆症的情况下连续卷题吗?我能在患有失忆症的情况下连续卷题吗?我能在患有失忆症的情况下连续卷题吗?我能在患有失忆症的情况下连续卷题吗?我能在患有失忆症的情况下连续卷题吗?我能在患有失忆症的情况下连续卷题吗?我能在患有失忆症的情况下连续卷题吗?我能在患有失忆症的情况下连续卷题吗?我能在患有失忆症的情况下连续卷题吗?我能在患有失忆症的情况下连续卷题吗?我能在患有失忆症的情况下连续卷题吗?我能在患有失忆症的情况下连续卷题吗?我能在患有失忆症的情况下连续卷题吗?我能在患有失忆症的情况下连续卷题吗?我能在患有失忆症的情况下连续卷题吗?我能在患有失忆症的情况下连续卷题吗?我能在患有失忆症的情况下连续卷题吗?
P7481 梦现时刻
CF1644F Basis
先考虑 \(G\) 操作,一个数组不能被其他的表示出来,其应该满足,去掉最后一个连续段之后,其他所有连续段长度的 \(\gcd=1\),考虑莫反,我们只需要算出来 \(d|\gcd\) 的答案最后再乘上 \(\mu(\frac{d}{1})=\mu(d)\),于是直接给数组分段,每 \(d\) 个分一段,每一段强制填相同的数,现在再考虑操作 \(F\),那么形态相同的数组是一样的,于是填入 \(k\) 个数的方案就是 \(\begin{Bmatrix}\left\lceil\frac{n}{d}\right\rceil\\k\end{Bmatrix}\),那么对于每一个 \(d\),我们要算一遍行斯特林数前缀和,直接 NTT,再算上调和级数,复杂度就是 \(\mathcal{O}(n\log^2n)\)
P5644 [PKUWC2018] 猎人杀
min-max 容斥变成第一个死的概率,则答案为
涉及到和,直接分治 NTT 做 \(\prod_{i=2}^n(1-x^{w_i})\),复杂度 \(\mathcal{O}(n\log^2n)\)
AT_agc034_f [AGC034F] RNG and XOR
有方程
写出来生成函数就是 \(F=F\times P+H\),你发现这个并不对,因为需要满足 \(f_0=0\),所以上面那个式子应该是 \(F=F\times P+H+C\),\(C\) 是一常数,那么你直接两边同时 FWT,可以得到
但是可能出现 \(\emptyset\) 处分母为 \(0\) 的情况,你发现可以给 \(f_{\emptyset}\) 加上一个 \(\Delta\),这样所有的 \(f\) 都会加上一个 \(\Delta\),算出来 \(f_i\) 之后再减去 \(\Delta\) 就行了
随便 \(\mathcal{O}(n2^n)\)
P11994 [JOIST 2025] 外郎糕 / Uiro
不知道为什么总是把题目名字看成外糕郎
扫值域,对于相同的数,肯定是后面都是 -,前面都是 +,那么你有一个想法,从小往大扫值域,每次贪心取最长的后缀,这样是对的,因为如果你没取满,你在更大的值的地方取了一个决策点更靠前的 -,你不妨把这个东西换成 +,然后把他后面第一个当前值域的数换成 -,这样肯定更优
所以直接扫值域,现在要对于每一个询问区间处理出决策点,考虑二分出来这个东西,但是并不好做判定,因为值域小的选的 - 不好办 ,但是你发现我们的决策点是有单调性的,所以你可以把值域更小的 + 的影响看成全局的,也就是我们对于当前扫到的值 \(x\),把 \(\le x\) 的都看成 -,把 \(>x\) 的都看成 +,你去判定决策点是否合法的时候,就是求一个前缀和的最小值,你再把这个最小值加上前面已经选了的 + 的贡献就行了
复杂度 \(\mathcal{O}(nV\log n)\)
P11803 【MX-X9-T7】『GROI-R3』此花绽放之时
对于每一个连通块,考虑令深度最小的为其代表元,每次连通块加是难以操作的,于是考虑在代表元处打懒标记,那么肯定要轻重链剖分了,我们可以类比序列在线段树上进行的操作,从而去思考这道题中树上的标记怎么更新怎么合并
都重剖了,我们可以把一个标记记作 \((c,w)\),表示在其轻子树中与当前点颜色相同的,加上 \(w\) 的权值,同时,我们用一棵树状数组去维护点上的权值
现在考虑三种操作,对于连通块修改的操作 \((u,w)\),由于我们的标记都是修改的轻子树,所以对于 \(u\) 所在重链中,和他颜色相同且连通的都打上 \((c,w)\) 的标记,这个可以用线段树维护,然后在树状数组上修改权值
对于链修改操作 \((u,v,c)\),和线段树一样,我们在修改之前要保证这条链上的信息是对的,于是我们需要把 \(u\) 到根链和 \(v\) 到根链上的标记下传,我们显然只需要在跳链头的时候去修改标记,因为别的标记并不影响到我们修改的部分,现在考虑传一个标记,如果暴力传,其代价是轻儿子个数的,我们无法接受,于是考虑怎么让标记只下传到当前链头 \(top\),首先我们肯定要和刚才连通块修一样,把 \(top\) 所在重链颜色为 \(x\) 且与 \(top\) 连通的都打上标记,但是如果我们在某次操作的时候又传了一下这个标记,此时会算重,于是可以开一个桶 \(t_{u,x}\),用来减掉重复的贡献,还有一个小问题,就是在修改了颜色变成 \(c\) 之后,其原来的 \((c,w)\) 的标记是不能用的,以及 \(u\) 和 \(v\) lca 的父亲对于 \(u\) 和 \(v\) lca 的标记也是不能用的,但是也无伤大雅,直接去修改 \(t_{u,x}\) 就行了
单点修改,我们也先把到根链的标记下传了即可
于是我们要一个树状数组来维护权值,一个线段树来维护标记,一个颜色段均摊来维护颜色,总复杂度 \(\mathcal{O}(n\log^2n)\)
AT_agc056_b [AGC056B] Range Argmax
要求数 \(x\),显然很难数,于是考虑让一组合法的 \(x\) 在一个 \(p\) 的代表元处被统计到,我们可以考虑字典序,你发现题目考虑的是最大值,所以我们可以让他在字典序最大的地方被统计到,这样方便我们 dp
那你反过来考虑 \(x\),对于一个 \(x\),怎么构造到一个字典序最大的 \(p\) 呢,肯定是从 \(n\) 扫到 \(1\),每次插入一个最靠前的能插入的位置,然后把覆盖他的区间都删了,跟据这个过程,你发现一个最大值确定后,其左边和右边互不影响,于是你就可以去往区间 dp 考虑了,我们先不急着设状态,不妨观察一下在 \([l,r]\) 中插入一个最大值有什么影响
你发现,我们需要钦定这个最大值是最靠前的,但是可能会出现,左区间的最大值也有可以作为 \([l,r]\) 的最大值被统计,此时 \([l,r]\) 的最大值就不是我们想要的最靠前的了,为了防止出现这种情况,我们必须搞个东西来限制作区间最大值和 \([l,r]\) 最大值的大小关系,所以我们可以处理出来 \(a_{l,r,x}\) 为全部包含在 \([l,r]\) 内且包含 \(x\) 的限制中,左端点的最小值,于是你左区间的最大值必须满足 \(\ge a_{l,r,x}\)
于是我们只有对于一个区间最大值下界的限制,可以设状态 \(f_{l,r,k}\) 表示考虑区间 \([l,r]\),最大值的位置 \(\ge k\) 的方案,转移考虑最大值在 \(k\) 的方案,则有:
复杂度 \(\mathcal{O}(n^3)\)
CF1958I Equal Trees
考虑两个树一样,当且仅当对于所有的点对 \(i,j\),其在两棵树上的祖先关系相同,于是我们把不同的拉出来连边,最后就选出一个最大独立集,这个最大独立集是我们保留的边,直接找最大独立集就行了,但是题解给出了一个 "very cool techique of finding the maximum clique in O(n2^{0.5n}) without using meet in the middle",但是我完全没懂,反正我会 \(\mathcal{O}(1.3803^{n})\),纯神
P11983 [JOIST 2025] 展览会 3 / Exhibition 3
先考虑暴力怎么做,如果 \(a_i\) 互不相同,可以从大往小扫值域,我们每次找到未被覆盖的编号最小的区间,将其染成当前的颜色,然后你贪心去找和当前区间有交的的编号最小的,这样可以做到线性对数
那你现在考虑一个值可能对应了多个 \(a_i\),我们只关心相同的 \(a_i\) 的个数,于是记 \(cnt_x\) 为 \(\sum [a_i=x]\),我们可以参考 \(a_i\) 互不相同的去做,我们要做的就是选出一个集合,使得这个集合用 \(cnt_x\) 就可以染完,同时满足这个集合的字典序最小,于是可以逐位确定,即每次 check 当前未被加入的编号最小的区间,现在考虑怎么进行 check,有一个经典的贪心,即把所有区间按右端点排序,如果他不能被之前的染色,就在他的右端点处放一个,那么我们现在直接暴力就可以做到 \(\mathcal{O}(n^3)\) 了
考虑优化,肯定要二分,因为我们发现一个 \(x\) 染色的区间肯定是一个极长的按编号排序的前缀,如果我们直接二分,每次都要暴力 check 一次,这样太报了,其复杂度是 \(\mathcal{O}(n\log n)\) 的,完全不能接受,但是我们其实能接受 \(\mathcal{O}(ans_i\log n)\) 的,因为 \(\sum ans_i=n\),于是我们可以倍增找到 \(\mathcal{O}(ans_i)\) 级别的那个 \(2^k\),然后在 \([2^k,2^{k+1})\) 的区间中二分,这样每次 check 复杂度就变成了 \(\mathcal{O}(ans_i)\),精细实现可以把这部分做到 \(\mathcal{O}(n\log n)\),\(\mathcal{O}(n\log^2n)\) 是平凡的,而且能过
我们找到了那个极长的前缀之后,还要加入一些零散的区间,这里有一个神秘的操作,就是你对于那个前缀集合,正着反着贪心一遍,把所有的决策点拉出来,拉成两个序列 \(sl\) 和 \(sr\),那么新加入一个区间 \([l,r]\) 合法,当且仅当他和某一个 \([sl_i,sr_i]\) 有交,你感受一下就很对,而且 \([sl_i,sr_i]\) 和 \([sl_j,sr_j]\) 无交,如果有交,取原先的决策点肯定不优了
于是你插入一个零散区间 \([l,r]\),如果其与任意 \([sl,sr]\) 无交,他肯定插不进去;他如果包含了一个 \([sl,sr]\),把这个 \([l,r]\) 归到 \([sl,sr]\) 中肯定没问题;如果他只与一个 \([sl,sr]\) 相交且不包含,直接让那个 \([sl,sr]\) 和他取交即可;最后一种情况是和形如 \([sl_i,sr_i],[sl_{i+1},sr_{i+1}]\) 都相交且不包含,此时并没有太严的限制,具体来说,就是当 \([l,r]\) 和 \([sl_i,sr_i]\) 无交时,把 \(sr_{i+1}\) 向 \(r\) 取 \(\min\),右边那种情况对称,于是可以用优先队列去维护这种限制,对于 \([l,r]\) 和 \([sl_i,sr_i]\) 无交的限制,在 \(i\) 处加入一个 \(l\),当 \([sl_i,sr_i]\) 不得不修改,也就是和一个 \([l,r]\) 取交的时候,再把优先队列里的限制操作了,这样我们就能维护出来加入一个 \([l,r]\) 之后所有的 \([sl,sr]\) 了
我们现在只剩找到和 \([sl,sr]\) 中的一个有交的编号最小的 \([l_i,r_i]\) 了,我们不妨对于所有的 \([sl,sr]\) 都维护出来其对应的 \([l,r]\),把这些东西都塞到堆里,每次取出最小的,但是一个 \([l_i,r_i]\) 可能会对应很多 \([sl,sr]\),你可以只把 \([l_i,r_i]\) 挂到其对应的最多两个只相交不包含的 \([sl,sr]\) 区间上,这样就对了,开几个线段树就能随便维护了
复杂度可以做到 \(\mathcal{O}(n\log n)\)
P14343 [JOISC 2019] 两个天线 / Two Antennas
把绝对值拆了,求 $$\max_{l\le i<j\le r,j-i\in[l_i,r_i]\cap [l_j,r_j]}a_i-a_j$$
那么扫 \(j\),在某个时刻加入 \(i\),某个时刻删除,查询存活的 \(a_i\) 的最大值,以及加上 \(j\) 时的最大值是多少
于是我们要做:单点修改、区间加、历史最值
说一下怎么维护历史最值,考虑一个向量 \(\begin{bmatrix}a_i\\b_i\end{bmatrix}\),上面维护当前值,下面维护历史最值,然后加法定义为取 \(\max\),乘法定义为 \(+\),每次乘上一个矩阵即可
P6782 [Ynoi2008] rplexq
视 \(n,m\) 同阶
阈值分治,对于 \(deg\le B\) 的 \(x\),枚举其所有儿子,做二维数点,这个可以平衡到 \(\mathcal{O}(n\sqrt n)\)
对于 \(deg>B\) 的 \(x\),考虑将其在同一子树内的节点染成相同颜色,然后莫队做区间数颜色,但是这样会报,于是你考虑取出其前 \(B\) 重的子树,他们去做数点,这样剩下的莫队只需要 \(\mathcal{O}(n\sqrt n\log_{B+1}n)\),这样总复杂度就是 \(\mathcal{O}(n\sqrt n)\) 了

浙公网安备 33010602011771号