• 一句话题解(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 wlog_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)=(Asum_x x^2P_x)+(Bsum_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}inom{l}{n}(1/2)^{l+1}(n+m-l)),m同理

    (large F(S,n)=sum_{l=n}^{n+m-1}inom{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}inom{S}{n+1})

    (large F(S+1,n)=F(S,n)+(1/2)^{S+1}inom{S}{n})

    (large F(S-1,n-1)=F(S,n)+(1/2)^{S}inom{S-1}{n})

    (large F(S-1,n)=F(S,n)-(1/2)^{S}inom{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)^Ssum_{i=0}^{n} inom{S}{i})

    所以(large F(S,n)+F(S,m)=2-(1/2)^S(2^S+inom{S}{n}))

    (large =1-(1/2)^Sinom{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=4sum_{n=1}^Nsum_{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=4sum_{n=1}^Nsum_{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 (igoplus left lfloor frac{a_i}{m+1} ight floor)*(m+1)+(sum a_i) ext{%}(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*inom{l}{i}+B*inom{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)

  • 相关阅读:
    double类型比大小的故事
    研究TR1中的东西方向啊方向
    About DWMAPI.DLL
    谈谈Windows程序中的字符编码
    [收藏]使用Microsoft Visual C++来检测和隔离内存泄漏
    浅谈文字编码和Unicode(下)
    【NYOJ】[169]素数
    [bbk5222] 第111集 第14章 数据库空间管理 00
    Redo Log
    平台移植项目案例 32bit windows9i > 64bit suse linux 10g
  • 原文地址:https://www.cnblogs.com/gmh77/p/14841508.html
Copyright © 2020-2023  润新知