一句话题解(2020.12)

CF1361E. James and the Chase

首先考虑判断x,以x为根建外向生成树,如果非树边全是返祖边就合法

然后随机100次找一个合法点出来,建生成树,然后考虑子树的情况,如果一个点的子树内有>1条连到子树外的边则不合法,否则有恰好一条,则该点的答案等于连出去的点的答案

因为只有返祖边,所以连出去的点是否合法与当前子树无关,从子树走出去后情况不变

前缀和求出每个点的覆盖次数,然后建树暴力扫,每个=1的点只会被扫一次,最后建出点之间的关系然后bfs求解

CF1423C. Dušan's Railway

假设有K=2的数据,则点分治每次把分治重心和子树内其他点连边,这样只用两步

类似的当K>=3时,每次树分块然后连边,每个非关键点会向上连一条到第一个关键祖先,√n个关键点会向上连√n个非关键点,所以一次的边数为O(n),总分治次数为nloglogn

6930. 【2020.12.26冬令营模拟】T2

LGV引理,然后变成求大小为r的子矩阵的行列式(子式),满足有r阶非0子式没有r+1阶的

这个就是矩阵的秩,因为线性无关组的行列式非0,且如果存在r阶非0子式则把下三角去掉n行n列后可以得到r-1的

给边随机权值,矩乘线段树

CF1368G. Shifting Dominoes

转化一下变成移动空格,假设有4个排在一行的格子abcd,若bc有骨牌则连a->c,d->b

最终练出来一定是一棵外向树,无环可以归纳证明(若有环中间一定为奇数)或者pick定理S=1/2边+内-1,由于每条边长度为2所以S和1/2边都是偶数,外向因为显然不能有两条入边,然后变为矩形覆盖求解

agc050A~D

A:写了个阴间做法,对于i<=n/2的连2i和2i+1,>n/2的反过来连,并不知道为什么对

实际直接连2i%n和2i+1%n即可,因为每跳一次长度*2

B:设f[i,j]表示做完[i,j]且往外扩不选,g[i,j]表示往外扩选,则在len%3=0时fg转化,枚举k转移

C:当B个数>20时显然获胜,否则考虑剩下的B的间距,从右往左设为ai,则维护s每次把s->min(s/2,ai),转化一下就是类似ai>=2^i,前缀和转移

D:设枚举计算的行I和列i,设f[j,k,l]表示在I以前有j个以后有k个考虑到第l个,简单转移

CF1067C. Knights

这样构,然后写个拍手动调整摆放顺序

设长为x,则一边所需为3/2x,所以3x=n,x=n/3,x^2=n^2/9

虽然实际是个三角形但左上还能往上拓,所以没有问题

6929. 【2020.12.26冬令营模拟】T1

同HNOI2019JOJO,维护fi=f0+ai,每次跳border跳等差数列,注意边界判断以及建的不是AC自动机而是trie+KMP

找下一个位用树剖,也可以log^2倍增

6931. 【2020.12.26冬令营模拟】T3

01分数规划,然后dp设f[i]表示以i为根的子树且wi=1的max,当fi>=0时就有解,否则对儿子求二次函数极值求和即可

CF1218D. Xor Spanning Tree

求出环后FWT合并,注意有0所以要另开一个模数来判

CF1285F. Classical?

把s丢到s的约数里,枚举gcd变成求(x,y)满足(x,y)互质

从大到小排序扫,维护栈表示栈内元素两两不互质,则如果新加的数和某个数互质则中间的可以全弹掉

简单反演可以判断,然后如果有就一直弹直到弹掉一个为止,然后接着判,时间复杂度O(Σσ0(i)^2)

6926. 【2020.12.19省选模拟】T1

二分答案,把a分成2和3

当m为偶数时特判掉m<6的,m>=6时把2个3变成6塞进去,剩下的一个3当成两个2直接判断

当m为奇数时用3来平铺,不够就拆偶数来凑,接着转化为m为偶数递归

6927. 【2020.12.19省选模拟】T2

设二维生成函数\(x^iy^j\)表示找到了i个总的放了j个,把i变成N-i那么dp出来后变成求枚举分界,左边有A个右边有B个,等比数列求和就有了d|ai+1

主要是分界有限制不能直接转,枚举B中有多少个在分界前,递推组合数可O(100^4)

Codeforces Round #692 (Div. 1, based on Technocup 2021 Elimination Round 3)

A:把车和同行列的终点连边,每有一个环就要多一步来消

B:发现存在分界线满足前面的?全为0/1后面的为1/0,证明考虑交换两个?的值,对于不同的xy一定有一种更优

C:最终符号n-1为负n为正其余任意,证明每次从右往左把一段[L,R]从L操作到R-1,然后假设全负贪心即可

D:亿点分类讨论,按照n%3分类,主要是1的时候要考虑留4以及12对4的转化,比如两个2转为4以及1+3=4,还有4+2=两个3

E:求出sg后高斯消元,根据之前某题的结论sg<=√2m

F:先考虑判断,发现只用判断深度最大的路径lca的d级祖先,因为往下走不会使子树内的更优(已经满足),往上走不了,所以是充要条件

判断的话往上跳重链,往下用set维护虚子树内最深路径lca,特判跳虚边的点;往上在修改时每段重链上都有一个修改区间,在最深的点里修改即可,应该也要用set+线段树维护

Codeforces Round #691 (Div. 1)A~E

爬了爬了

A:差分去掉后面的b

B:dp,f[i,j]表示选了i个水量为j的最大空腔,选的话就加上2b水和b空来把原有的水加进去,最后算一下

C:置换群搞不了,直接维护三元组(x,y,z)表示位置(x,y)的值为z,操作等于把前面的加减1或者把x/y和z交换

D:比较神仙,把sumi和sumi+1连边后跑字典序最小的欧拉路,证明大概是一个翻转区间等于一个环,把遍历的顺序反过来

E:把x排序后从下往上扫,维护每列中是否已出现必败点,新加的点一定是第一个行列无必败点的,set维护

CF1278F. Cards

《组 合 数 问 题》

CF1425B. Blue and Red of Our Faculty!

又是一个不要🐎的把重要信息放在输入格式里的出题人

显然是由若干经过1的环,最终的情况只有三种:①红蓝同时走到某个环里 ②走完全图并且在1结束 ③全图只剩一条边(1,u)并且一个人在1另一个人在u

②③直接dp,①前缀和一下

CF1404E. Bricks

一开始假设全选 ,然后把一些边界去掉,把边界当成点进行连边变成一个二分图,显然要求的是最大独立集

直接网络流跑是O(E√V),最大独立集=n-最小点覆盖(直接取反),最小点覆盖=最大匹配(最大匹配=最大流=最小割=最小点覆盖)

CF1404D. Game of Pairs

被ll秒了的题

假设有个偶数x,则Σ(1~x)%x=x/2,如果x为奇数则为0,证明可以把i和x-i配对

当n为偶数时选A直接把i和i+n配对,和%n=n/2,显然B无解

当n为奇数时在原图的基础上连i和i+n(连出来的是若干偶环),进行二分图染色,和模n为0模2n只能是0或n

如果为n则把点反色,因为1~2n总和%2n=n

CF1437F. Emotional Fishermen

先把前缀最大值找出来,显然这些人如果不happy则无解

把a排序,从后往前dp最后一个happy的是哪个,设f[i]表示考虑到i的答案

转移考虑i是否happy,如果不是则丢到后面(n-i)个位置里,否则找到前面的第一个<=a[i]/2的,这中间的j只能丢到i后面第一个happy的那个人后面不能丢i后面,因为两倍超了a[i]同时由于2a[j]<=2a[i]<=a[下一个]所以可以丢

由于此时i和下一个之间没有数,所以去掉i往后丢即可,时间复杂度除排序外O(n)

CF1392H. ZS Shuffles Cards

挺妙的题

题解做法非常阴间,由于就算抽到了n个也要一轮结束,所以可以按轮来分开,求期望轮数乘期望每轮的牌数

期望牌数很好求,把每张牌和m张鬼牌放一起组合,即有1/(m+1)的概率贡献,所以期望为n/(m+1)+1

期望轮数考虑min-max容斥,变成求一个大小为p的集合里出现一张牌的概率,同理把p张和m张放一起,第一张牌有s=p/(m+p)的概率为集合p里的,所以就是出现概率

设E表示期望轮数,则有E=(1-s)E+1,解得E=(m+p)/p,预处理逆元可做到O(n)

loj3048. 「十二省联考 2019」异或粽子

可持久化trie,把max[i,y]丢到堆里维护,删就再开个trie删

CF1443E. Long Permutation

由于总操作次数不超2e10,所以只会影响到最后至多15个,记下操作次数每次康托展开即可

CF1453F. Even Harder

发现一种合法方案存在一条唯一的路径+关键点之间的无影响段,dp设f[i,j]表示当前关键点i和上个j,发现转移到的是一段区间,预处理出中间的无影响点个数,前缀和优化即可O(n^2)

牛客挑战赛46F 柠檬树

若干种做法

①莫队,求1/2Σdis(bi,bi+1),b按照dfs序排序,同时bk=1,直接做是n√nlogn,用只删的回滚莫队做,先建出链表然后删+O(1)lca可以n√n

②直接离线lct,每次access树状数组修改,然后减一下根到lca的长度,线段树维护dfs+链剖lca(好写还快)

③分治+虚树,把区间的虚树建出来后二维偏序

牛客挑战赛46E 反演

https://www.cnblogs.com/gmh77/p/13406318.html

写的是题解做法

loj2473. 「九省联考 2018」秘密袭击

来骗,来偷袭我这个写正解的老sb

枚举计算的点是哪个做个dfs序背包nk^2有60分,把选的点数限制在[到根链的,之前的]有85,枚举点从1~n-k+1就过了(

考虑根据值域W来做,枚举值d计算>=d的点形成的至少k个点的块,设f[i,d,j]表示以i为根选j个>=d的,把j用多项式表示,再在外面枚举x转点值

现在设f[i,d]表示点值,发现当d<=d[i]时f=x否则f=1,即只有两段取值,直接线段树区间加区间乘线段树合并即可n^2logw,最后把所有的值加起来n^2插值回去,没有必要再设g来求和

注意细节,比如子树为空时等于把一段相同的和另一边的乘,要把标记ax+b转为(a+b)x+0,还有要按顺序传标记,传标记时如果没有儿子要记在当前点0/1上,有了儿子再传

CF1349E. Slime and Hats口胡

首先考虑计算,如果做过懒癌就很简单,第i个人知道自己是黑当且仅当他看到[1,i-1]都是白且通过第i+1个人知道[1,i]有一个黑

如果第一轮n没走说明n看到了,第二轮n-1没走说明n-1也看到了,这样从n开始往前观测直到人i知道i+1观测完毕且发现[1,i-1]全白为止,那么这个人会在本轮离开,在其前面的人会在下一轮离开

接着因为走了一个黑所以之前的观测全部作废,从i走的下一轮开始新的观测

比如001101,3在第4轮走,接着前面的下一轮走,然后继续观测,最终结果是554798

把序列反过来,把i<j且ti>=tj的合并,则除l=1段里每段中只有至多一个黑

从后往前dp维护当前段前面的第一个黑的最大位置,转移枚举dp值,变成给出L,R,s,在[L,R]中找若干不同的数使得和为s,二分数个数num后可选的是一段区间,直接判断

当l=1时枚举黑的位置,转移同理,最后反着构造,大概也是二分判断

具体实现留作练习(

loj2472. 「九省联考 2018」IIIDX

直接贪心有60,因为d相同时会假

把数升序,考虑每次二分出放的数,如果考虑放完后哪些数不能放就会很阴间,所以直接维护每个后缀有多少个数能放,每次区间减二分前缀求前缀min,可以发现因为取了前缀min所以不需要往后修改了

每次走到一个新子树内时要把父亲的限制解除以放儿子

loj2471. 「九省联考 2018」一双木棋

之前WC的试机题,当时写了半天

2^(n+m)状压dp维护分界线转移

loj2271. 「SDOI2017」遗忘的集合

一眼很神仙然后瞎写了个n^2构造就50了?

首先构造方案是唯一的,证明考虑构出相同f的两个不同的S,从小到大找到S第一个不同的,那么之前的f全部相同,在这一位上一个会比另一个多1,所以显然不同

n^2考虑倍增,每次构完[1,x]后[x+1,2x]中只能是0或1,把1的全加进去然后更新,用mtt+lnexp也许可以做到nlog^2

其实把式子写出来是Π1/(1-x^si)=F,直接对两边求ln然后按位构造就做完了,左边的化完式子后是调和级数

loj2004. 「SDOI2017」硬币游戏

诡异的神仙题

部分分也许可以建AC自动机然后快速幂,或者设Ei表示节点i经过的期望总次数,高斯消元求解

考虑把所有非最终态的点缩起来,设E0表示这些点的答案,类似uoj514把限制解除,变成某人胜利后仍可以按1/2的概率往后选,则一个确定串s的出现概率为1/(2^|s|)

设一个任意的非合法串x,考虑往x后接ai,则x+ai的期望为E0*1/(2^m)

假设i的k长度前缀=j的k长度后缀,则j可以先匹配(m-k)位然后抢先获胜

比如A=001,B=100,则E(x+001)=1/8E(x)=E(A)+E(B+1)+E(B+01)=E(A)+1/2E(B)+1/4E(B),就是B获胜后再往后加固定串

加上ΣEi=1共n+1个未知数n+1个方程,高斯消元求解,注意i=j也要枚举k因为可能已经匹配了一部分

精度?2^(-300)无所畏惧

loj2002. 「SDOI2017」序列计数

dp+快速幂

agc033F - Adding Edges

如果强制按顺序(a,b,c)则好做,直接dfs求出以每个点x为端点的度数,一个新加的点能连向dfs链上之前能和x加边的点的话就可以加

否则考虑转化,每次把边(a,b)(a,c)变成(a,b)(b,c)

主要是具体实现,维护nx[x,y]表示路径x->y上第一个和y有连边的点,加一条边时如果有nx就往下分,否则把以x为根y子树和以y为根x子树遍历,把连较远点的边删掉重新加,同时更新nx

用栈维护加边序列,时间复杂度暂时不会证

agc037F - Counting of Subarrays

首先考虑判断,每次把最小值的段拿出来贪心合成最长段,这样显然是最优的

然后考虑计数,求\(\sum\sum L_iR_j[i,j\text{合法}]\),初始Li=Ri=1,每次把min的段拉出来,先前缀和算内部的接着考虑一个端点在内部(两个都在不影响)

考虑通过修改L和R使得其和原问题等价,比如有8个1,输入的L=3,则把R[3]+R[4]+R[5]->R'[1],就是新的序列中一个数代表原序列的一段,这样合并后即可解决一个端点在内部的情况

这样会算重,所以再前缀和把内部的减掉,如果长度<L则直接不管,因为这样等于在其位置断开分成左右两边,显然也和原问题等价,堆+链表维护

arc110E - Shorten ABC

同arc027E,每次从后缀第一次出现的转移,操作就是题目的操作,额外定义两个相同字符操作后为空,空与任何字符操作为其字符

发现满足交换律结合律,前缀和优化,算的时候不考虑相同的不能操作,同时把空串也算进去,最后特判即可

arc110F - Esoswap

对一个数x操作等于把x往后丢x位,对一个位置一直操作会不重直到为0(没有能把丢出去的数替换掉的数)

先构(n-1)~0,通过移1来轮换即可把0调到末尾,然后从前往后操作,接着从后往前把序列反过来,对1~x顺序操作后x会被移到0后面

posted @ 2020-12-07 12:24  gmh77  阅读(422)  评论(0编辑  收藏  举报