要结束了(NOI2021前训练笔记)


*为口胡
OIer就应该像钱易一样!!!!!!
7.28
还是结束了,再见。
我说再见,就一定会再见。一年后一定一定会继续更算法相关博客。

7.20
CF1368H1
网络流最大流模型->最小割->染色相邻不同代价+1

7.19
uoj667 这玩意限制和子树里没关系,和上面有关系,状态就设和上面有关的。选的个数为底数可以考虑维护0,1,...,k次幂二项式定理。

7.16
t1 拉格朗日乘数法:要求f(x),约束g(x),求h(x)=f(x)+λg(x)的极值。对每个变量和λ为主元求导。
t2 给一个在主对角线上的正方形矩形修改相当于差分之后基尔霍夫矩阵,转化为生成树计数。
loj6300 组合数行和可以考虑用昨天的式子用莫队递推。

7.15
t1/t3 不要忘了00=1C(n,m)=C(n1,m1)+C(n1,m)

7.14
CF1392G
把区间操作拆成后缀分别给初始串和目标串。肯定是让公共部分最大,那就枚举这个最大部分,看啥时候能行。FWT做超集最大/小值。
t1
假如要求以每个点为左端点,最靠左的右端点使得区间包括所有颜色。左端点为1的话右端点就是每种颜色的第一次出现位置最大值。
左端点从l移到l+1的时候,相当于和nxt[l]取max,那么令nxt[0]=ri[1]的话,ri[i]=maxj=0i1nxt[j]
修改就线段树维护nxt的最大值,可以暴力修改每个前缀最大值的位置。因为个数小于等于n,每次修改至多减1,复杂度为增加的量,所以均摊修改次数为O(n)
t2
赛时想了个dp,化成线性复杂度之后式子形如一个基环树上选边的过程。这是我赛时没十年脑瘫想不出来的玩意
基环树个*,倒序枚举的话,他如果往后更新根本没用,所以他就是个森林上选边的过程。那么带修就可以是跑不满的O(n2)了,就能过了。
优化就和三叉神经树那题一样,直接用LCT维护,在splay上二分到哪。

7.13
AGC054D
显然ox相对顺序肯定不变。但是我没注意到最终括号序列也是一定的。只考虑让括号序列最优的话,不会让他俩之间贡献变劣,因为只要x的深度大于0就行,所以没必要为了x交换)(。所以直接归并即可。
七一挑战赛t1
他给你那个拼接不是白给你的,得用啊。若干字符串拼接起来,和模式串的一段区间的LCS,可以考虑处理出来每个字符串和模式串每个区间的LCS,然后用区间dp形式合并起来。
我也不知道哪来的决策单调性,就能过了
四边形不等式优化
f[l][r]=mini=lr1f[l][i]+f[i+1][r]+w(l,r),如果w(l,r)满足交叉小于等于包含,那f也满足。证明再说
最小最优决策点p[l][r]满足p[l][r1]p[l][r]p[l+1][r]。这样时间复杂度降到O(n2)。证明比较显然。
x除掉所有和d有关的质因子之后的因数。一直求g=gcd(x,d),令x=xg。重复进行直到g=1

7.12
t1
粗略的,还被学弟提醒了一下,可以想到就依次决定每条对角线,同时决策行。可以dpi,j表示前i条对角线,最后连续选了j条,方案数。这样是O(n2)的。
但是发现会算重,因为选满的会算多次。那就可以就钦定每条对角线都不被占满即可。这样的话转移就是O(n3)的。
t3怎么又是原题/fn/fn 都不知道是谁抄谁了
CF1545C
首先对于每一列,按照这一列的值分类,一组合法解一定是每一类选一个,且满足符合每一列的分类方式。容易发现如果有一列存在一组只有一行,那么这行一定要选。我止步于此
首先考虑上述操作,如果有一行一定要选了,那么和他存在一个公共位置的也要删掉。由于每个点度数至少为1,所以任何时刻可以保证需要选的大于等于剩下的一半。
那么就有,如果不存在一组只有一行,那么一定是每一列都是每组恰好两个。
然后这个时候,把有相同的位置的行连边。这是个二分图,且最大独立集恰好等于点数/2
就是因为每条边都需要两边恰好选了一个,那么必然是二分图。有二分图,而且ii+n之间必然有边,所以左部右部点数相等,最大独立集恰好为点数/2。
还是去掉一定的东西,剩下的东西会有想不到的性质。

7.11
mdzz……

7.10
uoj636
我想了个f(i,x1,y1,x2,y2)表示以i结尾,最后颜色为x1,能量为y1,倒数第二个为(x2,y2)方案数,加上转移复杂度O(nlog3n)
实在是蠢,真是不长脑袋,后面那三个玩意有啥用啊,不就是想知道一不一样么,直接设个0/1不就完了。。。O(nlog2n)
t2
首先题意转化为至少存在一个连续段为2k1。正难则反就是连续段长度至多为2k2
写出dp就是枚举最后一个连续段长度jdpi=j=12k2dpij(m1)dp0=mm1
前缀和优化就是fi=fi1+(m1)(fi1fi(2k2)1)=mfi1+(1m)fi(2k1)
发现他等价于从0开始走,初始价值为mm1,每次要么向右走1,价值乘上m,要么走2k1,价值乘1m。求所有走法的价值之和。
那么你可以枚举走2k1的步数i,价值就是mni(2k1)(1m)i,方案数就是C(ni(2k1)+i,i)。乘起来即可,组合数用卢卡斯定理。这是O(nklogpn)
k小的时候直接跑矩阵快速幂。
n2e9!!!!!你稍微不注意就加爆了!!!!!得乘1ll!!!!!!
t3 有空就学

7.9
连续三天没有写代码,但放弃终究不是我的性格,爬起来狂奔向终点吧。
就算我投丢了前20投,我也相信第21投一定会进。——Allen Iverson
t1
用一个以i=0nC(n,i)ijj次项系数的EGF来表示。EGF很容易搞出来eax的形式,正好这题遍地二项式定理形式,就是(ex+1)n,多项式快速幂
几天前的t3
首先任意一堆可以mod(ai+bi)。如果是后手必胜,那么就相当于是令先手选的看做新加上的ai+bi的部分,后手就跟着选一个互补的。这样就变成小局面了。
如果先手必胜,先手先选小局面的第一步最优,然后后手选的看做新加上的部分,先手也跟着选一个互补的,就又归约成小局面了。
然后就是一堆石子要么是只给A有用,要么只给B有用,要么对两人都没用,要么对两人中先选的有用。
那肯定是优先选给自己的收益-给对方的损失最大的。后面就拿个线段树维护。
前天t3
首先枚举轮数,那么初始让他把1kn铺满,然后从后往前依次往后拉。注意到如果拉满到了最后,一定加的是定值mkn。那么就可以知道拉满到了哪,之后至多有一轮会有变化。这样是O(mn×n)的。
然后莫名其妙的关于轮数有凸性,三分即可。
前天t1*
卡特兰数的递推式在合法括号序列意义下枚举的东西是第一个括号内的长度。那么这个题就很显然了,根据这个意义可以写出一个dp,直接半在线卷积优化。
关于自己卷自己:首先只有l=0的区间才会出现rl>mid的情况。那么在l=0的时候只做f[0,mid]×g[0,mid]->f[mid+1,r]
然后在l0的时候补上两头贡献,就是f[l,mid]×g[0,rl]->f[mid+1,r]g[l,mid]×f[0,rl]->f[mid+1,r]。这样就把所有贡献都补上了。
前天t2*
逆序对个数1e5级别,那么给两个区间归并的时候,归并出来的段数一定是n级别,因为小于一个数的数个数种类数一共有n级别。
那么就直接主席树查询,暴力O(nlogn)合并即可。
t2*
考虑那个形式是1(ts)k(sts)k,二项式定理拆开成t0,t1...,tk的形式。维护这玩意之和。
还有一个是1(riL+1s)k(Rris)k,拆成关于riL的二元函数形式,维护系数。
直接上树上前缀和,再来个bfs序前缀和,到最后把系数乘上即可O(nk2)
CF1540B
就考虑每个点为起点,每对点有贡献的概率。然后就转化成发两种牌,每次有一半的概率发红桃或发方片,求红桃先达到x比方片先达到y的概率。
我一开始跳坑里了,以为就是yx+y,但是冷静一下发现不一样,这个不是一共x+y张牌随机打乱,而是一张张发,是不一样的。不过这个简单dp一下也就行了。

7.6
CF1542E*
就是枚举一个公共前缀,这一位要p大于q,再枚举两个在前缀中的排名,这样可以得到两个序列除了后面内部的逆序对之差。
然后就设一个fi,j表示两个长度为i的排列,pq逆序对多j的方案数,转移记录一些前缀和应该就能O(1)了。两部分都是O(n3)
Bytecamp2020最短路*
fi,j表示从iM,从Mj的最小权值和。转移的时候如果枚举到了一样的东西就只算一次。
但是有一种情况需要特判,就是jiM的路径顺着走。那就特判这种情况加一种转移即可。
t1*
首先注意到0011不合法。
那么显然是若干个0的连续段,中间夹一个1或者反过来,而且连续段长度也得是极差为1。
这也不是充分的,因为如果出现了连续的x,x,x+1,x+1,也是不行的。
那么你可以把每一个连续段都去掉一个。递归成了子问题。
然后相当于辗转相除,枚举初始0的个数,就能把O(n2)个合法的全都求出来,再暴力匹配判断即可。
t2*
肯定把特殊位置值减去其他值x,再枚举这些值选到了哪些,剩下都按x算。
可以发现如果选的特殊值个数n2,那么剩下的排列奇数个数和偶数个数一样,总贡献一定为0,所以一定选了n1n个特殊值。
发现特殊值位置形如(i,pi)(pi,i),那么就是一些树边。对角线相当于自环,其他位置相当于任意非树边。
那就分几类讨论一下,记是否连自环,是否在包含非树边的链上,在链上方向,奇偶性。复杂度O(n)

7.5
CF1299E*
就连O(n2)都好神啊
如果check n1成功了的话,一定是丢掉了1n。那么可以确定出来哪个是1哪个是n。然后可以查出来每个数奇偶性。变成n2的子问题。这是O(n2)
考虑求出来模3,5,7,8的余数,再crt。
先求出来1,2,3,4,n3,n2,n1,n,然后可以通过组合这8个求出来每个数模3,5,7,4的结果,然后再通过8的求出来模8
啥脑子能想出来这种东西啊/px完全离谱啊
loj3274
如果我喜欢她,那么就把我向她连边。再把和我原色一样的连一条边。形成的也是一个二分图。
如果一个人喜欢的人也喜欢他,那么他俩是检验不出来的,因为他俩在一个集合里都会变成对方的颜色。所以互相喜欢和没有特殊关系是一样的效果(悲
如果不是互相喜欢的话,那么只要这个集合里包含我喜欢的,或者喜欢我的,或者和我颜色一样的,颜色种类都会小于集合大小。
那么如果通过这个性质把图建出来了,就很容易求出和我颜色一样的。
至于建图的话,可以从1到n依次考虑连向比他编号小的边。可以考虑把之前的人划分成两个集合,集合内部没有特殊关系,那就可以分治检验哪个人和i有特殊关系。
次数O(3nlogn+3n)

7.4
t1 肯定是考虑枚举一个连续上升段来容斥。那么容斥系数是啥?不是子集反演,也不是二项式反演,也不是斯特林反演。
啥也不是,那就算呗。我们想要达到的效果是m的系数为1,否则为0,那就构造一个G1G=F即可反解出来容斥系数。后面就是个常系数齐次线性递推。
另一个t1
第一个矩阵考虑把每个ai,然后可以分治ntt。
后面有0的话,相当于再乘一个(1x),二项式定理拆一拆,再做两次卷积。

7.3
t1 每个石子独立,就考虑一个石子给当前人带来的步数收益即可。完全想偏了5555
loj3353*
对于象只能斜着走,就贪心来回走,和最终位置差多少,就删掉多少个端点,就是个组合数。
王的话,正常dp可以用矩阵快速幂优化,可以用常系数齐次线性递推优化。但是初始值算的复杂度不太行。但是考虑只有最终纵坐标和初始的偏移量是有用的,就可以直接dp这东西。
不经过边界的话,翻折法即可。
另一个t2*
f(u,i)表示u子树确定,到根链上最大值排在第i位的权值和。就每次决策u放在哪个位置。

7.2
B* 查询区间之外的东西。。。。这种本来就是正难则反,就可以求出来每个点最早/最晚什么时候被覆盖,然后就是个二维数点了。
昨天t1
想到大部分了啊,败给了除以0。。
考虑只有2k个不同的“区间”。直接在这些分界点处打乘法标记,做一次乘法意义下的高位前缀积即可。构造的这个东西需要满足子集积为某个子集和,就是个IFWT,或者暴力枚举子集。
没有被一个非空集合覆盖的地方应该乘一个0,后面应该有一个除以0,再乘一个数的操作,维护一个a×0b即可。
暴力求子集积可做到O(n3k+n2klogp),反正过了。如果非要用FWT的话还涉及求逆元在复杂度瓶颈上这个问题多log,所以还要直接维护逆元。。常数好大可能还不如暴力枚举子集。
n个点,其中k个关键点,每次随机在剩余的里面选择一个,求第一次选中关键点的期望时间。
考虑每一个非关键点的贡献,那就是这个点比所有关键点先选中,概率为1k+1,那么总贡献就是1+nkk+1
当然直接用期望dp推也能推出来
CFgym103055K*
就考虑每对点期望被干掉的时间-1。就用上面的结论可做到O(n2)
至于怎么求出来cnt[k],考虑每两段可以贡献一些,本质不同长度段只有O(n)种,暴力枚举复杂度就是O(n)的。做个二阶差分即可。

7.1
t3* 设dpi表示LIS长度,fi表示最大价值。
那么肯定对于dpi分层转移fln函数是一个凸函数,容易发现这个转移有决策单调性。所以分治就好了。要满足j<i的话,就分治的时候强制钦定即可,也满足条件。
另外一个t2
离线之后直接转成楼房重建线段树。要注意剪枝。

6.30
t2 区间dp决策端点,怎么又没想到啊,怎么回事
AGC036D*
这咋想到差分约束的/px
然后就是形如一个区间至少有一个1,至多一个1,就直接dp即可。
t3
可以拿至多m个,可以拿一堆任意多。求sg函数。就是最低位m+1进制,高位二进制。做异或。
只知道归纳证明。。就是考虑末位不足的话,直接用1操作即可。
否则除了最低位严格小于,考虑把xm+1的部分用正常nim游戏拿,满足了正好小于。剩下的部分一定小于等于m,那就用这部分调整。
后面就枚举最低位是啥,FWT即可。

6.29
就不该打那个vp……体验极差不说,还把改题时间占没了,数据结构甚至没写完……(而且好气一天都荒废了,自闭了。之后就多吃点苦吧,把这天补回来。

6.28
t1 别的不说,我肯定在做梦。
CF325E* 奇数无解,因为n12必然至少出现两次。
偶数就把2k2k+1分成一组缩点,缩出来的图的欧拉回路就是原图哈密顿回路。
BOI2015 Tug of War*
考过类似的东西,一个东西能选A集合的aiB集合的bi,就把aibi连边,必然基环树或树。
这题必然基环树。差为K就是个背包,用不同权值n种,二进制分组优化。

6.27
PA2014 Druzyny*
首先上界限制是一段区间可以直接处理。上界限制根本不是一段区间,考虑cdq最值分治大力考虑。暴力做是O(n2),用启发式分裂的话,左边分四种情况讨论即可做到O(nlogn)
loj6668*
一段前缀对一个数异或的话,就按位把1位取0后面通配变成前缀和。
这个东西他是关于nlog次多项式,可以直接插值O(log4)
这个有一个更厉害的直接求系数的做法。。。不会
t2 模型比较简单吧。后面n3优化成n2的时候可以考虑对于每个终点计算折线个数。
后面那个[xi]i考虑求导。。别的随缘吧

6.26
t3 考虑f实际上就是只通过重链和奇数轻边能走到的叶子。g一样。所以dp出来这些叶子个数的方案数。
后面就枚举最终达到的叶子的cd即可。O(n2)
我以为n2够暴力的了,结果O(nk2)更暴力。。。。直接记他是否能超过即可。
CF1149E 考虑把一个点的组号设为所有后继点的组号mex,然后考虑每组异或和情况。发现是否全为0,这个和正常的nim游戏都是必胜存在操作->必败,必败全部操作->必胜,所以直接按这个构造。

6.25
t3 肯定是考虑类似GSS,分治求最大子段和。咋还不会合并了呢?合并不就是横坐标和纵坐标都相加的点集么?这就是闵可夫斯基和。
CF1214G
推一推可得无解条件为任意两行需要满足一个是另一个子集。然后自然想用set维护偏序关系,但是如果出现有解情况就没法处理了,于是开始离谱尝试LCT无果自闭……
其实不用全维护出来,用set维护其中一个合法链即可。只要这条链长度不为n就一定有解。每次判断取不在这条链上的任意一行暴力判断是否能插入即可,复杂度均摊O(nlogn+nQw)

6.24
t3 二维的烦,考虑合法点是否是一段区间。如果(x,y)合法,那么(x+2,y+1)一定合法。那么对于一条斜率为2的直线,合法点一定一个点右上方。。这种区间……
后面就是个容易的n2dp,打表发现只转移前200个就是对的。

6.23
CF713C 严格递增可转化为a[i]i单调不降。这样所有数必然是出现过的数。
CF1534G 对于贡献为切比雪夫距离的,没必要刻意旋转45度用曼哈顿距离去做,最好其实是把等距线,就是那个正方形画出来看。
对于一个点,以他为中心的正方形都是等势面。经过他的斜率为正负1的直线都是电场线(雾)大概就那么个意思
那么从左下往右上走,必然会经过斜率为1那条电场线,而且唯一交点。那么~显然这个唯一交点就是这个路径到这个点切比雪夫距离最小值。
那就把所有点按x+y排序,往右上走的过程中,一定只种在当前这条电场线上面的土豆。那就可以slope trick优化dp了。
APIO2016烟火表演 弱智dp,比较复杂的slope trick优化

6.22
t1 总钱数好算,证明也非常简单。忘加绝对值痛失rk1。。。怎么能犯这种错误啊
这个构造方式还是比较厉害的。考虑直接构造的话可能会出现一个人去和另外一个人交叉省钱,但是会导致前面的一个人不能和其他人交叉省钱了。
那么避免的方式就是从一头扫,时刻令走过去的操作必须和另外一个人抵消的同时走,否则就插入一个新的人递归子问题。这样所有可以匹配的都一定两两匹配上了。
而且每次进行一系列操作,至少有一个人直接出站。操作次数3n
t2 这是什么神仙东西啊,不找规律怎么可能想得到啊
收获了一些神仙组合意义。(m+i)n这种东西完全没有组合意义,考虑把底数转成减法。如果式子里其他地方只有组合数上标和1的幂次,那很好转。
但是有一说一这种东西考场上脑子不开挂谁能想到啊/px
直接推的做法的话,展斯特林数别嫌多,转成组合数之后有无穷无尽的变化,不用在意一时复杂。麻烦的组合数C(n,m)可以表示为[xm](1+x)n
t3 用皮克定理推面积导出高一定这步妙啊。

6.21
t1 乘二项式除二项式可以O(n)诶。。。

6.20
t3* 其实是可以用uoj46的做法的。pushup的时候,对左区间维护两个rmq,这样就可以O(×log)了,复杂度就是O(nlog2n)
不过这么做太难写,且过于强行。
这个区间赋为最大值的操作比较好,倒着考虑的话,就是考虑这个区间两个端点被覆盖的最左和最右,倍增跳即可。
t1 就仔细容斥一下就完了。
ARC121F
还是考虑如何判定。这个还是一个经典的只有点和相邻边,点有影响的操作,还是要考虑树有拓扑序,也就是剥叶子。
对于一个叶子和他上面的边,如果是and1或者or0肯定是没用的,直接缩掉。如果or1,那么把这个保留,一定合法。如果and0,反正也是个固定的结果,不如直接缩掉。
那么判断条件就很显然了,直接dp这个东西即可。

6.19
t1 只要不是极其明显的根号做法,或者有点思维含量的polylog做法,数据结构题我就根本想不到?????
这种区间内,某种特征的数,出现次数之和之类的这种东西,要考虑分块!!!!!!!记区间内如何如何,值域分块,前缀和,这都是O(nn)的。
你三个n乘一起都没事呢,就放心啥都处理出来就完了!
t2 肝了大半场写了个迭代版min25筛差点卡过去可还行。。核心部分
t3 思考时间太短了吧。咋不再好好想想呢。一个点贡献必然和一个相邻点贡献一起出现,要考虑扒叶子。后面其实就比较好想了。就考虑每个点/每条边,出度/入度,之类的,然后发现可以直接贪心,做完了。

6.18
t3(ARC101F)发现只有区间交叉的时候会有特殊限制。把历史最大值作为横坐标,最小值作为纵坐标,那么行动相当于一条从原点开始的折线,右下和左上相当于两种决策。
就把一种划分方式的折线收缩到尽量靠右,靠下,那就相当于所有不存在左上的钦定的点作为折线的左上转折点。所以就相当于求严格上升子序列计数。其实应该再想想的。
ARC122E
脑子啊!我的脑子啊!!
倒着考虑肯定后效性小很多。仔细想想发现只要一个数x能放最后就放最后就行。因为任意一个合法方案,把x抽出来放到这个位置肯定没问题。
想不到这种构造,就完全不敢写啊!!!!!!!!!!!!!!离谱离谱离谱
AGC047D
满二叉树,暴力枚举很多东西都是对的。。。。
枚举每个点子树里的叶子节点,是O(nlogn)的,深度是logn的。
所以可以直接枚举一个lca,直接暴力枚举左子树里的所有叶子节点,再暴力跳另一棵树fa,再暴力枚举右子树统计贡献即可。是O(nlog2n)的,好暴力啊

6.17
CF1534E 切的还挺快。只要意识到他就是通过某种组合异或出来就做完了。
CF1147E* 两个颜色的问两遍,把相邻的问出来即可。三个颜色就先用两次把相邻的问出来,把一样的缩起来,相邻的都不一样,然后再用两次问出来相隔1个的是否相同,所有的就全出来了。
CF1534F* 果然不是直接对图爆做。就是考虑把肯定没用的必删点去掉,这样会有很好的性质,一个点能干掉的必删点是一段连续区间,然后就直接拓扑排序求出区间,贪心即可。

6.16
上午爽耶!
CF1085G
稍微转化一下,问题就剩下怎么求一个长度为i排列,其中有j个已经钦定好的位置需要错排,方案数为多少。
这个dp方式还是没想出来,考虑从dpi,j1来转移,需要减掉除了这j1个错排的位置,有一个放对的位置的方案数。
那么刨掉这个位置就是dpi1,j1,所以就是dpi,j=dpi,j1dpi1,j1

6.15
真不是一般的差啊
t1你写了两个部分分,一个O(nk),一个O(nmk),然后你还切不掉?学傻了吧?
t2
正解思路全想到了,然后你不会表示两组数随机排列,最后一个为一组数的概率?
tmd别学OI了,回班学高中数学吧。
后面用树状数组维护到根路径,维护子树和,你啥能想不到?还弄得全场想t2,t3完全没想。
脑子再这么懒,就没救了!
t3
这种dp咋想到的啊,吐了。真吐了。
f(j,0/1)表示一些数考虑完了,0j1位被通配了,选到每个数方案数一样,第j位是0/1,更高位和总异或和一样,的方案数。线段树维护即可。

6.14
pkusc d1t2*
维护li表示初始ai最靠左能到达的位置。
对于一段区间可以线段树二分出覆盖这段区间的原序列区间[L,R]
发现每次修改只有覆盖l的数可能被吃掉,就判一下他会不会被吃掉,然后单点删除,查区间严格前缀最大值之和,就用楼房重建线段树即可。
真的好难写,不写了不写了

6.13
昨天t3
二维很好做,三维的话枚举一维。由于二维有取max,取min,不是很好撤销。那就考虑线段树分治。
然后是一个前缀后缀取min,max,这玩意直接暴力维护一个区间max,min。
这样的话暴力递归复杂度和区间赋值一样,本质上相当于把线段树上二分和修改捏到了一起。复杂度甚至不是均摊的,严格O(nlog2n)
thupc E
肯定是区间dp,对于一段区间决策这个点和哪个点匹配/不匹配。然后发现变成了两端不交区间是否可以抵消,需要瓶子最浅有多深。
反正n这么小,随便设状态。那就设f[l1][r1][l2][r2]表示需要瓶子最浅有多深,如果无法抵消值为inf。
转移都类似,枚举两侧和哪个匹配即可。复杂度O(C(n,6))

6.12
t1纯降智天啊。。。
t2好几个经典套路堆起来的,没想到还是菜啊。再次发现dp值很小,可以把值和状态反过来记(怎么又没想到!!!!!)
后面的dp里有个难处理的dis,正好这玩意也小,就枚举他。
然后是个类似通配符的东西,和氨基酸序列那个题一样,修改查询平衡复杂度,进制数+1维护。

6.11
t2 链剖之后,n个叶子对应n个链顶,把链顶作为主元,把叶子作为方程,正好能解。
bzoj2957*
考虑直接用线段树维护这个子序列
pushup的时候线段树二分,复杂度O(logn),总复杂度就O(nlog2n)

6.10
CF1456D
真没想清楚,为啥要这么设状态呢?
首先都想dpi,j表示人在i,分身在j,是否合法。
然后自闭了,发现完全可以连续两个东西都用分身。
考虑设一个gi表示分身放在i位置,的最小时间。鬼知道这玩意咋想到的啊,然后就能转移了。

考虑合法的树,在上面依次走dfn序下一个,左边要么+1要么-1,直接dp。
这是什么妖魔鬼怪dp方式啊??????
ARC118E
肯定是容斥,自己想到了容斥dp是要枚举上一个钦定经过的障碍,用组合数算中间方案数,这是O(n5)的。
但是有个好处就是这个题他不光点少,坐标范围也小,所以可以考虑直接用路径右下角位置转移。这么容斥dp就是O(n3)的了。

6.9
t1这有向图不是一般有向图!!!!题里的性质不要忽视!!!!!!!有很多包含关系,可以直接顺着dp。
t2有序->无重复,dp值比状态小->状态和值反过来。
……自闭了,被彻底干爆了。

6.8
累了歇歇。。
t2 cf788e用其他奇怪方法做的,这题就没了。。和cf788e一模一样,就多维护几个值,互相维护即可。
还有个对于这题来说没啥用,但是可能有用的性质,就是多个maxmin乘一起,可以看做把一个集合的数列取反,然后max相乘之和。

6.7
dp转移非常简单,可通过组合意义来看。转化为路径计数,枚举其中一个步数来计数。
CF1536F
想出来了,但是切的太慢了。。思维还是不够专注。
首先注意到无论怎么放都是合法的,然后我想只和长度有关,直接枚举放在哪,做dp,然后推生成函数。。。
然而你这个序没法直接转移给组合数,因为放多少个都不确定,可能中间有A和B中间空一个放不了。
然后我才想到枚举几个空位置。。做完了。

6.6
ARC121D
1个或2个匹配可看做把1个的和0匹配,然后强制所有都两个匹配
t2
真是好题啊。就是求一个需要主席树优化建图的割点。
不过显然建出来图之后和原图割点不一样。考虑模拟tarjan算法,求出一棵dfs树并求出每个点相邻的点中dfs序的最小值,这个最小值的子树最小值就是low值。然后按定义判即可。
求的过程就正常dfs,一个线段树节点记是否子树全遍历过,只有所有点全遍历过才打上标记,以后不再dfs。然后再记一个子树dfs序最小值。
注意每走到一个原图中的点,都需要在线段树上pushup上去一次,这样的话之后dfs才不会有无效dfs,复杂度才是严格的O(nlogn)

6.5
t1一个多项式每项系数平方和,这东西多么完美的卷积形式啊。就是自己卷上改成负次项的多项式的零次项系数。
t3魔怔了吧,pkusc死的还不够惨呗。你一个简单的pre,nxt太弱了,强行表示出偏序关系也太难做。我搞出来偏序关系,居然弄了个莫队套kdt O(n136),实在是弱智行为。
求pre,nxt用到了单调栈,但是他撇掉了太多信息,不如把询问离线,一边做单调栈一边查询信息。这题搞出单调栈之后合法点对特点特别明显,随便算下贡献即可。
ARC117E
折线模型想到了,想到了把水平线往下扫dp,但是又困在不知道什么时候合并了。
不知道什么时候合并,而且只有相邻有限制/贡献,而且这还是这么经典的折线模型,那就摩天大楼dp啊。和前几天的一样,把两边的合并起来。
而且如果依次往下dp,不会感觉转移的也太舒服了吧。转移的越舒服越可能能做到更优复杂度,你知道的太多了。。这题完全不需要知道什么时候添加的什么点,所以直接枚举点的个数,最下一层情况转移即可。

6.4
你在训练,你离国赛只剩一个月了。给我专心点,不要胡思乱想,你甚至不配溜号。
t1一堆东西乘积的和。不可以经过某些,可以把最基础的值分开,比如这题就是1,然后直接乘阶乘即可。也可以理解为一堆数+1之后再相乘,等价于求每个子集的乘积之和,也可以直接做。
这个分类讨论太离谱,就只能拼经验了。

6.3
t1 dp想到了还可以,正解又是神仙组合意义或爆推生成函数,技不如人,滚了。
t2 居然只有一定共面的概率才不为0啊。。。。四元环计数就大向小连边,分3种情况讨论即可,复杂度和三元环计数一样。
CF1523F
自己想到了f(i,S)表示到第i个请求,激活了S集合的塔,最多完成多少请求。
预处理每个集合到一个父集的最小时间,转移枚举上一个请求是哪个,判是否能赶到,复杂度O(3n×m2)
实际上,我根本不需要知道上一次请求是哪个,我只需要知道到底是从哪个集合过来,完成了多少个请求即可。而且第二维这么小,完全可以考虑把dp值和状态反过来记。
就再来一个g(S,w)表示激活了S集合,完成了w个请求的最短时间。复杂度O(2n×m2)

6.2
昨天t3
如果manacher维护的东西,在对称过来取min的时候不能O(1)变化,暴力收缩也是对的,只是要保证最靠右的回文串左端点也最靠右,这样复杂度也是O(n)
CF1523E
自己切掉了还可以。想的还是太慢,这个期望步数,他的可能取值范围只有n,不太可能是期望dp那么转移。
考虑到列出来概率乘取值的式子,发现正好和经典的差分计数那个一样,所以就直接插板法组合数。
CF1523D*
最终答案一定是一个人的子集。
题目要求至少n2个人的子集,那每次随机选一个人,在集合里的概率为12
那随机选50次,错误概率仅为1250。。真想不到啊
P5654
这个笛卡尔树和广义线段树有点类似。不过笛卡尔树查询一段区间就是llca路径上,所有是左儿子的点和右子树,rlca路径上,所有是右儿子的点和左子树,倍增。
CF1523G
合法区间无交这个性质根本没用出来。这个性质这么强咋能不会用呢?????
直接合法区间个数变成nlnn个,只要能暴力枚举出来所有合法区间加起来即可。直接用个BIT套主席树按题意模拟。
区间无交->等价于ai=n,根号分治或调和级数。确定一个区间之后整段被彻底分为不相关的两部分(这道题的正解思路,多校d1t1把我带偏的思路)。或者区间之间关系可以由关键元素排序(多校d1t1)

6.1
t1考虑令两个东西的某个属性相同,要考虑差量。这就可以搜索了。
t2真的挺暴力一个题,就所有状态都枚出来暴力转移就行了。这个状态设计的还真挺神的,他令无论是圆点还是方点都互相影响很小。可能是圆方树上dp的套路吧?

5.31
题没啥意思,人也挺颓的。想把昨天晚上E做了也半天没想进去。
给我静下来,不要再颓了。

5.30
昨天t3
考虑结束的条件啊,就区间内不包含因数的数,都被选中即可。
loj3228
笛卡尔树上ij祖先条件为min[i,j]=ai
比较神仙的是,可以只考虑当前这个区间的最小值位置和区间之间的逆序对的贡献,所有的和满足条件的都可以表示出来。
这和正常求逆序对为k的排列数量的生成函数形式完全一样,可以考虑从这里做。
CF1220F
和上一题反着的,考虑一个点在笛卡尔树上的子树有什么特点,就是在他前面第一个比它小的,和后面第一个比他小的,中间夹的就是笛卡尔树子树。
就扫一遍就完了
APIO2021雨林跳跃
赛时连V字形都想到了,为什么起点终点固定还能想不到?
无解条件,起点位置这都是非常显然的性质。然后考虑答案下界显然是多少步超过区间左端点,再稍微讨论一下就出来了。

5.29
t1修改的和没修改的内部还是有序,可以归并
t2排列,只有相邻有限制/贡献->摩天大楼dp
CF1526E
被干爆了。。
等价条件都想了好久才想出来,然后我居然dp的时候枚举上一个不选这个字符的后缀是啥?????哪有你这么dp的
这么dp一看就没法继续优化了。枚举上一个后缀选啥字符这不是更顺么??
然后相当于如果能和上一个一样,乘一个11x,否则乘一个x1x,最后就是个xt(1x)n,每一项就是个组合数。
其实这么考虑的话,最后一步还是显得有点构造。考虑每一位他要么比前一位严格大,要么大于等于前一位。根据这个,直接枚举最后一个后缀选啥,直接就是个插板法组合数。

5.28
t1变化又是只和大小关系有关,考虑转成01序列。这想法啥时候能记住啊
然后条件就很显然了,n排列的话也就是每个都符合,dp就完了。
t2 这个n^2 dp形式特别简单,就是后缀取max,对应位置相加,单点求值。
考场头铁写后缀取max标记永久化线段树合并,但是这种东西他是一条链上的max相加,你当前合并的两个节点完全可以很小,所以做不了。
实际上观察这个dp的定义发现取max只可能+1,所以直接线段树二分,区间+1就行了。。。。
或者你看不出来也可以维护差分数组啊。。或者区间覆盖也行啊。。。写啥也别写取max标记啊
t3
这结论是真的鬼畜,也不知道gjk大佬咋找出来这种神仙结论的。
k=1的时候,结论为nm2i=1n(nc[i])c[i]1
全文的c[i]!=0都忽略了
枚举完颜色内部连通块,钦定一个颜色的连通块不能连,方案数为(不带标号系数)
nm2i=1n((nc[i])b[i]1j=1b[i]v[i][j]v[i][j]1)
证明
那对于每种颜色,每种连通方式把这些加起来,相当于每种颜色,每种连通方式的后面贡献之和,再乘起来。
这样每个颜色贡献可以分开算了。对于每种颜色,设dpi表示当前颜色已经考虑了i个点的贡献之和。
由于分配标号的方案为一个多重组合数,再除以连续连通块个数相同的段的阶乘。
这样,每次枚举联通块大小放多少个,这样转移是O(c[i]2lnc[i])的,也就是O(n2lnn)
啊啊啊啊不用,就枚举最后一个元素所在连通块大小,钦定最后一个元素在最后一个连通块里,转移系数为C(i1,j1),就能做到O(nk)
CF1220E*
肯定是先走一些能回来的,最后走一条链。存在叶子就特殊,就类似拓扑序缩一下叶子之类的,别的全都能加起来。在叶子那部分取个最大的即可

5.27
AGC041F
想到的部分是笛卡尔树上dp,把列分成三类。
但是对于一个矩形部分做dp没想到其实可以暴力逐行转移。
这是O(n5)的。
后面其实都想的差不多了,就是我发现这玩意是否每行都存在一个车是本质不同的。如果存在一行没有车,那么不存在没车但被覆盖的列。
想到这我想的是可以钦定这个矩形里是否是每行都有车。但是这么做的话,如果每行都有车情况还是一般的,没法优化状态。
其实如果我钦定后面都有车/存在一行没车的话,就两种情况都只有两种列了。这样就可以减少一维状态O(n3)了。
thupc
B整体二分板子
D就考虑一个左端点,合法的右端点是他到根路径上满足一个条件的点个数,树状数组即可小常数O(nlogn),反正他过了。线性我再想想
I就是个数位dp。正好昨天做了个轮廓线dp,今天就看到这个。就轮廓线转移即可。
脑子还是不好使!

5.26
t1如果只判一堆同余方程是否有解其实可以对每个质数分别考虑。所以双指针判断,根据限制强弱维护个单调栈即可
t2*
就是算每个点被多少路径经过。建出圆方树之后,一个圆点被经过的次数,是这个点的贡献,加上和他相邻的方点贡献,减去这些圆方边被经过的次数。
t3
求出最小表示意义下的前缀border,那么
dpi=1+1nj=1ndpnxt[i][j]
nxt[i][j]只有i+1nxt[fl[i]][j]两种可能,把他用dpfl[i]替换一下可得
dpi=dpfl[i]+1nnxt[i][j]==i+1(dpi+1dpnxt[fl[i]][j])
根据定义可得,在nxt[i][j]=i+1的时候,nxt[fl[i]][j]=fl[i+1]
可得dpidpfl[i]=1n(dpi+1dpfl[i+1])[nxt[i][j]==i+1]

5.25
t1 AGC010E
后手策略经典问题。先手定向的话肯定要首先考虑第一个位置放尽量小,后面递归决定。
t2板子
t3 AGC017F
真神仙啊
O(2nn2m)都已经够神仙的了,用插头dp的思路来做这个dp,本质上是把上一层没用信息撇掉,有用信息加起来只有n位。AGC024F也是这个思路。
O(2nnm)那个都让我惊呆了。你考虑记上一层的状态,就是用来限制这一层的选择的。如果能正确选择这一层的话,那记不记都行。
那就始终钦定上一层和这一层一样,如果产生分叉了,就把下面那个东西平移上来,选择01的限制是不变的,而且依然钦定了和上一层一样。
hyw还有个神仙做法貌似是人类可想的,明天问问
差不多55555,就是神仙又切神仙题了,没办法

5.24
UOJ345榕树之心
一开始思路偏了,看到一眼“考虑只算1”我就会了只算1的做法。还是经典结论。考虑他每次只有一条链要走到下面来回转,那么就先走这条链,别的抵消掉即可。
那么不只算1其实类似,走过去的过程中也先走这条链,别的正常抵消,这条链正好供从根走到他。所以并成一个点即可。
ZJOI2017线段树
线段树区间定位操作,实际上是设l1叶子节点为xr+1叶子节点为yflca(x,y),定位到的节点是xf的路径上的点的非链上右儿子集合,和yf路径上的点的非链上左儿子集合。
就考虑不存在两个相邻区间,任意定位区间一定会和当前从边界外1个相邻,否则会合并成一个更大的完整区间。
如果求一个点和一条竖链上的一些点的lca的深度之和,不用那个套路,直接和链底求lca,分两段求。
uoj217奇怪的线段树*
考虑一次区间覆盖,覆盖到的区间从左到右依次为一堆右儿子,然后是一堆左儿子。因为值域连续的左儿子和右儿子能合并成一个更大的区间。
所以反过来也是对的,任意一个合法的区间序列,也唯一对应一个区间。
那就dag最小路径覆盖。
CF1527D*
沙比提,就差分之后变成0到x-1都出现过的路径数,直接就判一判做完了。不过可能是少数我自己想到差分的题。。

5.23
NOI2017泳池
这种分成两部分的dp其实不是很难想啊,我其实都想到这个地方了,但是总感觉0和其他没必要分开。但是0和其他有本质区别,这可以直接把问题划分成和下标无关,只和长度有关的子问题。
那么划分成中间之后,下标范围只有k,那么就可以直接把每个高度划分成两边dp了。
后面就是个常系数齐次线性递推。就是先HC定理,然后用xn对特征多项式取模。

5.22
apio考的稀里哗啦 t2小的一边一定能走到大的一边关键性质没找到,自闭了。
讲道理这性质真的不难想,真的没好好想。
thusc:*
t2无脑题,考虑直接维护向上的dp值,一个LIS,一个LDS,用线段树合并维护。
然后考虑往下的时候得是LIS那边的i下标,和LDS这边的一个j下标,得满足i<j。这玩意就再正反跑两边启发式合并统计答案即可。
t3沙比题,直接对每个人父集和,FWT与卷积。

5.20
t1根号分治没想到不应该。t2原题爬
t3依次向后考虑用最后出现位置计算贡献。
apio讲了几个有意思的题回头新开一个记一下

5.19
t3那个类似%x=y查询,单点修改,全局很好做,但是这个题他不只是加区间,他查询修改都有性质
修改一维接地,这就可以直接存下了。查询查的也接地。
多看看查询修改有啥性质
t2
k=1经典题 k=5就找pre nxt一样啊
t1*
sub3明示欧拉回路 想不出来。。。

5.18
CF1439C
考虑减少的过程,对于一个位置ai,考虑他后面第一个小于等于他一半的位置aj。当前数y连续减掉从i开始的一段,减到ak,假如k>j那么已经减少了至少一半。
否则再去找下一个他能减的位置,发现对于任意k<t<jakatai2,那么还是减少了一半。
那么就至多有logy段。直接线段树二分。
CF1439B*
判断1就直接拓扑排序删度数小于k的点
否则就找团。找一个度数为k1的点,O(k2)判断。复杂度O(mk×k2)=O(mk)O(mm)
CF1439D
显然这种题需要有两个dp数组,一个记录答案,一个记录方案数。满的就考虑枚举最后一个放哪,他的贡献单独能算,两边贡献就独立开了。
不满的类似,考虑枚举一个空的地方,也就是把两边贡献独立开来。O(n3)
CF1292C
万年老锅,弱智题。当时是真的菜。
CF1292D*
直接建虚树,沙比提。
今天训练上午还行,下午很浮躁,应该想办法调整,晚上还行。以后绝不允许出现类似浮躁情况。

cf891e
为啥我完全不会呢
就是初始的乘积减去最终乘积的期望。不会×1
考虑求最终乘积的期望,考虑对于一组bi=k的贡献 不会×2
然后推推生成函数,发现有个i0aijj!xj,这玩意应该拆开,变成ex的形式 不会×3
然后k![xk]eax=ak 不会×4
为啥啥也想不到,不学无术的下场

cf778e

posted @   Lebron_Durant  阅读(738)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示