1月做题记录
1月做题记录
✩ trick
✯ 会大部分,要\(tj\)提示
✬ 会小部分/完全没想到,看了\(tj\)才会
◈ 脑电波
✡ 有某一算法的神秘通用性质
⊗ 待补
- 1月做题记录
- [ABC363G] Dynamic Scheduling ✯✩
- [ARC109F] 1D Kingdom Builder ✯
- [ARC127F] ±AB ✩✯✡
- [ARC189E] Straight Path ✩✯
- P10140 [USACO24JAN] Island Vacation P
- [AGC065F] Always Perfect ✩✡✬
- P10046 [CCPC 2023 北京市赛] 哈密顿 ✩
- CF2049F MEX OR Mania
- CF1844G Tree Weights ✩✬
- 「SNOI2024」树 V 图
- 「SNOI2024」矩阵
- 「SNOI2024」拉丁方 ✩✬
- qoj9479 And DNA
- 「SNOI2024」公交线路 ✩
- pkuwc d1t1
- pkuwc d1t2
- pkuwc d1t3
- pkuwc d2t1
- CF1179D
- QOJ9904
- APC001F ✯✩
- P5443 ✬✩
- CF1340F
- CF1588F
- qoj5357
- qoj7514 ✯✩
- CF1874F
- QOJ7610
- CF1494F
- CF1499G ✯✩
- 动态dp(ddp)and 全局平衡二叉树
- 网络流(炒冷饭)
[ABC363G] Dynamic Scheduling ✯✩
对于这种问题,它的静态版是比较普遍的,大概有以下几种性质/做法:
- 最优方案放的数肯定也是最多的
- 最优方案可以按\((D_i,-P_i)\)排序,排序后显然也合法且更方便解题
- 有种贪心的做法,就是从后往前遍历当前时间\(i\),然后选时限\(\geq i\)的还没放的最大的点放,这也做法也能证明第一点
再来考虑现在动态的问题,即能删除或插入元素,按照第二点维护当前的最优方案序列
对每个时间点记录一下\(val_i\)表示\(i-\)时限\(\leq i\)的放了的点数,那么合法显然要所有点都满足\(val_i\geq0\)
下面的\(val\)都指的原本的\(val\)即还未修改的,\(val'\)就是修改后的
- 对于插入\((d,-p)\)
若\(\forall i\geq d\),都有\(val_i>0\),显然\((d,-p)\)可以直接插入了
否则,说明若要插入\((d,-p)\),则必删除一个元素,那么有两种选择
要么删除时限\(i<d\)的点,这个是直接选最小的那个就好
要么删除时限\(i\geq d\)的点,此时删时限\(i\leq t\)的值最小的元素,其中\(t\)是最小的满足\(val_t=0\)且\(t\geq d\)的时限
- 对于删除\((d,-p)\)
若该元素不在我们维护的最优方案中就不管,否则,考虑用什么元素去顶替它
若用时限\(i\leq p\)的元素顶替,则\(i\)要满足\(i>t\),其中\(t\leq p\)且是最大的满足\(val'_t=0\)的点
若用时限\(i>p\)的元素顶替,就没有限制了,选个最大的就好
复杂度\(O(NlogN)\)
[ARC109F] 1D Kingdom Builder ✯
考虑判断最后怎样的情况是合法的,显然最后会是一个个连通块
考虑把这个放的过程倒过来,即考虑删的过程,要求每次删的时候,要么它有相邻的棋子,要么其它连通块的两侧没有它的颜色
显然每个连通块都会有个中心点,即最早放/最晚删的那个点
考虑第一个被删的中心点,设它的颜色是\(c\),反色是\(c'\),则此时其他连通块两侧都得有\(c'\)
把其它连通块的初始态分为纯色or非纯色,对于非纯色和纯\(c\)的,显然也能用\(c\)当中心点的颜色,即可以依次删完
则此时只剩下了纯\(c'\)色,显然只能至多一个,然后直接删了就行
总结一下合法的局面一定满足:
- 算上连通块两侧的点,第一个中心点被加入的连通块要存在子序列\(c'c'\)
- 算上连通块两侧的点,在中间中心点被加入的连通块的要存在子序列\(c'cc'\)
- 最后一个中心点被加入的连通块要存在子序列\(c\)
以下简称为第一个连通块,中间连通块,最后一个连通块
再考虑满足这个性质的是不是一定合法,显然可以把除最后一个连通块都弄成两侧只存在\(c'\)的情况,那么最后一个连通块和中间的连通块都可以直接删完了,现在只剩一个连通块显然也能删完
那么直接\(dp[i][0/1][0/1]\)表示第一个/最后一个是否被钦定,考虑前\(i\)个且第\(i\)个不选时的合法的局面中(即要选的都得选),最小的连通块长度之和
转移可以发现,满足每种转移需求的都是一个前缀(某些被钦定要选的点对应的转移点会被挖掉),那么子序列自动机+前缀最小值即可
子序列自动机说着多高级,其实就是\(to[x][c]\)表示\(x\)后的第一个\(c\),如果\(|C|\)够小,直接转移,否则可持久化线段树就好
初始化的时候要给两边多塞\(3\)个,因为是可能会用到某一侧的\(2\)个多的数的,如\(hack\)数据
Input
42
wwwwwwwwwwwwbbbbwwbbbwwbbbbbbbwwwwwwwwwwww
____o___________oo___oo__________________o
Output
8
做法:44(b) -> 17(w) -> 18(w) -> 22(w) -> 23(w) -> 5(w) -> 43(b) -> 42(w)
而用\(3\)个肯定没有意义
复杂度\(O(N)\)
[ARC127F] ±AB ✩✯✡
首先,从\(V\rightarrow w\),显然可以表示为\(V+pA+qB\)
因为\(\gcd(A,B)=1\),考虑什么时候能到达所有的数,若当前处于\(x\),还要\(p\)个\(A\)和\(q\)个\(B\),若此时\(p,q\)同号,显然合法,否则不同号时,需要满足至少有一边可以走,那么先走\(A\)走到不能走为止,现在必须进行\(B\)操作,那么极限的情况就是\(A-1+B\leq m\)即\(A+B\leq m+1\)
否则对于\(A+B>m+1\)的情况,显然操作只能是 -pA+qB或 pA-qB,且显然具体表现为,选择\(A\)或\(B\),然后一直操作到不能操作为止再换另一个操作,因为显然进行某一个操作的中途,另一种操作是不可能执行的
那么可以发现,每次操作\(A\)到不能操作的点都可以表示为\((V+qB)\%A\),第二个用\(m-x\)表示出来,即\(m-(V+pA-qB)\),即\((m-v+qB)\%A\)
考虑建边\(x\rightarrow x+B/x-A\),边建合法的那个,因为\(\gcd(A,B)=1\),考虑每次\(+B\)后就会跟一堆\(-A\),显然这些点都是\(\%A\)同余的,且所有同余的点都凑在一块的,且同余的块之间是\(+B\)操作连接的,所以肯定是\(0\sim A-1\)连出了一个大环
而又要求了\(x+B\leq m\),所以对于\(x+B>m\)的边要断开,也就是把这个环拆成了一些连通块
而且这样可以发现,这个图的反边就是 pA-qB的边
由此,我们可以发现,直接算出跳 -pA+qB能跳到的所有点和 pA-qB能跳到的所有点的个数即可
具体的,以 -pA+qB举例,就是找到最小的\(k\)满足\((V+kB)\mod A+B>m\)
考虑把\(V\)独立出来,设\(V_0=V\mod A\)
-
当\(V_0+kB\mod A<A\)时,有\((V+kB)\mod A+B=V_0+kB\mod A+B\)
-
而\(V_0+kB\mod A\geq A\)时,发现此时有\((V+kB)\mod A=V_0+kB\mod A-A\),且有\(V_0+(kB\mod A-A)+B<V_0+B\)
分讨一下\(V_0+B\)和\(m+1\)的关系
当\(V_0+B\leq m+1\)时,代入上式有\((V+kB)\mod A+B<m+1\)即下一步依合法,不符合我们的要求
当\(V_0+B>m+1\)时,说明\(V\)开始,只能一直\(-A\),那么就只能走\(\lfloor\frac VA\rfloor\)步,直接特判掉就好了
现在就只用考虑\((V+kB)\mod A+B=V_0+kB\mod A+B\)的情况了,化简得到\(kB\%A\in[m-V_0-B+1,A-V_0-1]\)
可以简化问题为求\(kB\%A\in[l,r]\)的最小的\(k\),先直接让\(B\%A\)了,然后现在就有\(B<A\)
这种一般会用类欧的办法啊,所以肯定想要得到\(A\%B\)的东西,所以把\(A\)拆成\(A\%B+B\times\lfloor\frac AB\rfloor\)
考虑怎么去掉右边的\(B\times(k-\lfloor\frac AB\rfloor\lfloor\frac{kB}A\rfloor)\),考虑用\(\%B\)
那么要分讨一下,每\(B\)个数分到一个块里
-
如果\(l-1\)和\(r\)不在同一个块中
那么显然此时最小的\(k\)就满足\(kB\in[l,r]\)
-
如果在同一个块中
此时考虑对左右两侧都取模\(B\),得到\((A\%B)\times\lfloor\frac{kB}A\rfloor\mod B\in[(B-r)\%B,(B-l)\%B]\),直接把\(\lfloor\frac{kB}A\rfloor\)当作一个未知数,显然\(k\)最小也即要求\(\lfloor\frac{kB}A\rfloor\)最小,那么就递归到了\((A\%B,B)\)的子问题,求出\(\lfloor\frac{kB}A\rfloor\)后也根据\(kB-A\times\lfloor\frac{kB}A\rfloor\in[l,r]\)又可得到\(k\)
那么就可知\(B\)的次数是\(k\),那么\(A\)的次数就是\(\lfloor\frac{V+kB}A\rfloor\)
另一个同理
复杂度\(O(Tlog\max(a,b))\)
[ARC189E] Straight Path ✩✯
学考想题就是高效口牙!
显然\(n=2/3\)都无解
样例很邪恶,给的\(n=5\)是一种特殊情况
考虑\(n=4\),此时的图是:左右两条竖边是\(1\),上下两条横边是\(2\),中间交叉的边是\(3\)
猜测下界是\(3\),显然只有一种颜色不可能,考虑证明两种颜色必无解的情况
证明:
把图的点按用\(2\)边连通的情况分组,取其中最大的一组作为最后用\(2\)边连接的那些点
我们考虑把其余的点都用\(1\)边连接起来,考虑只用块与块之间的那些边,显然都是\(1\)边
那么任意取出两个块,然后显然点数更多的那个块会剩余一些点没\(1\)边/只连了一条\(1\)边,然后又随便拿一个块来和这些剩余的匹配
最后依旧剩余一些没匹配完的点,显然它们的数量<其所属块的总点数\(\leq\)我们选出的那个最大的一组点的点数,然后再把这些剩余的和我们的最大的一组匹配一下
此时剩余的没匹配完的剩余点都是选出的最大的一组点中的,再用\(2\)把他们匹配上就好
那么证得了下界是\(3\),考虑怎么构造得到下界
对于\(n=4\)的例子研究一下,发现可以通过\(1\)把图分成两个部分,每个部分是\(1\)的完全图,两部分之间用\(2\)/\(3\)连接
-
考虑\(n\)是偶数的情况
此时两部分能恰好分均匀,直觉告诉我们,对于左边部分的点,可以前一半向右连\(232323...\)的边,后一半向右连\(32323232...\)的边
发现此时如果存在不合法的路径,显然不可能走\(1\)的边,那么只能走\(2/3\)的边,也就相当于一种匹配的过程,对于前面\(2\)的部分,考虑从左侧出发,那么会依次经过右侧的第\(1\),\(3\),\(5\),...个点,显然不能在把所有的第奇数个点走完之前就跳\(3\)的边,否则剩余的奇数点就遍历不到了,那么此时左侧会跳到后边部分,而右边只剩下第偶数个点,但后半部分和这些点的连边是\(2\),所以是不存在不合法的路径的
实际上,通过这种证明,也可以发现,左边只要存在不同连边方式的点就行,并不一定均分
-
考虑\(n\)是奇数的情况
设此时左边放的点比右边多一个,还是用偶数个的方式(采用均分的分配方式),左侧前一半和后一半采用不同的连边方式
发现此时遍历的过程中,必须先走一个\(1\)边,也即扔掉一个左侧的点,发现只要\(n\geq7\),无论扔哪一个点,我们都存在两种不同的连边方式,那么就可以用\(n\)为偶数时的方案解决了,而对于\(n=5\),存在扔掉一个点后只存在同一种连边方式的扔法,所以\(n=5\)是特殊情况,那么\(n\geq7\)的直接按\(n-1\)的方式建图,左侧多放的那个点根据左侧具体的点数看它用哪种
实际上无论\(n\)多大,都可以通过上述的证明证出我们的这种构造方式是合法的
构造的时间复杂度是\(O(N^2)\)的,\(N\leq20\)是给\(checker\)开的(
P10140 [USACO24JAN] Island Vacation P
给的仙人掌图,显然我们的走法大概就是,走一个环的过程中可以走到某个点的其他环上,又因为给定了出发点\(1\),显然可以弄出以\(1\)为根的广义圆方树,方点下的圆点按环的顺序放
那么从\(1\)走到一个圆点\(x\)为止,大概就是走圆方树上的一条路径(中途有些圆点会经过它的一个前/后缀的兄弟),有的圆点会往其他路径上递归下去再上来,求这样的概率
设\(val_x\)表示\(\min(2,son_x)\),则对于圆点\(x\)的下一步,要么往儿子,要么往下一个兄弟(是固定了的,因为进来的那一侧的边不能走了),没有下一个兄弟就是走时\(fa_{fa_x}\)就是\(x\)的下一个兄弟
则设\(s=(val_{fa_x}-1)+\sum_{y\in son_p}val_y\),走到下一个兄弟的概率是\((1-p_x)\frac{val_{fa_x}-1}s\),走到儿子\(y\)的概率是\((1-p_x)\frac{val_y}s\)
显然我们要求\(f_x\)表示以某种方式走到圆点\(x\)后,所有递归到孩子的方案且回到\(x\)的概率(不考虑前面走到\(x\)的部分的概率),若\(x\)是方点,就表示从\(fa_x\)到\(x\)后,从\(x\)的所有孩子走一圈又走回\(fa_x\)的概率
那么还要记录\(g_x\)表示以某种方式走到圆点\(x\)后,所有递归到孩子的方案且回到\(x\)然后\(x\)走向下一兄弟的概率(不考虑前面走到\(x\)的部分的概率)
对于圆点\(x\)的\(f_x\),显然能用背包的方式合并孩子\(y\)的\(f_y\)求出,注意要回到\(x\)只能是走到满足\(val_y=2\)的儿子\(y\)上,所以转移的这些那些的系数就很好弄啊
对于方点的\(f_x\),就是孩子\(y\)的\(g_y\)的乘积
而原点\(x\)的\(g_x\)和原点\(f_x\)的求法差不多,\(g_x\)相当于就是在\(f_x\)的求法最后要考虑转移到下一兄弟的概率
现在我们只要知道\(h_{x,0/1}\)表示从\(1\)走到\(x\)的概率,对于圆点\(x\),这个\(0/1\)表示它的下一兄弟是顺时针还是逆时针方向的,对于方点\(x\),只记录\(h_x\)
那么对于圆点\(x\),\(h_{x,0/1}\times f_x\times p_x\)就是在\(x\)处停下的概率,当然还要考虑\(x\)走了所有的边后走不动必须停下的概率
考虑咋求圆点的\(h_{x,0/1}\),这里以\(h_{x,0}\)为例,就用\(h_x\)简称了,可以表示为\(h_{fa_x}\)乘上\(x\)之前的兄弟的\(g\)再乘上\(\frac1{val_{fa_x}}\)
来考虑方点的\(h_x\),又可以由\(h_{fa_x,0/1}\)以及\(x\)的那些兄弟\(y\)的\(f_y\)再上点组合数求出,因为有值的\(f_y\)都满足\(val_y=1\),且转移式大概可以表示\(\sum_i F(i)\times calc(i)\),其中\(calc(i)\)是组合数的部分,\(F(i)\)是对兄弟做背包,\(i\)个兄弟的\(f_y\)的乘积,那么一开始求出把\(fa_x\)的所有孩子都加到背包里整出的背包,对于\(x\)如果在背包中,显然我们能让\(i\)从小到大去掉\(x\)存在的部分
复杂度\(O(N^2)\)
[AGC065F] Always Perfect ✩✡✬
神仙题,太牛了
这里的\(scc\)和圆方树都是广义的
考虑什么样的图是合法的,对每个\(scc\)考虑,记\(s_x\)表示把\(scc\)内部的所有边都断开后,整张图中依然和\(x\)连通的点的集合(包括了\(x\)本身)
显然,若\(|s_x|\)为奇数的话,那么\(x\)就要和\(scc\)中的其他点匹配,若\(|s_x|\)为偶数,则\(x\)已经和\(s_x\)中的点匹配上了
进一步的,发现同一个\(scc\)中的点的\(s_x\)都得同奇偶
考虑反证
否则可以找到一对相邻的点\(x\)、\(y\),其中\(|s_x|\%2=1\),\(|s_y|\%2=0\),直接断了\(x\)除\((x,y)\)外的所有边,此时与\(x\)相邻的只有\(y\),但不能匹配,所以不合法
- 对于\(|s_x|\)都是偶数的情况,则对于\(scc\)无限制
- 对于\(|s_x|\)都是奇数的情况,\(scc\)要是偶环(长度为\(2\)的链也算偶环)
首先\(|scc|\)是偶数是显然的
其次,考虑在一个偶环内部加一些边,我们只需要保留中间的一条边,设它连接的\((u,v)\),把\(u\)在环上隔了一条边的那两个边都删了,此时可以发现,\(u\)下面挂了俩叶子,首先然不合法
只要满足上述条件,这个图就合法了
考虑怎么构造出合法的图,采取以下方式:
- 准备一些偶环(长度为\(2\)的链也算偶环)
- 每次选择\(\geq2\)个连通块,并在每个连通块中选一个点,把这些点随意拼成一个\(scc\)
- 重复第二个操作直到整个图连通为止
从圆方树的角度来看,就是一开始有一些方点以及每个方点挂了偶数个圆点,第二个操作就是每个选出的连通块要选择一个圆点,然后我们新建一个方点,把这些圆点都连上去
合法性证明:
首先显然所有合法的图都能这样建出来
考虑建出的图为啥都合法
一开始准备的这些偶环肯定各自都是合法的,考虑二操作的影响
因为每一个连通块都是偶数大小,所以操作二的合并不会影响之前的\(scc\)中的\(|s_x|\)的奇偶性
而对于这个新建的\(scc\),显然里面的\(|s_x|\)也都是偶数,所以合法
又因为新建的\(scc\)的\(|s_x|\)都是偶数,那么\(|s_x|\)为奇数的\(scc\)只能是一开始的那些偶环,后续不会改变环的形状和大小,所以对于\(|s_x|\)为奇数时的\(scc\)必须是偶环的条件也是满足的
那么现在来考虑计数
设\(g_n\)表示\(n\)个点的连通图数量,易得\(g_n=2^{\frac{n(n-1)}2}-\sum_{i=1}^{n-1}g_i\times C_{n-1}^{i-1} 2^{\frac{(n-i)(n-i-1)}2}\)
设\(f_{n,m}\)表示\(n\)个点\(m\)个\(scc\)的连通图数量,有\(f_{n,1}=g_n-\sum_{i>1} f_{n,i}\)
考虑\(f_{n,m}\)(\(m>1\))怎么算
考虑钦定一个圆点\(1\)为根,有\(n\)个圆点,\(m\)个方点,设第\(i\)个方点有\(a_i\)个儿子,那么它内部的连边方案就是\(f_{a_i+1,1}\)的
再考虑把方点和它的父亲连起来,相当于有\(m+1\)个连通块,大小是\(1,a_1,a_2,...\),根据\(prufer\)序列,最朴素的把连通块连起来的方案是\(n^{m-1}\prod a_i\),但考虑到这里的\(\prod a_i\)表示的是选出的每个连通块的“根”,而我们现在已经确定了每个连通块的根(方点)了,所以要除去它,因此方案是\(n^{m-1}\)
加深了\(prufer\)的理解口牙!
再考虑编号,考虑给\(2\sim n\)随机排序,然后前\(a_1\)个分给第一个方点,接下来\(a_2\)个分给第二个方点...,然后又有如果分给同一个方点的两种不同序列的儿子的集合相同,算作同一个,那么有\(\frac{(n-1)!}{\prod a_i!}\),然后\(a_i\)只用满足\(\sum a_i=n-1\)所以会导致出现重复的情况,所以要除以\(m!\),总的就有\(f_{n,m}=\frac{n^{m-1}(n-1)!}{m!}\sum_{a_1+...+a_m=n-1}\prod_{i=1}^m\frac{f_{a_i+1,1}}{a_i!}\)
算答案的时候类似这个过程,枚举初始有\(x\)个连通块,第\(i\)个有\(b_i\)个点,进行了\(y\)次二操作,第\(i\)次包括了\(a_i\)个初始的连通块,整体就和\(f_{n,m}\)的计算类似了,但是还要确定每个初始的连通块用哪个点形成点双且作为这个方点的儿子,所以要带上\(\prod b_i\)
所以答案就是\(\frac{n^{y-1}(x-1)!}{y!}\sum_{b_1+...+b_x=n}\prod b_i\sum_{a_1+...+a_y=x-1}\prod_{i=1}^y\frac{f_{a_i+1,1}}{a_i!}\)
总复杂度\(O(N^3)\)
P10046 [CCPC 2023 北京市赛] 哈密顿 ✩
做这个题的过程非常幽默,不知道为啥一开始推出了一个条件是不能同时存在
+-和-+,糖丸了
绝对值会需要拆开,要么是分讨的拆成\(a_i-b_j\) or \(b_j-a_i\),要么取成\(\max(a_i-b_j,b_j-a_i)\),虽然我一开始是用的第一个想下去的啊,但最后还是归类到第二种思路上的
虽然一般我们也不想要\(\max\),但注意到因为我们求的就是最优解,这个最优解就自己包含了这个\(max\)了,所以实际上没问题的
因此我们只需要将每个\(a_i\)、\(b_i\)都附上一个\(+/-\)号,然后要求\(i\rightarrow j\)的\(a_i\)和\(b_j\)反号
设\(A^-\)表示\(a_i\)中取\(-\)号的个数,\(A^+/B^-/B^+\)同理,那么可以推出\(|A^-|+|A^+|=n\),\(|B^-|+|B^+|=n\),\(|A^-|+|A^+|=n\),\(|A^-|=|B^+|\),\(|A^+|=|B^-|\)
然后又可以发现,对于一对\((a_i,b_i)\),符号类型共有四种:++,--,+-,-+
要满足上面那些数量的限制,就得有 --的数量和 ++的数量相同
再考虑怎么才能走出一个哈密顿回路,显然不存在 +-或不存在 -+是可以的,若 +-和 -+都存在时,则必须要用 --和 ++作为跳板
显然只有单类的一种符号类型是好算的
考虑有 ++和 --的情况,考虑贪心,从全是 +-和 -+跳到有 ++和 --的情况
显然我们会让\(a_i>b_i\)的取 +-,\(a_i<b_i\)的取 -+,下面为了方便,记\(c_i=\max(a_i,b_i)\),\(d_i=\min(a_i,b_i)\),那么全都可以表示为\(c_i-d_i\)
替换一个成 ++就是\(+2d_i\),成 --就是\(-2c_i\),用两个大根堆,每次取堆顶就好,直到堆顶相加\(<0\)或堆为空,这样是不会存在一个\(i\)且它的\(c_i\)和\(d_i\)都被取出来了,证明是简单的
不能取就直接取最大的\(-2c_i+2d_j\)(\(i\neq j\))即可
复杂度\(O(NlogN)\)
CF2049F MEX OR Mania
emmm...感觉没啥意思的题
显然好的序列的\(mex\)一定是\(2^k\),而\(k\)是\(logN\)的范围的,那么对每个\(k\)维护值\(<2^k\)的子区间,找到所有\(k\)中,最长的、满足子区间中\([0,2^k)\)都出现的那个子区间就是答案区间
正着做就启发式分裂即可,反正就启发式合并,都无所谓的
复杂度\(O(Nlog^2N)\)
CF1844G Tree Weights ✩✬
这trick也太牛了/se
设\(dep_x\)表示\(x\)到根的边的权值之和
然后限制有\(dep_x+dep_{x+1}-2dep_{lca}=d_x\)
发现如果从\(k=1\)开始,给这个等式模\(2^k\),然后能得到\(dep_x+dep_{x+1}-2\times(dep_{lca}\%2^{k-1})\equiv d_x\mod 2^k\),令\(1\)为根,就能递推了
复杂度\(O(N(logN+logV))\)
「SNOI2024」树 V 图
注意到同色只能是同一个连通块,且相邻俩连通块的中心点距离这俩块的交界要么相等,要么有个\(\Delta=1\)且要偏向其中一侧
直接\(dp[x]\)表示当前连通块中心点在\(x\)处的子树内所有颜色连通块的方案数
复杂度\(O(N^2)\)
「SNOI2024」矩阵
顶级诈骗题啊我服了,\(FHQ\)的\(O(NQlogN)\)只有\(10pts\),好似喵
正解是\(O(N(N+Q))\)的
考虑这个旋转的时候,我们对每个点都维护它周围的点以及和周围每个点的差值,那么逆时针记录一个点周围的所有点
只需要存下处于\((1,1)\)位的点就可以推出每个点的具体位置了
矩阵加也是好处理的
复杂度\(O(N(N+Q))\)
啊?bushi,我\(O(N(N+Q))\)只有\(20pts\)?唉我真服了,神人题
「SNOI2024」拉丁方 ✩✬
屲,二分图,好久没做到二分图了,感觉啥都不会了,岂可修
比较显然的建图
对于\(R=N\)的情况,我们对于\(N\)行建点,然后右侧建\(1\sim N\)的权值点,每一行和它目前这一行没有的权值连边,那么只要得到\(N-C\)个完全匹配的图即可
这是https://www.luogu.com.cn/problem/CF600F的trick,用这种方法即可
然后对于\(R\neq N\)的情况,先把左下角补了补成\(R=N\)的,也就是对左下角再进行一次该算法即可
复杂度\(O(N^3)\)
qoj9479 And DNA
晚上做的,脑子有点卡了啊
首先显然要按位确定,那么分讨一下当前最低位的要求
- 若要求为\(1\)
那么序列会形如 101101101010110...的形式,即要求不能有相邻的\(0\)且不能有长度超过\(2\)的\(1\)连续段
此时不存在进位,就直接考虑前面的位了
- 若要求为\(0\)
此时要么是 000000...,没有进位,直接考虑前面的
要么是 11111...,全部进位,直接\(m/2-1\)就好
那么大概就是一些递归的子问题,边界情况是\(m=0/1\),前一个就是\(1\),后一个矩阵快速幂弄一下就好了
复杂度\(T(N)=\left\{\begin{aligned} &T(\lfloor N/2\rfloor)&&[N\%2==1]\\&T(N/2)+T(N/2-1)&&[N\%2==0] \end{aligned}\right.\)
大概是\(O(logN)\)的,可能主定理能分析?不太会这种的哦,但是大概往下找几层再归纳一下可以知道它的复杂度是\(O(logN)\)级别左右的
「SNOI2024」公交线路 ✩
题目的要求等价于存在一个点能一步到达所有点
点边容斥
只要以当前点/边为根,所有子树中的叶子都有一条伸向其所属子树外的路径即可
具体计算的时候就背包\(dp[i]\)表示钦定了\(i\)个叶子没有伸向其所属子树外的路径,直接这样是\(O(N^3)\)的
考虑到如果是子树做背包总复杂度是\(O(N^2)\)的,所以我们不把反子树也放到背包里\(dp\),那么因为当前只剩这一个子树了,所以能直接算出这个反子树的所有叶子都有一条伸向其所属子树外的路径的方案
复杂度\(O(N^2)\)
pkuwc d1t1
如果对询问的点对都连一条边,那么发现对于当前这张图,覆盖所有边的最小覆盖点集大小\(\leq B\)的话,就能把这些点都当作坏的电池,就根本得不到亮的手电筒
题目的要求就可以转化为最小覆盖点集\(>B\)
手模一下,发现把所有点分成\(A-1\)个完全图时恰好点集大小为\(B+1\)且最优
pkuwc d1t2
显然每个深度的点独立,所以对每个深度单独考虑
提出某一深度的点,建出对应的虚树,对于虚树上的每个点\(p\),如果一个询问的\(x\)处于某一区间,且\(p\)的子树内对应这一深度的点中存在某一个被包含在该询问的\([l,r]\)中,则可被记录
对于\(x\)的限制,用差分即可,那么先来考虑\([l,r]\)的限制
发现存在属于\([l,r]\),正难则反,考虑算出不属于\([l,r]\)的,也即记录\(pre_i\)表示某一\(p\)子树中存在的点\(i\)的上一个存在的点是\(pre_i\)(按标号排序了的),那么就是存在一个\(i\)使得\([l,r]\subset(pre_i,i)\)
那么在虚树上,从下往上维护,合并的过程中,类似线段树合并的,则这个复杂度是\(O(NlogN)\)的
把所有的\((pre_i,i)\)挂到对应的时刻区间上,然后附带一个值表示其所属\(p\)目前的值,显然对\(pre_i\)的修改也能这样表示
现在只要求出所有包含了\([l,r]\)的\((pre_i,i)\)的权值之和即可,因为有时间这一维,所以可以\(cdq\)解决
pkuwc d1t3
设\(f_{x,i}\)表示,\(i-1\)时处于\(x\)点,然后当前先手操作一步,问先手的必胜or必败
首先\(O(N^3)\)和\(O(N^2)\)的都是好做的,考虑进一步
观察到这样的性质,若\(f_{x,i}=0\),也就是说,所有\(x\)可达且\(a_y=b_i\)的\(y\)满足\(f_{y,i+1}=1\),也就意味着\(f_{x,i+1}=1\)
也就意味着,对于当前点\(x\),找到\(mn_x\)表示\(x\)能到达的所有点中有点\(y\)满足\(a_y=b_{mn_x}\)且是最小的\(mn_x\),则答案要么为\(mn_x\),要么是\(mn_x+1\)
那么现在只需要知道\(f_{x,mn_x}\)即可,考虑怎么算
\(scc\)缩点后,从最底层的点开始往上推,显然如果\(x\)可达\(y\),必有\(mn_x\leq mn_y\),那么显然只要得到了所有\(y\)的\(f_{y,mn_y}\)就能推回\(f_{x,mn_x}\)
然后这个推回的过程,硬推可能能卡成\(O(N^2)\)啊,所以要离线一下,然后大致离散化一下即可
复杂度\(O(NlogN)\)
pkuwc d2t1
显然最大的\(dis(x,y,z)\)中的其中俩是直径的端点,这个可以初始指定\(x=1,y=2,z=3\),然后枚举\(i\),再取最大的\(dis(x,y,z),dis(i,y,z),dis(x,i,z),dis(x,y,i)\)
证明只要考虑相当于扔掉了最小的\(dis(x,y,z,i)-dis(a,b,c)\),其中,扔掉的那个就是\(\{x,y,z,i\}-\{a,b,c\}\),显然若\(x\)是直径的一端,一定存在一个点\(p\neq x\)使得是\(p\)被扔
这里已经\(3N\)了,再用\(i\)查询出\(dis(x,y),dis(x,z),dis(y,z)\),共\(6N\)
当然菊花图的特殊情况要特殊考虑
发现知道\(dis(x,y),dis(x,z)\)就知道\(dis(y,z)\)了,所以又有\(5N\)
再考虑如果初始固定\(x=1\),用\(2N\)问出\(dis(x=1,y,z)\),此时\(y,z\)中必有直径端点,再问出对于\(y,z\)的最大的\(dis(x,y,z)\),而且在枚举\(x\)的时候也知道了\(dis(y,z)\),就只需要再知道\(dis(x,y)\)即可,所以是\(4N\)的
对于\(3N\),因为枚举了\(x\),所以知道哪些\(x\)在\(y,z\)之间,设为\(x_0\),则对于\(dis(x,y)\)和\(dis(x,z)\),问一下\(x_0\)在\(x,y\)上还是\(x,z\)上,然后问下\(dis(x,x_0,y/z)\)即可
复杂度\(O(Nlog^2N)\)
CF1179D
显然要求最大化经过添加的那条边的路径数量
把环上的边断了,对于每个连通块的数量\(s_u\),即要最大化\(\sum\frac{sz_u(n-s_u)}2=\frac{n^2-\sum sz_u^2}2\)
那么最小化\(sz_u^2\)
显然可以\(dp_x\)表示这个环是从\(x\)的父亲连到\(x\)子树内的,转移\(dp_x=\min(\min_{y\in son_x}dp_y+(sz_x-sz_y)^2,sz_x^2)\)
答案就是枚举环上的\(lca\),对于\(lca\)只有一条环上边向儿子延伸的,直接\(\min_{y\in son_x} dp_y+(n-sz_y)^2\)
对于有两个的,\(\min_{y,z\in son_x}dp_y+dp_z+(n-sz_y-sz_z)^2\),显然可以斜率优化,维护凸包然后单调栈即可
复杂度\(O(NlogN)\)
QOJ9904
这纯糖吧
套用\(kruskal\),把\(a_i\)排序
对于每次取出的最小的\(a_k\),那么就是\(i+j=k\)的可以合并,发现就是以\(\frac k2\)为中心的去合并
那么可以判是否是回文串来判定是否有需要合并的
如果判到有需要合并的,直接启发式合并
回文串用线段树维护即可
复杂度\(O(Nlog^2N)\)
APC001F ✯✩
我小唐一下
首先显然路径异或能转换成两个点分别到根的路径都异或上一个数
注意到这样每次操作相关联的权值太多了
那么给点赋权值为该点所有相邻的边的值的异或和,则可以发现,每次操作一条路径\((x,y,w)\)时,就是让\(x\)和\(y\)的值都异或上\(w\)即可
最终要求所有点权为\(0\)
那么最优的方法就是找到两个值相同的点,此时可以一起清零
那么现在剩下至多\(15\)个点,显然要集合\(S\)来\(dp\)一下,且只有\(S\)内的所有值的异或和为\(0\)时才合法,此时\(S\)的操作要么从子集\(T\)和\(S-T\)转移过来,要么就是直接对\(S\)操作,次数是\(|S|-1\)
复杂度\(O(N+3^{|V|})\)
P5443 ✬✩
我分块咋这么烂呢
对操作分块,设每个块大小是\(B\)
那么对于当前块,不确定的边是\(O(B)\)个,询问也是\(O(B)\)个
从重量大到小枚举询问和边,对于确定的边直接并查集维护了,对于不确定的,因为只有\(O(B)\)个,所以直接枚举看是否合法,然后可撤销并查集即可
复杂度\(O(N\sqrt NlogN)\)
能通过归并排序变成\(O(N\sqrt{NlogN})\)
CF1340F
还是分块一手啊,这个修改显然能直接暴力重构该块最终的括号的状态
考虑查询,每次合并两个块的前一个的右括号和后一个的左括号部分,显然取它们的长度的\(\min\)再\(hash\)判一下是不是回文的就好,此时再直接把后一个剩下的压入前一个即可
具体的,可以用三元组\((b,l,r)\)表示当前这一段是由块\(b\)的\([l,r]\)部分构成,这样\(hash\)值也不用重算了,直接每个块里自己算好就行
复杂度\(O(N\sqrt N)\)
CF1588F
还是对操作分块
每个块只涉及\(O(B)\)个不确定的\(p_x\),把剩余确定的先放到一个连通块中,现在就有\(O(B)\)个连通块
显然每次加法操作可以便利其涉及的连通块然后打\(tag\),查询的时候,差分成\([1,r]-[1,l-1]\),然后算出该块开始前的这个的答案再便利所有连通块考虑\(tag\)的影响即可
复杂度\(O(N\sqrt N)\)
qoj5357
我服了课件了,就说是个淀粉树,谁知道是随便取分治中心的淀粉树,流汗.jpg
这个显然就可以子树合并上来嘛,\(dp[x][i]\)表示当前\(x\)的连通块的\(x\)在淀粉树上的深度,则合并\(x\)和\(y\)时有
\(dp[x][i]\times dp[y][j]\times C_{i+k}^i\rightarrow dp[x][i+k]\)(\(0\leq k\leq j+1\))
把组合数拆开,转移的时候优化一下就可以做到\(O(N^2)\)
qoj7514 ✯✩
youqumiao
首先发现\(n,m\leq 1e3\),主要是\(m\)也是一个比较小的级别,那很好乐
考虑枚举一个点\(x\)作为完全图中那个,\((度数,编号)\)最小的点
首先发现可能处于这个完全图中的只有\(O(\sqrt M)\)个点,因为点数就会是\(\min(d_x,度数\geq d_x的点数)\),显然\(d_x\leq\sqrt M\)时是\(O(\sqrt M)\)的,\(>\sqrt M\)时还是\(O(\sqrt M)\)的
然后剩下的显然要来点状压,但是直接状态\(O(2^{\sqrt M})\)有点恼火,所以\(bsgs\)一下变成\(O(2^{\frac{\sqrt M}2})\)
总复杂度\(O(\sqrt M2^{\frac{\sqrt M}2})\)
CF1874F
首先会想到容斥,但是对于容斥到两个相交的区间很麻烦,但是发现对于相交的区间\([l,r]\)和\([a,b]\)(\(r\leq a\)),则显然\([a,r]\)也是一个排列区间,此时容斥集合中有\([a,r]\)与无\([a,r]\)的系数恰好相抵消,也就是说我们只需要考虑区间不交或包含的情况即可
设\(dp[l][r]\)表示区间\([l,r]\)的答案(即\([l,r]\)用\([l,r]\)填,且容斥的集合不包含\([l,r]\)的答案),\(f[l][r][t]\)表示区间\([l,r]\)中有总长为\(t\)的散段
复杂度\(O(N^4)\)
QOJ7610
显然对于一对点\((x,y)\)求它们的\(dis\),设\(up_x\)为所有经过\(x\)的路径中最高的\(lca\)的\(lca\)
那么贪心的求法就是一直跳\(up_x\)和\(up_y\)直到跳到的点的深度\(\leq dep_{lca_{x,y}}\)。答案就是\(x\)和\(y\)跳的步数之和,且设\(x'\)和\(y'\)表示分别跳到的深度\(>dep_{lca_{x,y}}\)的深度最小的那个点,若\(x'\)和\(y'\)同属于某一道路中,答案还要\(-1\)
那么记录\(dp_x\)表示\(x\)到非\(x\)子树内的点的答案之和,对于\(dp_x\)的转移,只要从\(dp_{fa_x}\)再加点东西就可以转移了,当然可能需要先从下往上处理点东西再从上往下\(dp\)的算,然后对于\(x\)子树内的点,从下往上的过程中就可以算好了
复杂度\(O(NlogN)\)
CF1494F
手模一下发现对于第二类走法,只能走菊花
那么现在可以枚举菊花的中心,要求删它的几条边,使得剩下的所有点(除孤点外)都联通且所有点度数为偶数,或该点与另一点度数为奇数且其余点都是偶数的度数
然后大概就是分讨一下之类的,比如若不与中心相连的点中有奇度数的,就把与中心相连的所有奇度数的点的这条边给断了;没有的话,对于周围点还是有奇度数的点,当然最好就剩一条和这些点相连的点,那么可以先全删了,再来看加入哪一条可以是的所有点联通(除孤点)
复杂度\(O(N(N+M))\)
CF1499G ✯✩
如果只是问你\(\sum_{v\in V}|r(v)-b(v)|\)最小,那就是度数为奇数的点的数量
但是因为要时时维护染色状态,那就不好搞的
还是分奇度数点和偶度数点考虑
若我们定义每次走一条路径,不能经过染色的边,且一次给经过的边染色为...,\(r\),\(b\),\(r\),\(b\),...,则显然对于一个点,它的红边和蓝边相当于可以两两匹配,就钦定从其中一条进入该点后必须从另一条出去,对于奇度数单出来的那个点,它就是一条路径的起点,发现可能走出一个环,但由于是二分图,所以一定是偶环
对于环的,后续再怎么添加也不会影响它们的染色,就相当于可以直接从图上删除了
对于链的,首先显然只有链的端点是奇度数点,中间都是偶度数点,且一个奇度数只会作为端点会且仅会出现在一条链中
对于连边\((u,v)\)
-
若\(u\),\(v\)均为中间点,直接新建链\(u-v\)
-
若其中一个是中间点,另一个是端点,设\(u\)是端点,那么就是在\(u\)所处的链上再加了一条边,根据这条链本身的染色可以弄出来,这里显然并查集,那么我们后面也用并查集的做法来做
-
\(u\)、\(v\)都是端点
- 若\(u\)、\(v\)在链上连的那条边异色,此时只能是\(u\)、\(v\)属于不同的链,直接把其中一个反转下颜色即可,然后两条链合并
- 若同色
- \(u\)、\(v\)同链,可以给这个链打个废弃的\(tag\),表示这个链的信息作废,后面再涉及这条链上的点的操作时,给它们新开个点来操作即可
- \(u\)、\(v\)异链,直接链上即可
复杂度\(O(N\alpha(N))\)
动态dp(ddp)and 全局平衡二叉树
全局平衡二叉树感觉就可以理解为静态的\(lct\)口牙
https://oi-wiki.org/ds/global-bst/#建树
然后动态\(dp\)
- 用广义矩阵乘法来做的(多用于序列,树也常用)
about 这种广义矩阵乘法
设\(C=A\times B\)为\(C_{i,j}=\bigoplus_{k}(A_{i,k}\bigotimes B_{k,j})\)
若\(\bigoplus\)满足交换率、\(\bigotimes\)满足交换律和结合律、\(\bigotimes\)对\(\bigoplus\)来说有分配率,那么这个广义矩阵乘法就有结合律
- 轻重链树剖,然后双\(log\)树剖/单\(log\)全局平衡二叉树维护(用于树)
具体的,对于每个点,维护\(f\)表示把它自己和它的所有轻子树的答案合并起来得到的东西,\(dp\)在树剖下表示当前点到重链底的\(f\)合并起来的答案,在全局平衡二叉树下表示以它为根的那个二叉树的所有点\(f\)合并起来的答案(也即重链上的一段区间)
当然这两种并非独立,大部分时候会结合起来用
「JZOI-1」旅行
无修改,\(min+\)矩阵 + \(st\)表 \(O(NlogN)\)维护即可
[ABC246Ex] 01? Queries
普通的矩阵+线段树维护即可
复杂度\(O(NlogN)\)
【模板】动态 DP
全局平衡二叉树板子
复杂度\(O(NlogN)\)
「JOI Open 2018」猫或狗
答案就是最小同色连通块划分数-1,全局平衡二叉树可维护
复杂度\(O(NlogN)\)
网络流(炒冷饭)
CF884F Anti-Palindromize
若我们连边\(i\rightarrow j\)表示最终\(a_i\)跑到了位置\(j\)上,可以发现发现最后会形成一些环,也即有\(i\rightarrow p_i\)
比较经典的二分图匹配的样子
但还要求了最后的\(a'_i\neq a'_{n-i+1}\),这个好办,只要把\(i\)和\(n-i+1\)压缩成一个点就好
那么左侧就是\(0\sim25\)的颜色点,每个颜色点向右侧的位置\(i\)点连\((1,\max(b_i[i==a_j],b_{n-i+1}[i==a_{n-i+1}]))\)即可
网络流就好,复杂度\(O(N^3)\)
ARC107F Sum of Abs ✯✩
注意到一个点的贡献只有三种状态:删掉了,贡献\(B_i\),贡献\(-B_i\)
考虑最小割,割的就表示选择的,连边\(S\rightarrow x_1\rightarrow x_2\rightarrow T\),分别表示\(B_i\)、删掉、\(-B_i\)
那么原图中的边\((x,y)\)就在网络流中连边\((x_2,y_1,INF)\),\((y_2,x_1,INF)\)即可
复杂度\(O(N^3)\)
[AGC038F] Two Permutations ✯✩
显然最小割,但是发现如果就直接\(i\)连边\(S\)和\(T\)分别表示选\(i/Q_i\) or \(P_i/i\)不太可行,主要是无法满足最后\(A_i\)和\(B_i\)是排列
考虑一下题目的性质,发现如果连边\(i\rightarrow P_i/Q_i\),那么会连出一些环,且对于每个环,只要内部有一个点变成了连边\(i\rightarrow i\),那么这个环就会被拆成内部所有点的自环
那么我们用\(S\)表示环\(i\)会被拆,\(T\)表示不会被拆,割了表示选了
分讨一下怎么连边,设\(p_i\)表示\(P_i\)所属的环,\(q_i\)同理,上面\(S\)、\(T\)的状态对于\(q_i\)和\(p_i\)相反
此时一定满足\(A_i\)和\(B_i\)是排列
- 若\(P_i=Q_i=i\),显然只能这样取了,必耗费\(1\)的代价
- 若\(P_i=i\),\(Q_i\neq i\),则\((S,q_i,1)\)
- 若\(P_i\neq i\),\(Q_i=i\),同上
- 若\(P_i\neq i\),\(Q_i\neq i\)
- 若\(P_i=Q_i\),互连\(1\)边
- 若\(P_i\neq Q_i\),那么连\(1\)边
复杂度\(O(N\sqrt N)\)
[ABC347G] Grid Coloring 2 ✬
感觉最小/大权闭合子图的题很少见捏?
这种\((a-b)^2\)不好处理,虽然我们知道肯定要建权值的点,但建了之后就不好搞了
这里我们权值的点\(i\)就定义为值要\(\geq i\),考虑\((a-b)^2=\sum_{i\geq1} [a\geq i](2i-1)+\sum_{i\geq1}[b\geq i](2i-1)-2\sum_{i\geq1}\sum_{j\geq1} [a\geq i\&\&b\geq j]\)
那么权值点\(i\)就赋值为\(2i-1\),连边\(i\rightarrow i-1\)
考虑后面的\(-2\sum_{i\geq1}\sum_{j\geq1} [a\geq i\&\&b\geq j]\),可以枚举\((a,b)\)的具体值,然后新建点\(p\),连边\(a\)对应i权值点的\(p\rightarrow a\)和\(b\)对应权值点的\(p\rightarrow b\),\(p\)的值是\(-2\),因为要求的是最小权,所以选了\(p_{a,b}\)就会把所有\(p_{\leq a,\leq b}\)都选上的
在考虑点\((i,j)\),若\(A_{i,j}>0\),则它的\(A_{i,j}\)是必选的,且\(A_{i,j}+1\)是必不选的,那么新建点\(U=+INF\),\(V=-INF\),\(V\)连向必选点,必不选点连向\(V\)
复杂度\(O((N^2)^3)\),跑不满啊当然
P3749 [六省联考 2017] 寿司餐厅
依旧最大权闭合子图啊
\(a_{i,j}\rightarrow a_{i+1,j}\),\(a_{i,j}\rightarrow a_{i,j-1}\)
然后\(mx^2+cx\)可以表示为选了种类\(x\)就有\(mx^2\)的代价,每选要给种类\(x\)的,就有\(x\)的代价,这个直接加到\(a_{i,i}\)上就好

怎么2025年了啊???
浙公网安备 33010602011771号