其他分享
首页 > 其他分享> > 2021 正睿系列全家桶

2021 正睿系列全家桶

作者:互联网

提高day2

\(\;\)

A

\(\;\)
发现最终获胜者知道了,每种手势的人数也确定(因为没有平局的存在)
让字典序最小,只需递归一下,判断是否需要交换子树

B

\(\;\)
从低到高dp,暴力数位dp的过程中维护模后的结果就有80
但发现这样有一个劣势,如果是加相同的数位,模运算的结果仍和位数有关(我们想扔掉这个东西)
所以只能从高到低填。但这样如何维护位数?发现把加位操作看成连边,那么只需要找到一条从0到0的最短路(滑稽),注意这里要倒着建边
最短路的长度就是位数,而因为建的是反边,所以可以倒着考虑字典序最小的方案

C

\(\;\)
最终每个联通快显然是完全图,不然可以先让没有边的两个点空出来,先匹配剩下的,然后就死了
所以假如最终得到的若干个联通快的点数集是相同的,和最终每个联通快中有多少条边是没有关系的。
所以这里的边的作用只有提供初始的联通关系。
显然可以想到转压(\(n\leq 25\))
但如果单纯的装压是不行的,于是思考我们怎么排除冗余状态或是优化状态表示
你会发现,联通块是不同的,只和它们的左右点数有关
所以可以把左右点数相同的联通块看做一种。
这样虽然同种联通块数量变多,但种类大幅减少,可以证明(,这玩意是40000级别的
然后状压的时候,每一位的base都是不同的,即为\(cnt_i+1\)
这玩意如何判断子集关系?
设\(S\subseteq T\)
挺好用的,要记一下。
设\(count_i\)表示\(i\)这个状态的各位之和
那么条件就是\(count(S)\leq count(T)\)且\(count(T-S)+count(S)=count(T)\)
但复杂度有点危,所以要先处理出每个状态左右点数是否相等,只需要管这些状态
因为一个合法的状态,要么就是一个大联通块,要么是多个左右点数相同的联通块,这样状态数就少多了

普及day3

\(\;\)

A

\(\;\)
伞兵题

B

\(\;\)
诈骗题
容易发现,只要确定了第一行的选法,剩下的都是固定的
\(O(2^m nm)\)

C

\(\;\)
原题
自闭了。做过的题还不会
当遇到判断两个相对的量时,把\(a\)序列的所有数都变一个量,\(b\)变另外一个量,那么得到的两个序列,显然就会把答案算到
但会把差异为1和差异为0的算多遍,把这部分减去

D

\(\;\)
套路题
因为修改的位置只有1个
考虑修改每个位置后所造成的影响
可以用线段树维护差分(小茄子精通二阶差分)

提高day3

\(\;\)

A

\(\;\)
围棋题,中等模拟

B

\(\;\)
套路题,用线段树维护dp的第二维。
根据手玩的结论,一次只会走到左右最近的两个线段中,或不动
可以发现,如果\(j\)不是某个线段端点,其直接由上个时间继承过来(不用动)
而转移端点就是个区间查询最值问题,线段树解决

C

\(\;\)
对于边双(删一条边仍联通)里面的点,一定满足通过定向,能够走一圈,大概把他看做若干个边双用个圆连起来。
所以\(f\)的种类就是边双的个数
这个东西可以考虑树形dp,顺便记录一下与子树根所在联通块的大小,等待在上面算(延后算贡献)
然后就是个树形背包(卷积的形式)
但现在得到了一个树上的联通快,如何算其变成边双的方案数,发现这个东西很难恰好计算
那么我们干脆就考虑随便连,这样\(dp_{i,j}\)的j的恰好可以转化为至少
因为有个很好玩的东西,一个非边双联通块可以把它分解成若干个边双
有点像容斥了。
实际上是容斥的一般形式
对于函数\(f(S)\)(至少),\(g(S)\)(恰好)
显然满足:
\(f(S)=\sum_{S\subseteq T} g(T)\)
那么还有一个类似反演的形式:
\(g(S)=\sum_{S\subseteq T} (-1)^{|T|-|S|}f(T)\)
这个东西反过来也是成立
这玩意很重要
那么就可以容斥了,容斥系数如何求?
当然可以考虑用组合数递推,但推完之后发现就就是\(C_{|T|-1}^{|S|-1}\)
这东西看着好像可以用隔板理解,但推出来确实是这样
然后直接dp也是不行的
发现是卷积(树形背包),直接用点值转移就可以了

D

\(\;\)
由于选出的两个子串长度是相同的,假设它们的间距为\(d\)
有一个套路,把序列每隔\(d\)划分一下,根据抽屉原理,显然字符串肯定会经过一个关键点
用关键点来统计答案的贡献
这样就出来了一个调和级数的东西,且这几个关键点长的都一样,用同样的方法去维护
用后缀数组求出lcp和反向lcp
然后贡献时,大概长成一个把区间加上一次函数的形式(这个东西也很好用),维护k和b,一维差分即可

普及day4

\(\;\)
ABD略

C

\(\;\)
给定平面上的\(n\)个点,求两两连线中斜率最接近\(\frac{P}{Q}\)是多少
\(n\leq 10^6\)
过每个点画一条斜率为\(\frac{P}{Q}\)的直线。
显然只有相邻截距的点才会贡献答案。
证明:可以放在一个三角形里考虑,就算当前边没有跨结局的边\(x\)优,那么第三边也一定是比\(x\)优的
所以按斜率排序,可以用这个柿子:\(yQ-xP\)
复杂度:\(O(n\log n)\)

提高day4

\(\;\)

A

\(\;\)
注意看题注意看题,是子串而不是子序列
显然可以考虑每个空隙的贡献,\(A->C,C->A\)一定会贡献,\(B->C, B->A\)可能会贡献,还要找到\(B\)前面第一个非\(B\)的字符位置来判断
复杂度:\(O(n)\)

B

\(\;\)
\(O(n^3)\)的区间dp比较显然,因为常数比较小,卡一卡可以到70pts
80pts:用指针来跳数组中的地址
100pts
考虑一种\(O(\frac{n^3 \log n}{w})\)的做法:
首先二分这个最大值,那么转化为判定性问题:每次操作的权值都不能超过mid
\(f_{i,j}\)只能是0或1
这里我们的dp不用枚举len的方式
而是倒序枚举\(i\),正序枚举\(j\),这样的方式方便我们去刷表(自己去更新别人)
首先要算一下\(f_{i,j}\),\(O(1)\)的转移
考虑\(f_{i,k}|=f_{i,j}\&f_{j+1,k}\)
只有\(f_{i,j}\)为1的时候考虑转移,那么到bitset上就是\(f_i |= f_{j+1}\)
但如果\(f_{i,j}\)已经为1了,说明存在\(l\),能更新\(f_{i,j}\),那么这个东西也一定能转移到\(f_{i,k}\)
所以只有当原先\(f_{i,j}\)为0,且现在能转移,我们才进行bitset的操作

C

\(\;\)
因为只关心s有多少种可能,但不关心具体是哪一些,所以不关心具体顺序
所以显然可以按\(p_i\)排序。(这里需要注意)
设\(f_{i,j}\)表示前面满足\(s=0\)的最大的j
考虑转移,如果来了一个比\(j\)还小的数,显然这里唯一只有一种可能,对答案没有贡献
否则,可以考虑其\(s_i=0/1\)(我们一定可以通过构造方案,即动态调整前面元素的取值让它为0/1),这实际可以看做是否可以加入到上升子序列的一个过程
所以考虑这个dp的实际含义:实际就是统计q的上升子序列的个数
0如何处理
考虑一段0一段0的加
\(f_{i,j}\)表示前i个选了j个0构成上升子序列的过程,然后枚举选了多少个0,组合数搞一下
\(O(n^4)\)
考虑转移形式\(\sum f_{i,j}\times C_{a,d}\times C_{b,d} -> f_{k,j+d}\)的形式,把\(C_{a,d}\times C_{b,d}\)看成\(g_{a,b}(d)\)
就是一个卷积的形式,那么就可以考虑用多项式优化。把dp的第二维消去,看做多项式,把dp值看做系数
因为只关心\(dp_{n+1}\),所以我们不必实时求出所有系数
求出多项式的点值,最后高斯消元解出来就可以了

D

\(\;\)
这里我们只关心最终得到的排列有多少种。
有些线段可能是不合法的,即:用一些更小的线段拼凑而成(取2个)
可以证明只要选的线段都是合法的,那么最终排列的结果只和选取的线段有关
把合法的拿出来,那么就转化为选取线段的方案数,使得它们两两不交
设\(f_i\)表示考虑了所有\(i\)之前的线段的方案数(注意这里没有钦定\(i\)被选)
用合法的线段转移就行
\(O(n^2)\),有60pts
考虑优化转移:
法一:扫描线
把\(<x\)的所有数看成0,\(\geq x\) 的所有数看成1,那么不合法的线段一定是一段0+一段1。
就是一个矩形的形状。
拿扫描线扫第一维,线段树维护第二维(把那些覆盖次数为0的dp值加起来)
法二:单调栈
很玄学的一种思路,需要画图理解
找到在\(i\)之前小于\(a_i\)的第一个位置pos
再从pos往前找到第一个大于\(a_i\)的第一个位置pos'
显然左端点在\([pos+1,i-1]\)都是合法的
在\([pos'+1, pos]\)都是不合法的
剩余的如何确定能否转移(到了最难理解的部分)
首先找到单调栈中在pos'右边的第一个元素k
考虑这个位置有什么含义:显然k之后的元素都大于\(a_k\),在\([pos,k]\)中也是最小的元素
下面证明\(f_k\)在\([1,pos]\)内的转移与\(f_i\)是完全相同的
1.不可以转移到\(f_k\)一定不能转移到\(f_i\)
2.可以转移到\(f_k\)的一定可以转移到\(f_i\)
因为有k这个位置的良好性质,两个都可以证出
维护dp值的前缀和就可以了
\(O(n\log n)\)

标签:联通,线段,全家,pos,转移,正睿,2021,可以,dp
来源: https://www.cnblogs.com/czyty114/p/15315010.html