一句话题解(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:

uoj632. 【UR #21】挑战最大团

uoj631. 【UR #21】士兵调度

7095. 【2021.5.28 NOI模拟】异或矩阵(matrix)

posted @ 2021-06-02 15:34  gmh77  阅读(225)  评论(0编辑  收藏  举报