10月做题记录

10月做题记录

✩ trick
✯ 会大部分,要tj提示
✬ 会小部分/完全没想到,看了tj才会
◈ 脑电波
✡ 有某一算法的神秘通用性质
⊗ 待补

CF2018F Speedbreaker Counting ✬✩

非常牛题目,就是学whk学傻了,乘法过后的取模写掉了,调了两个多小时/ll

首先,这道题是CF2019D Speedbreaker的进化版(?),那么CF2019D Speedbreaker的策略应该有用吧?诶,实际上没用,太邪恶了出题人!

如果你CF2019D Speedbreaker就用了这道题要用的那个很牛的性质当我没说(

这道题要用一个很重要的性质,设区间I=[maxiai+1,mini+ai1],那么对于序列{ai},要么能作为起始城市的集合就是I,要么就没有可以作为起始城市的城市

还有一个很重要的策略,对于当前走到的区间[l,r],那么下一步要往右走当且仅当右边存在一个点i,使得il+1=ai,否则就往左边走

可以发现,每个{ai}对应了唯一一种走法

用这个策略证明该性质:

I=[l,r],假设从[t,t]开始(t[l,r]),因为有l=maxiai+1,所以可能向右走的第一步一定是一直向左走到达l之后,假设在p处向右走,那么现在的区间为[p,t],那么向右走到的点如果还在[l,r]中,可以继续归类为[p,t],那么现在向右走的点q>r,现在有区间[p,q],显然之后的步骤都一样了,且对于中途,如果有一个t不能合法的走了,那么所有的t都无法合法的走,那么得证

下面排除I中都不合法的情况,即I就是{ai}的起始城市的集合

来考虑能不能求出I=[l,r]{ai},直接求等于肯定不太好弄,变为求[l,r]I{ai},枚举出lr,考虑dp[i][j][0/1],表示[i,j]区间中的方案数,其中0表示下一步不强制向右走,1表示强制向右走,那么如果从[i+1,j]转移到[i,j]aimax(il+1,ri+1,ji+1),从[i,j1]转移到[i,j]同理有ajmax(jl+1,rj+1,ji+1),如果向右走停在j,那么aj=ji+1

这样得到O(N4)的解法

明显有很大的优化空间,考虑优化成O(N3)

发现其实lr的具体值不重要,只需要知道它们的相对大小以及ij和它们的相对大小即可

那么现在来处理一个2ndp数组,固定r=n,枚举l,然后dp,显然取对应的dp[i][j][0/1]即可得到答案

感觉这个算个trick,似乎没咋见过,但是好像又见过,如见(

再来考虑O(N2)的做法

我们直接以r为起始城市来算答案,发现有这样的性质:

  • i[l,l+r21]airi+1
  • i[l+r2,r]aiil+1
  • i[1,l)aiji+1
  • j(r,n]ajji+1

且可以知道,从r会一直走到l,此时才可能会向右走,那么整个过程可以分为两个部分,rl和之后的步骤

那么rl间的方案是简单的

考虑之后的步骤,发现与lr无关,于是直接用dp[i][j][0/1]来算,然后倒着从dp[1][n][0]=1开始倒着dp即可

那么对于从r走到l后会向右走的{ai},向右走的第一步就确保了l的取值就是l,而对于r走到l后不向右走的,说明确保l取到l的只存在[l,r]内,且可知只能是[l+r2,r]来确保的,那么分别算出对应的a[l,r]的方案数,乘上dp[l][r][0]/dp[l][r][1]即可,记[l,r]的方案数为g[l][r]

但是可以发现我们只确保了l,没确保r,也就意味着,g[l][r]记录的实际是[l,r],那么只需要在记录答案的时候变成ans[rl+1]+=g[l][r]g[l][r+1]即可

似乎还看到了O(N)的做法,有时间再去学一下

感觉这道题咋越写越像dp用一堆trick来优化的题(

ARC157D YY Garden

学了一个月whk,糖丸了!尽显唐人气质,鉴定为唐人的课听多了导致的

以前做过?

Y的总数为cnt,首先cnt是奇数一定无解

那么总共会有cnt2个块,考虑枚举行分成a块,列分成b块,显然有a×b=cnt2

那么进一步的,每一块行中,有2bY,每一块列中,有2aY,发现在此限制下,分出来的每个块内的点的数量都相等,那么先check一下,再算方案数即可

合法的(a,b)很小,每次O(HW)的复杂度,可以过

ARC157E XXYX Binary Tree

擦怎么这也做过

网上的做法

显然会有C2个非叶节点为 Y,那么枚举一下根是否为 Y,即可得到叶子有BC2BC2+1Y

又因为不存在 YY,那么 Y在树上就是独立集,则dp[i][j][0/1]表示i的子树内,有j个叶子是 Yi是否是 Y,最多能有多少个 Y

那么树上背包即可,复杂度O(N2)即可

这就是3s啊!(感慨)

想到的

前面跟上面差不多,枚举根是否是 Y,然后确定叶子有几个 Y,非叶子非根有几个 Y

对于叶子,把 Y尽量填在兄弟上,然后从低层到高层,尽量给低层的填 Y即可,显然舍弃低层填 Y给其父亲填 Y不优

复杂度O(N),感觉没啥问题

ARC157F XY Ladder LCS

可以发现,任意三对数必有两组匹配,那么ans2n3,那么对于匹配对(i,j),有jin3,发现n31617的样子,那么显然状压

dp[i][s]表示当前上面遍历到了i,下面可供匹配的为s,那么转移即可

复杂度O(N2n3)

P9062 [Ynoi2002] Adaptive Hsearch&Lsearch ✬✩

套用平面最近点对的网格化做法:选取答案L,然后把平面网格化,划分成L×L的格子,每个格子里有O(1)个点,然后对每个点看其所在格子以及八连通的其余八个格子中的点都拿出来求个距离即可

发现边长取L的常数倍也是可以的

这道题因为答案L不确定,考虑找一些特殊的L,需要选取出来的所有的L能覆盖所有可能的答案,然后找出支配点

那么找到一个d,使得L=di,点x也按照其下标从小到大的枚举,然后i也从小到大的枚举,找到x的格子八连通格子,然后遍历里面的点并与之组成一个支配点,最后再把x插入进去,直接这样复杂度肯定爆炸,所以还要查询后删除disdi1的其他的点,显然合法,且这样的话能保证每个格子内的点都是一个较小的级别,那么支配点近似于O(NlogN)级别的了

看题解区有人说的是每个格子内O(d4)个点,我有个神经的证明能证明是O(d2)的(

考虑格子中的一个点x,因为不存在和它距离di1的点,画出以x为中心,半径为di12的圆,圆在格子中最小的面积为116πd2i2,格子总面积是d2i的,那么点数最多就是O(16d2π)的,也就是O(d2)

好像说因为常数很多,用树状数组维护会被卡常,所以要用O(1)O(N)的分块维护

总复杂度O(NlogN+QN),还是太卡常,卡不过/ng

P7599 [APIO2021] 雨林跳跃

因为一道模拟赛的t4的结构和这个类似就做了,用笛卡尔树想的,但是树上做很麻烦啊,不如直接序列上做,还是不要太定式思维的好

现在把操作看成,删去序列中所有值小于当前值的数,然后每次可以往左或往右跳

考虑最后一步,设[c,d]中的最大值为Y,当前是hi,此时能跳到[c,d]中当且仅当hi<Y,且(i,d)中不存在大于hi的值,由此可得,设[b,c1]的最大值是X,那么X<Y才能有解,且显然一定有解

那么只要此时的hi[X,Y),那么就可以一步跳到[c,d]中了,显然让初始的hi最大最优,设最初是st,则要满足[st,b]的最大值<Y

现在来考虑中间的过程,若先不考虑能一步走到终点的情况,那么显然hi会跳到左右两侧更大的那一个上去,那么设p表示i两侧更大的一侧,来分讨:

  • hpX 直接跳
  • hp(X,Y) 如果p[c,d],那么一步就可以到终点,否则是两步
  • hp=Y 一步
  • hp>Y 从现在起只能向右跳

然后倍增优化过程即可,复杂度O((N+Q)logN)

arc184A Appraiser

尝试将序列分成一块一块的,然后询问每个块内元素的关系,若块的大小是len,显然问len1次第一个和其他的关系就行

发现len=20/21比较特殊,若问出来块内和第一个不同的数的数量>10,显然第一个是假币,若相同的数量>10显然是真币(相同的数量是算上了自身的),此时能确定整个块的情况,而len=21必满足其一,但len=20就会出现比较棘手的情况,也就是恰好10个相同10个不同

但是发现len>20都会超过限制,只有当len=20时,询问次数刚好是950,考虑怎么应付上述的情况

注意到如果当前块是上述情况,那么只需要再用其它块的任意一个数和当前块的第一个数问一次就知道答案了

当这个块是最后一个的时候,在前面算的时候记录一下真币和假币的数量,那么到最后一个的时候就能直接判出来了,此时步数是19×49+19=950,直接用1和最后一个块的其中19个问一下,最后一个可以直接推出来

当它不是最后一个的时候,假设是第i个(i<50),步数是19×i+1<950

复杂度O(N)

arc184B 123 Set

画出x2xx3x的图,发现是一些类似树的结构,每个的开头是一个不含因子2/3的数

进一步,层数是log2N的,且每一层的数量是log3N+119的,显然可以状压

发现图有很多个,不能全部枚举,但是显然有很多长的一样,具体的Ni一样的i为根的图都长的一样,那么套个根号分治

复杂度O(N12log22N2log3N+1)

arc184C Mountain and Valley Folds

不会这种题啊,有种好像啥性质的知道但是就是做不出来、看了题解又觉得不难的感觉,怪怪的

发现放置的特点:上一步把当前区间划分成两个区间后,在左边用山谷划分成新的两个区间,右边用山峰划分成新的两个区间

v表示山谷,^表示山峰

有这样一个性质:把奇数位的折痕都提出来,发现形如 v^v^v^v^...,证明考虑数学归纳法,只有一个的时候显然是 v,若当前有2c1个,那么第2c会将前2c1反转对称过去,那么显然可以得证

进一步可以发现,对于lowbit相同的折痕序列,都形如 v^v^v^...,同样数学归纳法可得证

那么当k为奇数时,可以确定所有为偶数的ai的答案,对于为奇数的ai考虑去掉最低位递归求解,k为偶数时同理

那么可以递归solve(i,a)i是二进制位,返回一个二元组(x,y),表示k2i1/0时的答案

a分成奇数序列b和偶数序列c,分别再递归solve(i+1,b)solve(i+1,c),此时前者的k2i位强制取了1,后者的取了0

发现对于solve(i+1,b)kb中的奇数相加的时候是会对i+1位进位的,所以实际上,对于xb,表达的是k2i+10,对于yb,表达的是k2i+11

前者可以算出xa,后者可以算出ya

复杂度O(NlogA)

arc184D Erase Balls 2D

我说我咋做不出来题解也看不懂,原来是看错题了哈哈哈,选择的球不用删啊/ll

记录剩下的球的集合显然不好弄,考虑把剩下球的集合转换成一一对应的选择球的集合

首先,显然选择球会在剩下球中且选择的球间两两不存在偏序关系,那么考虑尽量选球,显然对于集合中,存在偏序关系的球不能选,不存在的能选,那么也就转换成了:除选择的球的外,再任选一个球都会导致删除别的球

dp即可

复杂度O(N3)

arc110F Esoswap

发现对一个点连续操作n1次后,这个位置一定变成0

那么此时自然的会想,能不能从0n1逐位确定每一位的值,但是发现我们固定0后,在固定后面的数的过程中难免会动了0的位置

那么考虑反着来,先把0放到n1位,然后发现,如果我们继续对n2位进行n1次操作,那么n2位为0n1位为1,由此类推,从n10挨个进行n1次操作即可,每轮过后序列最后就会变成0i的样子,证明显然

复杂度O(N2)

P3641 [APIO2016] 最大差分

子任务1

这个就是每次问到最大的和最小的过后递归下去问次小和次大的,这样就能确定所有数的取值

子任务2

肯定还是要确定最小最大[l,r],然后根据鸽巢原理,disrln1,然后按照rln1分块,每个块内不会有更优的答案

此时最坏M=3n2

P3777 [APIO2017] 考拉的游戏

子任务1

随便给一个点塞个1,然后反悔的为0的那位是1

子任务2

显然一开始放满1那么返回的有值的位就是[51,100]

由此启发我们缩小范围,且可以知道,同类型的必须放相同的值

[51,100]数放2,得到[76,100],在[76,100]4得到[92,100],在[92,100]11得到[100,100]

可以直接去问交互库得证或列出二次函数找单调性即可

子任务3

2启发,我们在01位置都放x,其他位不放,显然随着x的增大,01位的返回值会从两个1,变成一个0和一个1,再变成两个0,而一01时就可以确定答案了

同样列出二次函数可知道x15一定返回两个0,所以x[0,14]

然后精细点的二分可做到只三次询问

子任务4

发现询问限制大概是O(NlogN)的,又因为W=200,那么就可以一次询问来比较两个点的大小,具体的,这两个点都放100即可

stablesort就行,sort比较鬼畜,不能用

子任务5

同样考虑缩减范围,如果我们每次都能将[l,r]一步划分成两个不为空的区间,那么操作次数就是99复合条件的

考虑怎么划分,因为同类型的必须放相同的值,所以考虑给[l,r]都放w,其他放0,那么如果此时返回的值中有01,其中0k个,那么就可以划分成[l,l+k1][l+k,r]

现在只需要找到合法的w即可,那么用可以枚举选了多少个[l,r]内的数来check每个w是否合法

因为w=1时显然存在1(因为l<r),w=nrl+1时显然存在0,中间一定是过渡的状态,所以一定存在w使得有01

P5473 [NOI2019] I 君的探险

15

直接modify一个点后询问所有的点即可

69

此时相当于是两两配对

考虑二进制,修改当前这一位所有位上为1的点的状态,然后查询所有点的状态可知与其相连的点的这一位的0/1

1011

一棵树,且父节点编号小于当前节点

整体二分出父亲即可

1214

一条链

同样考虑二进制,分别改了一起修改这一位为10的点的状态,可以得到与x相邻的点在这一位的异或值

然后对于0暴力找到与它相邻的两个点,然后向两侧拓展即可

1517

无其余限制的树

还是用1214的办法找出二进制求出x周围的点的异或和v[x]

然后往队列q里塞0n1,每次取出队首x并丢掉

如果xv[x]有边,让v[v[x]]xor x,然后把v[x]放到队列中,再让v[x]=0

如果没有边不操作

1825

正解是神秘随机化

还是考虑1011的整体二分,不过此时二分出的是与前一半连边为奇数的点

然后为奇数的往左边递归,整体为奇数且在前一半为偶数的往右边递归

最后能求出一些边,check一下点,让已经连完了边的弹出我们维护的序列

直接这样做不行,要 random_shuffle后再弄

有结论:rand的一个排列里面有O(n3)个点向前连边是奇数个

不会证,很神秘

arc185D Random Walk on Tree

神秘概率期望题/yun

注意到图会成n条长为m的链接在一个根上的形式

先考虑m=1的情况,此时就是菊花图

注意有个重要的期望公式:

E表示期望尝试次数,p表示期望成功概率,c表示成功时的要花费的代价,那么有E=c+(1p)E,得到E=cp

那么设fi表示有i个叶子已经遍历过了的期望从根向叶子节点走的步数,则有fi=fi1+nni+1

则答案就是2i=1nni1,因为最后一次到底后不用回到根

考虑m>1的情况

显然调换走的边的顺序不影响答案,因为走的边的总数不变,所以考虑把根走到一棵子树中的所有操作都放在一起

那么现在就同样分成了n个部分,每个部分里存储了从根向该子树走的所有边

考虑从根直走到链底的期望步数,此时根和链底都只能往一个方向走

gi表示深度为i的节点走到链底的期望步数,那么有:

g0=g1+1g1=12(g0+g2)+1g2=12(g1+g3)+1...gm=0

手算出前几项可以发现,g0=m2

那么答案就是m2×(2i=1nni1)

CF1523E Crypto Lights

f(i)表示放1i的台灯都合法,第i+1个不合法

答案即为f(i)×(i+1),因为k2,所以不用考虑放满的情况

然后有两种方法,一种是直接算f(i),另一种是做f(i)的后缀和数组g(i)表示保证1i1合法,答案为g(i)

那么有f(i)=(ni1)!n!×(i+1)×(An(i1)(k1)i(ni)Ani(k1)i+1)

g(i)=Anmax(0,i2)(k2)i1×(ni+1)!n!

复杂度O(TN)

P4448 [AHOI2018初中组] 球球的排列 ✩✯

好久没做组合了,这么经典的trick都忘了/xia

首先发现乘积为平方的当且仅当它们每一个质因子的质数的奇偶性都相同,那么就可以划分出一些等价类,每个等价类中的数两两间相乘都是平方数,不同等价类的两个数相乘一定不是平方数

设有k个等价类,设szi表示第i个等价类的大小,bi表示这个等价类中至少有i对相邻的

发现题目要求的是等价类内的数也要有序,但是如果有序我们就难以在算方案时做到不重,那么考虑先变成无序的,把(szi!)提到外面,现在只需要处理无序的问题了

答案就是:

b1,b2,...,bk(1)bi(nbi)!(szibi)!Cszi1bi

用背包优化一下即可

复杂度O(N2)

P3236 [HNOI2014] 画框

最小乘积生成树,点是(Ai,pi,Bi,pi)

每次让ij的边权是(yayb)Ai,j+(xbxa)Bi,j,然后跑费用流最小费用最大流即可,好像卡费用流啊,要用KM

P4155 [SCOI2015] 国旗计划

有个有趣的线性做法

倍增的O(NlogN)做法是显然的,考虑连出边,建出树,然后对应每个点有个决策点,决策点每次不动或者向下移动一位,这样复杂度就是O(N)的了

CF348D Turtles

容斥

肯定一条路径是(1,2)(n1,m),另一条是(2,1)(n,m1)

发现路径存在交集的时候,把第一个交集到(1,2)/(2,1)的路段换一个走法,即让第一条是(1,2)(n,m1),第二条是(2,1)(n1,m),这样必然有交且能和原来的走法中存在交的走法一一对应

lgv板子

起点定为(1,2)和(2,1)(n-1,m)(n,m-1)lgv$板子了

agc068A Circular Distance ✯✩

恰好肯定不好求,考虑求答案距离 i的方案数

发现i不好去重,来考虑i

f(i)表示选出的点的答案距离i的方案数,那么我们钦定0点会被选,算出这个的方案数再乘上ln即可

此时因为0点必选,所以其他的点一定在[1,i][li,l1]

同属于一个区间的点间显然没有限制,考虑区间之间的点的限制,因为这个限制是相对的,所以我们来考虑x[li,l1]中的点对[1,i]中的点的限制

发现选了x点后,[x+i+1l,xi1]就不能选

这里有个很巧妙的办法,把[li,l1]整体平移到[1,i]去,那么现在的限制就是原本的[1,i]中的[x,x2i2+l]不能选,设len=l2i2,即[x,x+len]中的点不能选

太巧妙/se

现在就可以变成这样一个问题:给你i个点,每个点可以染成0/1或不染色,0对应选了原本的[1,i]1对应选了原本的[li,l1],不染色就是不选,然后要求每个1后面的第一个0到这个1的距离>len,要求染色的点有n1

这样问题就边的简单了,枚举j表示这n1个染色点中有多少相邻对的 10的形式,留出它们的间隙,那么选点的方案数就是Cij×lenn1,然后来考虑具体怎么给这个n1个点染色,发现直接这样看是可能会有2j/2j+1/2j+2段同色连续段的,但是如果我们在这些点前放一个0色点,这样这n个点就有2j+1/2j+2个同色连续段了,继续在这些点后面放一个1色点,这n+1个点就有2j+2个同色连续段了,插板法即可,方案数Cn2j+1

算简化运算的trick

因为有要求ij×len>=n12j+1>=n,所以枚举i再枚举j的复杂度就是调和级数O(NlnN)

agc068B 01 Graph Construction ✯◈

蓝色的,但构造题,不会呜呜/ll

考虑一开始Sn0Tn1,这样有个好处,1n之间不会直接连边,我们考虑让它们在后面某个点处相连

取出同色的所有相邻的点,只要能让这些点间有边,就能满足题意了

发现在ST的末尾同时放一个0/1,就相当于把S开头的第一个0/T开头的第一个1转移到了末尾去

那么我们只需要讲当前需要连边的点对(u,v)分别转移到S的开头和T的开头(即将它们之前的放到末尾去),然后在ST的末尾再操作两次,先分别加上(1,0),再分别加上(0,1),这样就让它们相连的同时,把它们也转移到了末尾

复杂度O(N2)

agc068C Ball Redistribution

正着肯定不好做,考虑倒着做

先建图iai,那么得到了内向基环树森林,对于一次操作,正着就是把所有连向i的点都提出来连成一个环,那么倒着就是提一个环拆掉让环上所有点都连向i,且要满足原先就连向i的点一定在环上

那么显然如果有某一步使得原先连向i的点不在环上就不合法了

直接做是不好做的,考虑找个充要条件

手摸一下数据后可以发现,对于u的一个儿子v(即v不在环上),如果v子树中存在点x>u,那么一定可以用以下策略构造合法解:in1遍历,然后每次把i所处连通块的环拆了连向i,可以发现,这样每个i,要么没有孩子,要么孩子一定都在环中,且这种策略下,若有u不存在v满足v子树中存在点x>u,那么一定不合法

再来考虑后面这种情况,发现此时操作u前,其子树v是一定不可能被操作的,因为没有环,即会保持原样,那么操作u时,显然v就是那个不在环上的儿子,那么确实就是一定不合法的

所以直接dfs判即可

复杂度O(N)

P3765 总统选举

数据结构

正常的做法就是用线段树维护摩尔投票和平衡树维护每个值的点,平衡树改成线段树也可以,就是这样空间更大

原本写的是 正常的做法就是线段树+平衡树,线段树+线段树也可以,就是这样空间更大,小登以为我说的是树套树,又把我jue了一顿/ll,遂改

没树枝小登,真给我踩了。。。

随机化 ✯

然后牛的是随机化做法,取一个k,然后在区间中随机k个数,对于每个选出的数都去平衡树里判一下是不是绝对众数,若存在绝对众数但选k个都没选到的概率最大都是12k

分块

无所不能的根号分治啊,怎么有人啥都能来分两手啊

设阈值B,若查询区间B,直接暴力查了,若查询区间长度>B,绝对众数至少有B2个,这样的数字只有2NB个,然后对每个这样的数都去线段树/平衡树上查一下就行

B2NlogN复杂度O(QNlogN+klogn)

[AHOI2005] 航线规划

OIwiki用作的维护边双连通分量的例题啊,提供另一种做法,更简便

LCT做法

给边单独建点,然后夹在其连接的两点之间即可,然后考虑倒着操作,就是加边,如果不连通就link,连通就把这条链上所有点的权值变成0,初始边点的权值是1,普通点的权值是0

复杂度O(MlogN)

CF618G Combining Slimes

考虑最终的序列呈什么样子,肯定会是一些下降段的拼接,而每个下降段的末尾都是1(最后一个下降段可能不是),每个下降段最开始都是先放了一个2(第一个下降段可能不是)

因为显然对于一个序列,满足它当前末尾不是1,然后发现当且仅当你塞一个1再塞一个2,会使得1及其左侧的部分后面都不会再被操作了

那么现在的大概方向就是想要求出每一段的答案然后拼起来,然后每一段的分隔是用1来分隔的

又可以发现,设序列最大值是m,概率大概可以表示为(p2+1p)m,则m>50时几乎就是0了,所以我们的数最大取到50即可

dp[i][j]表示现在序列长度为i,且最左侧是j的序列的和的期望

对于j>1dp[i][j]=k=1j1dp[i1][k]×f[i1][k]k=1j1f[i1][k]

当时推到这里迷惑为啥是f不是f,因为看似这个式子后面的转移保证了后i1个的第一个是<j

总的期望不是概率×权值吗,但实际上发现它只是保证了你当前算出来的权值是合法的,本来就应该是合法的概率×合法的权值

这里f[i][j]表示长度为i的序列,最左侧是j的概率

要转移到这个,肯定还需要f[i][j]表示长度为i的序列,最左侧出现过j的概率,显然f[i][j]=f[i][j1]×f[i1][j1]j=1/2要初始化

然后有f[i][j]=f[i][j]×(1f[i1][j])

关于这些转移:

首先有:只关注最左侧的数,所以后面的数长什么样的不重要

其次,显然我们的这个过程是可

对于f,要想最左侧拼出一个j,就是先拼出一个j1放在最左边,再用剩下的i1位拼出一个j1,然后它们能合并成j

然后又因为上面所说的下降段的性质,所以如果现在拼出来了一个j,要想最左侧是j,即不会再出现j和这个j进行合并了,也即在后面的i1位的第一个下降段中,不会出现j的数,也即后i1个的最左侧那个<j即可,又注意到f的定义是 出现过,那么反向考虑,没出现过j的概率也就是最左始终<j,那么转移就得出了

dp的转移对于j=1时,有dp[i][j]=k2dp[i1][k]×g[i1][k]k2g[i1][k],其中g[i][j]表示长度为i的序列,最左侧是j且第一个放的是2的概率

同理,g[i][j]=g[i][j1]×f[i1][j1]g[i][j]=g[i][j]×(1g[i1][j])

最终的答案就是jdp[n][j]×f[n][j],因为f[i][j]i>m时,有f[i][j]f[m][j],所以答案式子变成jdp[n][j]×f[m][j],那么dp可以快速幂

复杂度O(M3logN)

P3239 [HNOI2015] 亚瑟王 ✯✩

首先,根据期望的线性性,算出每个卡牌被发动的概率,再乘上对应的伤害就可得到总的期望

考虑怎么算出每个卡牌被发动的期望

先来考虑第一张卡牌发动的概率,一下可能会想到枚举它是在第几轮被选择发动的,但是比较麻烦,对于后面的卡牌的计算也没啥可推广性,考虑容斥,即用总概率减去r轮都选不到第一张卡牌的概率,那么就是1(1p1)r

再来想第二张卡牌,如果第一张一直没选,该情况下,选第二张的概率就是1(1p2)r;如果第一张选了,看似要讨论第一张比第二张先选还是后选,但是发现因为我们是在用 总的概率减去 一直都没选到的概率,而这个 一直都没选到的概率因为一直都没选,所以就根本不用考虑当前这张是比前面某一张先选还是后选,所以此时的概率就是1(1p2)r1,因为选第一张的那一轮第二张根本不会存在选择是选还是不选的问题

那么就知道了,如果r轮操作下,1i1选了j张,那么第i张被选的概率就是1(1pi)rj

剩下的部分就显然了,考虑dp[i][j]表示前i张选了j张的概率,转移有:

dp[i][j]×(1pi+1)rjdp[i+1][j]dp[i][j]×(1(1pi+1)rj)dp[i+1][j+1]

答案就是:

Ans=i=1njdp[i1][j]×(1(1pi)rj)×di

复杂度O(N2)

CF804D Expected diameter of a tree

显然,伪的期望,根号分治即可

复杂度O(NN)

P3750 [六省联考 2017] 分手是祝愿 ✩✯

怎么像没学过概率与期望一样,看啥都是trick

首先可以发现,最优策略一定是从大到小,如果当前点状态为1就操作,否则不操作,那么对于给定的数组可以O(NlogN)的找出最优策略

再来考虑随机选点,发现对于当前序列,最优策略是t步,随机选点一次后会变成t+1/t1步,具体的,如果选中了最优策略中的点就是t1步,选中了这之外的点就是t+1步,因为显然我们的任意一个点的操作都不能被其它点的操作凑出来

那么这时就可以考虑dp了,状态就是最优策略的点数

这里我当时想到的是dp[i]表示最优策略点数为i时的期望,发现这样虽然可以O(N)转移,但是无法确定初始化

有个trick就是设dp[i]表示最优策略点数从i变成i1的期望,转移为dp[i]=nin(1+f[i+1]+f[i])+in,初始化f[n]=1

那么答案就是n!(k+i=k+1s0f[i])s0是初始的最优策略点数,如果s0k,答案就是n!s0

复杂度O(NlogN)

CF1267G Game Relics ✩✯

首先能注意到cix,可以猜测最开始一定是先随机,然后最后再直接买

考虑在已有i个的情况下,随出一个新的数的期望fi=in(x2+fi)+ninx,化简得fi=i2(ni)x+x,显然随着i的增大,fi也在增大

考虑什么时候会从随机转变成直接买,设已经随机了i个,它们的c之和为j,那么如果现在变成买,代价就是sumj,这里有个trick,给它平摊一下,那么每选一个的代价就是sumjni,那么此时直接比对sumjnifi的大小就能知道选那种操作了,且显然fi在增大,如果当前前者更优,之后前者都会比fi更优

复杂度O(N3+N2V)

CF1392H ZS Shuffles Cards ✬✡✩

首先我们可以得到:Ans=E()×E(),这是显然的

考虑E(),我们令操作变成每轮抽卡都要把卡抽完才结束,但只有第一张鬼牌及其之前的卡会被计入数量,那么E()=E()+1,而每个数字牌比所有鬼牌都先抽到的概率是1m+1,所以E()=1m+1+1

考虑E(),它可以表示为iE(i)+1,这里我们的E(i)是一个左闭右开形式,即包含了不包含刚好抽到新数字牌的那一轮的,这一轮算在i1E里,因为不这样会算重

下面简化的称之为E(i),那么在第一张鬼牌前存在新牌的概率是im+i,所以E(i)=m+ii1=mi,这个1就是去掉包含抽到新牌的那一轮

那么Ans=(1m+1+1)(mi=1n1i+1)

CF1411G No Game No Life

很典的模型,每个芯片都是一个独立的模型,它们的sg值的异或和就是答案,可以先O(M)的求出每个点的sg

然后我当时这里想的就是trie数+组合数乱算,算出后手赢即最终sg=0的概率,然后发现有些过于麻烦,放弃了

可以考虑设f(x)表示若初始局面的sg值是x,先手胜的概率,那么有:

f(x)=[x1]n+1+yf(y)cntx xor yn+1

然后高斯消元就行

还有神秘FWT做法啊,先不打算做,咕咕咕

复杂度O(M32)

P8868 [NOIP2022] 比赛

解法直接co聊天内容了啊(

分治做法

它分治的做法的话

就是考虑离线,然后把询问挂到区间上

具体就是,跨过了这个区间的中点就挂到区间上

然后如果完全包含了这个区间,这个区间下面的区间就不用挂了

然后询问的话,考虑枚举右端点

设右端点是i

然后大概有两种情况

一种是a和b的最大值都在同一侧

另一种是异侧

然后就先考虑a的最大值在右边的情况

此时可以发现

首先左端点会有一个限制

设它要>=j

然后j-1就满足是边界或者a[j-1]>mid+1~i的最大的a

然后发现会存在一个k

左端点<k的,b的最大值在左侧

=k的在右侧

然后考虑每个i的贡献

对于[j,k)的左端点p,就是bmax[p,mid]*amax[mid+1,i]

[k,mid]的是bmax[mid+1,i]*amax[mid+1,i]

然后就可以线段树维护每个点作为左端点时的贡献

查询答案的话,如果一个区间[l,r]的r=i

那么就能得到[l,mid]中的点贡献

双log

单调栈+扫描线做法

就扫描右端点,然后维护一个a和b的下降的单调栈

设右端点还是i,左端点是j

然后此时j的贡献就是在单调栈上下标>=j的最小的两个a和b的值的乘积

然后考虑加入a[i]和b[i]的影响

还是可以线段树维护

先考虑如果加入进去,栈没有弹出的话

就两个栈都不弹出

此时左端点j的贡献不变,这个就可以打tag

增加一个新的左端点j=i的值

就类似区间修改,++tag,然后维护区间内所有j的此时的贡献,就是a*b的值

然后如果栈有弹出

其实就是区间修改一个后缀

那么线段树维护就行了

单log的

CF2023C C+K+S ✩✯

蓝题都不会了喵/ll,染色trick根本没想到喵

因为是强连通图且环长保证为k,所以可以给每个点染0k1的色,然后若存在边uv,就要求v的颜色值是u的颜色值+1然后modk

得出A图和B图每个点的染色,然后,就是要它们的颜色数组成循环位移的关系

然后hash不知道行不行啊,感觉可能会冲突?毕竟总的数量太多了,总之kmp可以

复杂度O(N)

CF2023D Many Games ✬✩

trick啊,疯狂给dp剪枝了属于是

一开始试图找一些结论,未果,考虑背包,能作背包的就pi100wi,显然只能是wi

发现题目给了一个神秘的性质,pi×wi2e5,猜测能用来限制我们的wi的大小

考虑最优解集合S,那么此时去掉其中任意一个数j都不优,即有:

iSpi100iSwiiSpi100pj100(iSwiwj)wj100pj100iSwipj=100wj×100100pjiSwi

注意到100100pj>pj当且仅当pj=1时成立,因为100pjpj2是二次函数,画出图像易证,那么只要pj>1,都有iSwiwj×100100pjwj×pj2e5,当pj=1时,大概取到202020

那么我们dp的状态就是O(2.1e5)级别的了

考虑转移的复杂度,按pi对物品进行分类,有显然正确的想法,若要取k个,则取piwik大的

考虑pi中最多取k个,如果就取k+1pi不优于就取kpi,那么显然最优答案就不可能会有k+1pi,这个易证

设前k大的wi之和为S,第k大的wivp=pi100

那么有式子

pkS>pk1(Sv)pS>Svk1kSk<11p=100100p

那么转移就是O(100log2100)的级别

总复杂度大概O(2.1e5×100log2100),绰绰有余(

posted @   LuoyuSitfitw  阅读(49)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示