一句话题解(2021.6)
loj#3528. 「IOI2021」位移寄存器
之前PT问怎么不用if来搞max,当时随口胡了个做法:
考虑如何实现一个[x<0],显然把最高位右移31位即可
所以max(a,b)=[a-b<0]*b+(1-[a-b<0])*a
但是本题没有乘法,所以再考虑实现把0变为00...0,1变为11...1
显然直接把0/1取反,然后加到11...1上,这样0->1+11...1=00...0,1->0+11...1=11...1
然后用and来代替乘法
①s=0,n,K<=2,Q<=20
除了01,10外直接and都可以,特判一下
②s=0
(与n无关的做法
取反,按位确定max,判and后是否>0(用and的结果加全1然后取最高位)然后加到答案里
设当前位为k,现在要考虑每个数,若有2^k则去掉,否则直接设为0
考虑不用按位枚举/倍增来实现,设k=3,则对于1000/0000,将其右移k位,然后用1000(2^k)来减掉他
这样会得到0111/1000,and后前者会去掉第k位,后者会去掉0~k-1位,加上其本来2^k位为0,所以等于清零
但是这样有一个大问题,当所有数当前位都为0时会直接全部清空,所以把当前位的0变为全1然后or上要and的数组来“保护”其余位
精细(?)实现后是O(14K),138次,并且n可以开到114514
③s=1
s=0的做法没有任何用处,考虑一开始的直接比较
但是直接比较太辣鸡了,所以每次把n个数折半来比较n/2对数,操作类似但可能要往里面插1位来缓冲(奇偶拆开后会有K的空,但K=1时会挂,因为要一个符号位和一个缓冲位),二进制基操
用奇偶排序来搞,这样一共n/2层每次2轮相邻交换,每轮大概要20次,加上初始的插空精细(?)实现后一共3000-次
loj#3527. 「IOI2021」地牢游戏
直接跳/拆点倍增无前途,考虑利用>=s时+=s的性质
这意味着当初始的x固定后,走赢了一个>=x了s,则走完后一定会变为至少2x
考虑把每种图都建出,当前已经能赢的点走W边,初始不能赢的点走L边,每次倍增一个初始不能赢但走到能赢的点,这样只用走log w次,判断是否能赢就根据x+sum>=S来记一下S-sum的min
但是这样图的个数还是O(n)的,所以对值域分块,把[2^k,2^(k+1))的放一起,小于等于2^k的走W否则走L,这样跳的次数也是log
直接建图会TLE+MLE,所以把乘2变为乘8,时间复杂度\(O((n+8q)\log_8 w\log_2 w)\)
(建图可以优化,把非[2^k,2^(k+1))的直接缩边,这样空间可以乘1/8
loj#3526. 「IOI2021」修改 DNA
唯一指定签到题
前缀和,转化为找最多的环,由于只有2和3所以找最多的2即可
loj#3525. 「IOI2021」喷泉公园
先考虑无2*2的部分5(部分4是子问题,因为如果有2*2的显然不唯一):
先把所有可能的边连上,对格子黑白染色,用黑色格子连纵边,用白色格子连横边
这样唯一冲突只有一个黑色的左右有边,或者一个白色的上下有边,显然同时有边只有2*2的,所以不存在
加上2*2的部分就硬点删掉某些边,每个格子只有上下/左右冲突,删掉下/左的即可
证明考虑从下往上,从左往右删边,则每次删的时候都是一个完整的2*2格子,4个点4条边随便删一条都行,硬点删左/下的即可往后归纳
loj#3524. 「IOI2021」钥匙
当A能到达B时,B能到的点是A的子集,除非之后从B能到A否则A不会成为答案,所以只用考虑B
定义当前能互达的点为团,A能到B且B不能到A就连边A->B,定义这样的一个团加上若干单向到达的团为块,定义一个块里最高(还在计算)的团为顶团
用线段树维护同一个团的信息,包括出现的颜色以及每种颜色连出去的边,边用链表存,同时可以维护标记表示子树内有某种颜色存在且有边(能扩展),用两个并查集维护同团的以及同块的
维护一个序列,每次把序列的元素按顺序取出操作,要判是否为顶团
每次操作找一条能扩展的边,如果不在同块就接过去,否则若不在同团就把两个团线段树合并,然后丢到新的序列里下一轮接着做,用过的边要删掉
但是这样过不了一个环,因为合并块不用删掉边,这条边在后面可能会用到
而且不会存在B不能到A且A已经能到B时考虑边A->B(会连起来),因为此时A不是顶团
(因为每次连同一块的都是顶团,所以不会有连到的到不了自己这种情况
或者直接维护一个栈来加,不用按轮做
loj#3523. 「IOI2021」分糖果
log^2的辣鸡做法
L=0,R=n-1感觉可以维护折线做,但是没什么扩展性
当c全部相同时直接维护min,max,加 标记,把min/max前移时就减掉加,但是当c不同时无法合并minmax
考虑线段树分治,求出每个i对应的操作序列,然后按操作时间为下标再建线段树,在这个线段树上求答案
先把i对应的所有操作拉出来,把minmax全部前移,对minmax做后缀和得到一段不断缩小的区间
当区间非空时显然做min和max的顺序可以调换甚至删掉某一种,当第一次为空时即大于等于后面的上界/小于等于后面的下界,则操作后面的会分别得到上界/下界
所以直接线段树上二分后缀,找到第一个后缀区间为空的算答案即可
(把线段树分治去了就是一个log了
7153. 【2021.6.28 NOI模拟】function
构造\(F=G*H\),\(G(n)=n^m\),由于F和G都为积性函数,且积性函数的狄利克雷卷积和逆都是积性函数,所以H也是积性函数
把H(p^k)根据次数写出OGF,用F/G得到\(\large 1-\frac{(p^{2m}-p^m)x^2}{1-x}\)
显然是powerful number,枚举质因子暴力算
7152. 【2021.6.28 NOI模拟】bet
假设已经求出了i-1的期望\(E_{i-1}(x)\)和\(E_{i-1}(x^2)\),现在要求\(E_i(x^2)\)
由于x的出现概率与次数无关所以枚举x,设其在i-1出现的概率为Px
\(E_i(x^2)=\sum_x (p(ax+b)+(1-p)x)P_x\),画一下得到
\(E_i(x^2)=(A\sum_x x^2P_x)+(B\sum_x xP_x)+C=AE_{i-1}(x^2)+BE_{i-1}(x)+C\)
线段树矩乘
7151. 【2021.6.28 NOI模拟】tennis
求\(\large \sum_{l=1}^{n+m-1}\binom{l}{n}(1/2)^{l+1}(n+m-l)\),m同理
设\(\large F(S,n)=\sum_{l=n}^{n+m-1}\binom{l}{n}(1/2)^{l+1}\),有
\(\large F(S,n)=[x^n]\frac{(1/2)^n(x+1)^n-(1/2)^S(x+1)^S}{1-x}\)
1/(1-x)相当于前缀和,拆开后推导一波得到
\(\large F(S+1,n+1)=F(S,n)-(1/2)^{S+1}\binom{S}{n+1}\)
\(\large F(S+1,n)=F(S,n)+(1/2)^{S+1}\binom{S}{n}\)
\(\large F(S-1,n-1)=F(S,n)+(1/2)^{S}\binom{S-1}{n}\)
\(\large F(S-1,n)=F(S,n)-(1/2)^{S}\binom{S-1}{n}\)
然后可以莫队了,直接搞是4次,把n,m分别求一次然后推一次变为2次,现在要把nm合起来
\(\large F(S,n)=[x^n]\frac{(1/2)^n(x+1)^n-(1/2)^S(x+1)^S}{1-x}\)
\(\large =\sum_{i=0}^{n} [x^i] (1/2)^n(x+1)^n-(1/2)^S(x+1)^S\)
\(\large =1-(1/2)^S\sum_{i=0}^{n} \binom{S}{i}\)
所以\(\large F(S,n)+F(S,m)=2-(1/2)^S(2^S+\binom{S}{n})\)
\(\large =1-(1/2)^S\binom{S}{n}\)
求\(\large F(S,n)\)即可
loj#6772. 「THUPC 2021」幸运位置
显然当(a,b,c)>1时不合法,否则考虑构造
由于(an+b,c)=1,所以c的每个质因子p都存在p|(an+b)
当p|b时,由于p|c所以p|a,此时只要保证p|n即可
当p|b时,为了不让加上an后%p=0,所以直接硬点p|n
所以b有的n没有,b没有c有的n有,所以把n设为c除掉b中质因子即可
没写
7130. 【2021.6.18 NOI模拟】计算几何(cal)
首先根据hall定理,题目要求的就是面积为1的三角形
然后经过题解的严密推导,有
\(ans=4\sum_{n=1}^N\sum_{m=1}^M ([(n,m)=1]+2[(n,m)=2])(N-n+1)(M-m+1)-2(N+M)\)
杜教筛筛μ,μd,μd^2
7129. 【2021.6.18 NOI模拟】数学分析(math)
就是找x->φ(x)的次数<=n的,观察发现每个>2的质数都会在一次操作中产生一个2,2的总数(+1)就是次数,因为每轮都会少一个2且最后剩下的2最多(初始为奇数可以续一轮)
求出每个质数产生的2的个数然后背包合并,因为每产生一个2就要除2,所以2的个数不超log,ntt暴力卷或者lnexp
7128. 【2021.6.18 NOI模拟】双色球(ball)
推成算组合数一斜列的和,设f[i]表示第i斜列,则有f[i]=f[i-m]+f[i-m+1],凯莱哈密顿
或者按题意来,先不考虑球的具体位置,只考虑颜色,设f[i]表示i个球的颜色方案
有f[i]=f[i-m]+f[i-m+1],最后要求Σf[i]*C(n,i),实际就是(A+I)^n,一样凯莱哈密顿
6249. 【NOI2019模拟2019.7.3】七星连珠
积和式没法算,所以给每个位置随一个权值然后求行列式,k进制fwt后分开高斯消元
k进制fwt:实际就是对len维的0~k-1做循环卷积,乘上\(\omega^{ij}\)和\(\omega^{-ij}/k\),k=2就是(x+y,x-y)
神必图
7137. 【2021.6.22 NOI模拟】人赢的情书(letter)
关键性质:两个串在头加一个相同的字符后大小关系不变
可以判断出a[sa[i]]和a[sa[i]]的关系是<还是<=,然后差分+保序回归,或者套前几天cf的G做法维护分界点
7136. 【2021.6.21NOI模拟】寻觅(help)
ls的神奇做法:分层,每层按n->1把pi以及前一个和后一个删掉,然后把pi染色
归纳正确性,假设上一层的任意一个区间都在任意时刻合法,且当前层加入了两个连续的,则较后者一定会在处理时删掉一个比其前的,所以一定会有一个上一层的先加到中间
这样可以不到24
题解做法:按三个为一组,把每组最早的拉出来递归,然后反着还原
由于这样剩下的最多只有(3-1)*2=4,所以按n=4用3种来填,只要和相邻的不同,且保证最后一个填完时3种都出现即可,这样恰好24
奇怪的想法:用4种来填,这样最多可以到10,但可能会左右填完后把一边去掉换新的来填,可能要判断一边为空另一边所有情况是否都合法?
7135. 【2021.6.21NOI模拟】搬砖(brick)
当a%x=b%x时,即(a-b)%x=0,差分后求gcd即为答案
操作2对gcd无影响,操作1会把差分变为a(2x+1)+b,区间的gcd即为(a(2x+1)+b,a(2x+3)+b)=(a+b,2a),线段树维护差分以及原数
7134. 【2021.6.21NOI模拟】旅行计划(travel)
把非树边的虚树建出,求每个x到其他点的dis和
先在虚树上dij求出每个点的dis,中间的就按两端dis均分,倍增维护
CF1539
E:维护到i,i是左/右手合法的另一边的集合,每次判断i-1转手是否合法,加进去后再根据i的限制弹set头尾,如果一边不合法就全弹
构造就记上一次转手的位置,可以顺便维护
F:只用考虑终点和中点的相对位置,硬点终点往左/往右,如往右就把<=的看作+1,>的看作-1,求往前/后的最大后缀/前缀和,线段树维护最后/2,往左同理
2021计蒜之道决赛 Day2T2 类斐波那契数据分析
类比普通斐波那契:\((f_i,f_j)=f_{(i,j)}\),证明就证$(f_i,f_{i-1})=\(1以及\)f_{x+y}=f_{x-1}f_{y}+f_{x}f_{y+1}\(,然后有辗转相除\)(f_x,f_y)=(f_y,f_{x-y})$
\(Ans=\sum_{i=1}^{n} \sum_{j=1}^{i} [(i,j)=1] f_{(i,j+d)}\)
对f反演得到h,有
\(Ans=\sum_k h_k \sum_{k|i} \sum_{j=1}^{i} [(i,j)=1][j \equiv -d \mod k]\)
首先当(k,d)!=1时后面为0,因为i,j都会有约数(k,d)
假设d=0~k-1,则后面的总和显然是φ(i)
结论:当(k,d)=1时,后面的总和为φ(i)/φ(k)
考虑把(i,j)=1反演得到x|(i,j),若对于每个d来说每个x的和都和d无关,则反演后也无关(结果相同)
(前提:(k|i),(k,d)=1
\(\sum_{j=1}^{i} [x|(i,j)][j \equiv -d \mod k]\)
\(\sum_{a=0}^{i/k-1} [x|(i,ka-d)]\)
此时有ka-d%x=0,即ka+xb=d,若(k,x)!=1,则结果一定是k个某个约数的倍数,由于(k,d)=1所以不合法,所以(k,x)=1
由于裴蜀定理,a一定有一个[0,x)的解,且之后的每x个里都会有一个解,共i/(kx)个解
所以\(\sum_{j=1}^{i} [x|(i,j)][j \equiv -d \mod k]=i/(kx)\),与d无关,得证
\(Ans=\sum_k h_k \sum_{k|i} [(k,d)=1]\varphi(i)/\varphi(k)\),O(nlogn)解决
7133. 【2021.6.19 NOI模拟】tree
树剖+虚树+线段树合并+dsu on tree,这样是log^2
或者用lct代替树剖,把虚树拆成二叉树然后点分归并做到一个log
7132. 【2021.6.19 NOI模拟】reward
凸优化
7131. 【2021.6.19 NOI模拟】binom
打表/斯特林公式,或者把n,m除100,因为随机所以不考虑边角
牛客挑战赛51
A:枚举b的约数
B:先补成团,然后最大连次大
C:二分,或者直接枚举长度算
D:矩乘,注意没有合法方案时为0
E:变成φ然后旧试题,或者https://loj.ac/p/2476,跑不动
F:枚举深度,直接prufer不会算重
G:维护线段树每个区间的所属,有多个取区间最小的,一操作直接打标记,如果往下走到了一个新的所属就不走,删除用set维护每个区间的标号,O(nlog^2),没写
loj#6772. 「THUPC 2021」幸运位置
显然当(a,b,c)>1时不合法,否则考虑构造
由于(an+b,c)=1,所以c的每个质因子p都存在p|(an+b)
当p|b时,由于p|c所以p|a,此时只要保证p|n即可
当p|b时,为了不让加上an后%p=0,所以直接硬点p|n
所以b有的n没有,b没有c有的n有,所以把n设为c除掉b中质因子即可
没写
7130. 【2021.6.18 NOI模拟】计算几何(cal)
首先根据hall定理,题目要求的就是面积为1的三角形
然后经过题解的严密推导,有
\(ans=4\sum_{n=1}^N\sum_{m=1}^M ([(n,m)=1]+2[(n,m)=2])(N-n+1)(M-m+1)-2(N+M)\)
杜教筛筛μ,μd,μd^2
7129. 【2021.6.18 NOI模拟】数学分析(math)
就是找x->φ(x)的次数<=n的,观察发现每个>2的质数都会在一次操作中产生一个2,2的总数(+1)就是次数,因为每轮都会少一个2且最后剩下的2最多(初始为奇数可以续一轮)
求出每个质数产生的2的个数然后背包合并,因为每产生一个2就要除2,所以2的个数不超log,ntt暴力卷或者lnexp
7128. 【2021.6.18 NOI模拟】双色球(ball)
推成算组合数一斜列的和,设f[i]表示第i斜列,则有f[i]=f[i-m]+f[i-m+1],凯莱哈密顿
或者按题意来,先不考虑球的具体位置,只考虑颜色,设f[i]表示i个球的颜色方案
有f[i]=f[i-m]+f[i-m+1],最后要求Σf[i]*C(n,i),实际就是(A+I)^n,一样凯莱哈密顿
6249. 【NOI2019模拟2019.7.3】七星连珠
积和式没法算,所以给每个位置随一个权值然后求行列式,k进制fwt后分开高斯消元
k进制fwt:实际就是对len维的0~k-1做循环卷积,乘上\(\omega^{ij}\)和\(\omega^{-ij}/k\),k=2就是(x+y,x-y)
神必图
7137. 【2021.6.22 NOI模拟】人赢的情书(letter)
关键性质:两个串在头加一个相同的字符后大小关系不变
可以判断出a[sa[i]]和a[sa[i]]的关系是<还是<=,然后差分+保序回归,或者套前几天cf的G做法维护分界点
7136. 【2021.6.21NOI模拟】寻觅(help)
ls的神奇做法:分层,每层按n->1把pi以及前一个和后一个删掉,然后把pi染色
归纳正确性,假设上一层的任意一个区间都在任意时刻合法,且当前层加入了两个连续的,则较后者一定会在处理时删掉一个比其前的,所以一定会有一个上一层的先加到中间
这样可以不到24
题解做法:按三个为一组,把每组最早的拉出来递归,然后反着还原
由于这样剩下的最多只有(3-1)*2=4,所以按n=4用3种来填,只要和相邻的不同,且保证最后一个填完时3种都出现即可,这样恰好24
奇怪的想法:用4种来填,这样最多可以到10,但可能会左右填完后把一边去掉换新的来填,可能要判断一边为空另一边所有情况是否都合法?
7135. 【2021.6.21NOI模拟】搬砖(brick)
当a%x=b%x时,即(a-b)%x=0,差分后求gcd即为答案
操作2对gcd无影响,操作1会把差分变为a(2x+1)+b,区间的gcd即为(a(2x+1)+b,a(2x+3)+b)=(a+b,2a),线段树维护差分以及原数
7134. 【2021.6.21NOI模拟】旅行计划(travel)
把非树边的虚树建出,求每个x到其他点的dis和
先在虚树上dij求出每个点的dis,中间的就按两端dis均分,倍增维护
CF1539
E:维护到i,i是左/右手合法的另一边的集合,每次判断i-1转手是否合法,加进去后再根据i的限制弹set头尾,如果一边不合法就全弹
构造就记上一次转手的位置,可以顺便维护
F:只用考虑终点和中点的相对位置,硬点终点往左/往右,如往右就把<=的看作+1,>的看作-1,求往前/后的最大后缀/前缀和,线段树维护最后/2,往左同理
2021计蒜之道决赛 Day2T2 类斐波那契数据分析
类比普通斐波那契:\((f_i,f_j)=f_{(i,j)}\),证明就证$(f_i,f_{i-1})=\(1以及\)f_{x+y}=f_{x-1}f_{y}+f_{x}f_{y+1}\(,然后有辗转相除\)(f_x,f_y)=(f_y,f_{x-y})$
\(Ans=\sum_{i=1}^{n} \sum_{j=1}^{i} [(i,j)=1] f_{(i,j+d)}\)
对f反演得到h,有
\(Ans=\sum_k h_k \sum_{k|i} \sum_{j=1}^{i} [(i,j)=1][j \equiv -d \mod k]\)
首先当(k,d)!=1时后面为0,因为i,j都会有约数(k,d)
假设d=0~k-1,则后面的总和显然是φ(i)
结论:当(k,d)=1时,后面的总和为φ(i)/φ(k)
考虑把(i,j)=1反演得到x|(i,j),若对于每个d来说每个x的和都和d无关,则反演后也无关(结果相同)
(前提:(k|i),(k,d)=1
\(\sum_{j=1}^{i} [x|(i,j)][j \equiv -d \mod k]\)
\(\sum_{a=0}^{i/k-1} [x|(i,ka-d)]\)
此时有ka-d%x=0,即ka+xb=d,若(k,x)!=1,则结果一定是k个某个约数的倍数,由于(k,d)=1所以不合法,所以(k,x)=1
由于裴蜀定理,a一定有一个[0,x)的解,且之后的每x个里都会有一个解,共i/(kx)个解
所以\(\sum_{j=1}^{i} [x|(i,j)][j \equiv -d \mod k]=i/(kx)\),与d无关,得证
\(Ans=\sum_k h_k \sum_{k|i} [(k,d)=1]\varphi(i)/\varphi(k)\),O(nlogn)解决
7133. 【2021.6.19 NOI模拟】tree
树剖+虚树+线段树合并+dsu on tree,这样是log^2
或者用lct代替树剖,把虚树拆成二叉树然后点分归并做到一个log
7132. 【2021.6.19 NOI模拟】reward
凸优化
7131. 【2021.6.19 NOI模拟】binom
打表/斯特林公式,或者把n,m除100,因为随机所以不考虑边角
牛客挑战赛51
A:枚举b的约数
B:先补成团,然后最大连次大
C:二分,或者直接枚举长度算
D:矩乘,注意没有合法方案时为0
E:变成φ然后旧试题,或者https://loj.ac/p/2476,跑不动
F:枚举深度,直接prufer不会算重
G:维护线段树每个区间的所属,有多个取区间最小的,一操作直接打标记,如果往下走到了一个新的所属就不走,删除用set维护每个区间的标号,O(nlog^2),没写
7105. 【2021.6.5 NOI模拟】想不想吃炸鱼呀(genshin)
50分算出每个区间的答案,然后把区间连到sam上,再把sam按next连
显然sam上一个节点的所有串可以互相走,还可以走next相连且size相同的(可以反向走next),所以求出每个串的答案后并查集+倍增求解
设Ans[i]表示节点i中所有串的子串的出现次数和,拓扑先把Ans[i]->Ans[next[i]],再加上新加一个字母所产生的新串,即当前点的最长串的所有后缀
设l=Len[i]-Len[fa[i]],sum[i]=fail链上所有串的出现次数总和
当后缀长度<=Len[fa[i]]时,当前的l个串都会算到,所以用sum[fa[i]]计算
当后缀长度>Len[fa[i]]时,只有长度大于等于计算串的串才会算到,且每个串的贡献都是sz[i],组合数一下
然后就做完了,题解里的pre1和pre2感觉就是把Ans拆开,合起来可以少一些情况
7127. 【2021.6.16 NOI模拟】取石子游戏(nim)
结论:同种颜色的sg为\(\large (\bigoplus \left \lfloor \frac{a_i}{m+1} \right \rfloor)*(m+1)+(\sum a_i)\text{%}(m+1)\)
先假设有这个函数,考虑证明其就是sg,只需证明其能到达所有小于其的且不能到达自己
显然可以分成前后两部分,若操作后前面不变后面变,则可以通过2操作(此时1操作被完全包含)减掉1~m个,满足条件
若操作后前面变了,类比nim游戏发现前面一定减了1,用1操作(此时2操作被完全包含)可以减1*(m+1)的那个ai的余数位减掉然后变为0~m,所以余数也可以变为0~m,满足条件
记%(m+1)的和,每种颜色fwt后再还原fwt合并,时间O(ns(m+logs)),没有m^2是因为操作过程中上限s/m
注意虽然是s/m下取整,但xor过程中会卡满2^k,所以最后总fwt时要把N乘2
7126. 【2021.6.16 NOI模拟】比赛(tournament)
设f[i,j,k]表示区间[i,j]内k获胜的概率,枚举i,j,mid,k1,k2即可O(n^5)
发现f[i,j,k]=f[i,k,k]*f[k,j,k],所以设f[i,j]表示i获胜,g[i,j]表示j获胜的概率,转移O(n^4)
继续优化,当求f[i,j]时顺序枚举了i,k,I,j,k表示分界I表示[k+1,j]中获胜者,所以先dp把i,k,I合并,然后再枚举i,I,j即可O(n^3)
7125. 【2021.6.16 NOI模拟】装备(equipment)
连边bi->ai,有环则整块不能动,否则把树的根下移,移过的边ab翻转
按位确定,当步数合法且当前的根能往下就往下,如果当前的a>b即不能翻转就把子树标记,时间O(n)
7124. 【2021.6.15NOI模拟】苯为(ber)
换根dp+矩乘
7123. 【2021.6.15NOI模拟】尼特(nit)
(非题解做法
发现答案只与ai≠ai+1的对数有关,把ai=ai+1的独立算,只有bi=ai=ai+1时有贡献,且这个贡献无论删a的哪个都会统计,所以Ans=其余ans乘上2^个数+每个ai=ai+1自己的贡献
当ab确定了之后bi只与ai和ai+1有关,记bi=ai为←,bi=ai+1为→,则可以写出一个←→←→的序列,删数等于找一个分界线,然后算左边的←+右边的→
当←→个数确定后了,先硬点所有→贡献,然后把删数不断右移,这样←看作+1→看作-1,等于找最大前缀和
枚举←的个数i,→个个数j,最大前缀>=k,把折线按y=k翻折组合数计算,可以得到O(n^3)的做法,对组合数后缀和一下即可O(n^2)
发现当组合数i+j相等时,组合数外的部分也相等,所以枚举i+j=l把一行的一起算
当i<j时和i>j显然对称,所以只算i<j的和i=j的,i=j的另外暴力
i<j的把组合数C(l,i)的计算次数写出,发现可以用\(A*\binom{l}{i}+B*\binom{l}{i}*(l-i)\)来表示,由眼睛得A,B然后直接算一行组合数的一半,时间复杂度O(n)
次数大概是(第一行是i,第二行是次数
0 1 2 3 4 5 6
8 6 4
0 1 2 3 4 5 6 7
10 8 6 4
597的做法:生成函数硬推求\((x+x^{-1}+m-2)^{s}\),可以短多项式求幂或者接着硬推?
7122. 【2021.6.15NOI模拟】西克(shik)
考场想类似省选D2T1那样倍增,然后不会往下走,剩1h刚点分没写完,以为是log^2的就丢了,最后才发现是一个log
点分,往上走数组维护,往下走并查集按秩合并,维护每种颜色的根所以是(n+Q)logn,或者跳到后半第一个然后递归子问题
题解做法是直接求,先往上跳到lca下一个,然后dfs维护栈+二分跳到后半第一个,最后往下并查集维护1->x的颜色最深点,时间O(n+qlogn)
还没写
CF1534
3道交互……
A:判断
B:只有把宽为1的减才优
C:ai->bi,每个环*2
D:正常做法:询问1,然后把奇/偶层询问
神必做法:当x,y已知时,可以把距离x-y路径<=1的点找到,所以维护以1为根的树,每次把不在树上的一个点加入和1求路径,则不会有两个询问点的父亲相同,所以是n/2
E:暴力做法:每个数顺序枚举次数,最优显然是a,a,a-2,a-2...这样排,然后贪心判断n^3
做法2:设f[i]表示询问完i个的次数,每次把两个i,j枚举重合次数k合并到i+j-2k,最后反着还原
F1:不想写tarjan,所以取了每列的最上段然后根据连通块连起来再求,最后直接去世
实际把图连出来tarjan缩环求判0度点即可,分列再分段搞,每段都要考虑否则会挂,上段只用连到下段就停,因为上段->下段后可以间接连上下段所连的
F2:在F1的基础上扩展,定义第j列的(a[j],j)为关键点,显然每个关键点都要操作,如果一个关键点能到达另一个关键点,就把被到达的删掉,把剩下的按原顺序重标号(如果一个块里标号不连续一定会被中间的删掉)
结论:删完后的每个点能到的关键点都是一段连续区间
反证,abc顺序,bc为关键点,如果a能到c不能到b,若a是从b上方经过则会顺便到b,若从b下方经过则b也能到c,所以c会被删掉
求出每个0度点能到的区间,排序贪心选
G:观察发现对于一个点(a,b),一定是在斜线y=-x+(a+b)上操作最优
所以可以暴力dp,f[i,j]表示到x+y=i,y=j的最小值,考虑直接维护f(x)
发现等价于每次x+y加1时把函数的min扩展1格,把端点一分为二,用堆维护往左和往右的端点,右边的每次+1,函数值求到所有点的dis和
这样形态不变,最小值每次会加上点数/2所以要减掉,加新点就和当前的堆顶讨论,最后拿出排序求
H:先求dp值,设f[i]表示在i的子树内确定一个端点的次数,求f时可以同时维护操作方案
最优显然时把儿子排序从大往小选,随便算一下,注意如果只有一个儿子就直接继承(可以顺便确定根),且当f[儿子]=0时确定也要一次(新加了一条边)
最后求根的答案就讨论一下,显然还是从大往小选,若两端都在子树则最劣是选了最大的和后面的某个,且中间每棵子树都会询问一次
若只有一端在则最劣是选最大的,然后后面一直找不到
第一问换根dp O(nlogn),第二问模拟,询问一路往下f最大的叶子,vector做到O(n)求
7107. 【2021.6.5 NOI模拟】超高校级的绝望(danganronpa)
实际求的集合是强连通子图,dp找哈密顿回路
7106. 【2021.6.5 NOI模拟】杰尼罗斯 艾欧(generals)
先边权=1,按顺序把1~n加入,保持前面的点权值和不变
每次加入后把连的之前的点点权变为1(边-1),然后此时有(点个数+1)种取值,调整一下
7121. 【2021.6.12 NOI模拟】分层图(graph)
发现每层都可以分成若干相连的点对,设f[i,j]表示i个对->j个对的方案,求出后矩乘
求f大概是枚举新加j对连k对,剩下的往里面塞,方案就是(2i+j-k)的上升幂
合并k个的方案就再用一个dp来算,注意只有最后一层才可以合为0
7120. 【2021.6.12 NOI模拟】多项式因式分解(factorize)
发现Σ<=2^60,所以总个数<=60,\(1+1/x^a=(x^a+1)/x^a\),所以先忽略负数位,暴力因式分解,然后暴力背包,可能出现的次数就是初始的n个
arc122
A:注意是没有相邻的,左右乘fib
B:化简得到Σ|x-Ai/2|+常数,取中位数
C:辣鸡构造:写成fib的和,维护x和y的已知位等于n的前若干位,然后用大的加到小的上来位移两位,这样x和y都要加上1的个数,所以次数是86+86
正确构造:不对整体形态考虑,而是考虑每个+1在不断...->x->y->x的过程中的贡献,硬点最后为y->x,可以得到每个f[i]加入的时间,这样1的个数只用加一次,所以次数为86+43+?<=130
D:建trie往下找,找到左右有奇的就暴力取min(B控制),每部分再取max(答案)
E:正着不好搞,反着每次找一个能删掉的,对ai取gcd即可不超lcm
*F:
PE759
打表归纳得到f(n)=n*(n的二进制中1个数),然后暴力折半/状压
计蒜客2021决赛D1T3
在树上并不好做,所以直接在序列上搞
展开2n后找到每个i的最大合法[i,i+x],用st表+O(1)lca合并虚树直径,倍增
PE750 Optimal Card Stacking
设f[i,j]表示把a[]=[i,j],且在j初始位置的部分还原的答案,n^3转移
PE749 Near Power Sums
折半,对后7位预处理,前9位暴力剪枝(max和min)
code:https://gmoj.net/senior/#main/code/840955
abc202F - Integer Convex Hull
先转一个小角度使得无同x/y,然后枚举左端点,设f[i,j,0/1]表示当前到j,上一个为i,叉积奇偶为0/1的答案,按x小->大,大->小分别转移一次
arc121
难度倒序
A:离谱的做法:根据点的总矩形和每个点的位置求出max,边界-角计算框上的点数量,如果数量=1则第二大会小于max,找到那一对点,分别把两个删掉求剩余的max
正常的做法:求出x,y的前二大/小的点,两两匹配取次大,因为可以发现在两层框内的点对可以往大的那边扩两次,不可能成为次大
B:全偶为0,否则有两个奇,显然要么是两种最近的匹配,要么和第三种各取min相加
求出每个第三种对另外两个的距离(x,y),等于选两个对分别贡献xy,前缀和即可
实际并不用,如果选的第三个C相同就是A-C-B或A-B-C,两种都没有直接匹配优
C:从后往前每次把[i-1,i]中的某个丢到后面排序,这样最后会剩下一个,这个能移就直接移,否则可以通过操作a[2],a[3]来把a[1]变成2,然后对前三个轮换变成123
D:奇怪的做法:枚举前后缀选0,加上从外往内选,跨过0就选0,非常离谱但过了
正常的做法:分析和上面一样,对于a<b<c<d四个数,有a+b<a+c<a+d,b+c<b+d<c+d,即ad,bc匹配最优
直接选相当于和0匹配,枚举有多少个0然后从外往内匹配即可
E:容斥,每个点向祖先连就乘-1,设f[i,j]表示子树i内剩j个未连,子树背包
F:观察发现,不合法的充要条件是每个and块里有0,因为虽然可以用当前的1消掉其他的0,但最后总会剩下一个有0的块,设f[i,0/1]表示i子树内连通块的and为0/1的答案,转移
题解做法:如果产生了一个or 1就直接合法,所以设f[i,0/1/2]表示当前点为 0/1/已经合法 的方案
PE752 Powers of \(1+\sqrt 7\)
打表,发现>=5的质数p的周期为(p^2-1)的约数(p=7时周期为7例外),p^k就是p的周期乘上p^(k-1),多个的周期是每个p^k的lcm(crt,显然要同时到(1,0))
code:https://gmoj.net/senior/#main/code/840959
7101. 【2021.6.1 NOI模拟】人生赢家(win)
打表,发现可以分成GA..ACT..T的段,开头可以省G/C
枚举前面有多少位卡住,后面直接讨论+组合数
7100. 【2021.6.1 NOI模拟】皮皮虾(shrimp)
就是求对角为F其余为G的行列式,直接硬点哪些为F剩下的不好搞
按照套路把F变成(F-G)+G,在对角线上硬点(F-G)剩下的G任选,这样二项式逆展开可得F^k
发现剩下的矩阵大小>1时deg=0,所以\(Ans=(F-G)^n+n(F-G)^{n-1}G\),插值求幂点值,或者短多项式求幂
7099. 【2021.6.1 NOI模拟】传统游戏(nim)
polya容斥,枚举排列乘上(-1)^(逆序对个数),也等于偶环个数,因为可以把两个标号交换(行列同时换,不变)做到重标号
偶环对xor没有贡献单独处理,求有i=1~n个元素的答案,枚举第一个有<m的位置即<m的个数j(j<i),直接搞是O(n^2L),由于要求偶数位置所以用((A+B)^k+(B-A)^k)/2,再补上j=i的方案
然后再dp奇环的方案,把阶乘放到f里面前缀和做到O(n^2)
CF1523
A:
B:
C:
D:
E:
*F:
*G:
*H: