杂题选做

T2多测没清空,爆零了。

没什么好说的,也不知道有没有机会了。

趁着最后半天whk半天竞赛的日子再做些题吧。

upd:标题更新了!今天听了学长的经验分享,收货良多,以前一直都是在弥补自己的短板,对于各种缺失的知识点进行补全。但是近几场比赛的失利,让我意识到了比赛最让人追悔莫及的是没想到应该想到的点,没拿到应该拿到的分。其实在做题思维上我还有很多的提升空间,而思维题又恰恰是我所喜爱的,那么为什么不将其作为自己的一项“长板”发展呢?于是整理一下各大网站上做过的题,近期的做题重心也偏向一些思维吧。

本篇主要更新思维难度较大,个人做题时毫无思路的题。

 

ARC110E

挺神的一道dp题。

这么考虑:如果一段串可以拍成一个字母,那么其实这个字母是唯一确定的。

再进一步:可以吧$ABC$每个字母都看成二进制,两个数结合就是异或。把$ABC$分别赋值为$1,2,3$,发现如果一段的异或和不为0,那么它一定能缩成一个字母,反之则不能缩成(如果这一段前面有字母的话,可以把这一段全部干掉)。

那么我们设$dp[i]$表示当前以$i$结尾的方案数,思考如何转移。

转移的时候可以枚举后面那段哪些拍成哪个字母,因为统计方案会重复(考虑相同类型的两个位,它们之间的异或和是0,可以全部干掉,会重复统计),所以只更新最先的可以形成各个字母的位。(其实就是每种字母每种出现次数只更新一次)(类似于子序列自动机?)

索性说一下子序列自动机吧,以求不同子序列数为例,有两种不同的写法和理解

一种是记$dp[26]$表示以这个字符结尾的方案数,每次转移的时候乘上一个矩阵就行了,用容斥之类的思想理解

还有一种就是上述的方法,记$dp[i]$表示以$i$结尾的、最先在此表示的字符串个数,然后它连上的各个$nxt[i][26]$加上这条转移边也一定是最先,直接转移,这样就更有自动机的味道了吧

在统计答案时,因为保证了$dp[i]$的第$i$为一定是作为最后一位存在的,而事实上$n$不一定存在,它可以被所有异或和为0的串干掉,所以要把所有后缀异或和为0的前一位全部统计。

注意字母全部相同的Corner Case。

 

UOJ168

很久没有做过什么单题了,近几天都是漫无目的地一套一套水比赛,应该开始学新姿势了~

结论题,吉老师nb!!!

定义完全图为$E=2V-2$的图,如果一个图中没有$E>2V-2$那么一定有解

充分性见题解区证明

必要性:如果有这么一个子图,在删掉一堆度数小于等于3的点以后,剩下的所有点度数都大于等于4,$2n \leq m$必然无解

其实很像当时联考的时候周指导出的一道题(那道题是删边,会简单很多):每次删掉度数为3的点,对于连向的3个点分别划定集合,可以保证有解。

对于是否有解的判断,可以根据点边建二分图跑最大权闭合子图,大于-2就无解,而这玩意只能跑大于等于0的,所以钦定一个点必选,剩下的跑出来为正就无解。

关于退流删边,大概就是把$(u,v)$这条边,$u$到$S$跑一遍,给前面的流再一次选择;$T$到$v$,把疑似通过$(u,v)$的流全部退掉,然后删掉边以后重新跑一遍就好了。

 

luogu5850

exp有两种求法,你知道吗

最近在做拉格朗日插值,对于这道题的弱化版,可以先搞出递推式:$dp[i][j]$表示前$i$个数,取值取到$j$的答案总和,那么有递推式:

$$dp[i][j]=dp[i-1][j-1]*j+dp[i-1][j]$$

差分以后次数减一,把式子移项,$dp[i][j]-dp[i-1][j]=dp[i-1][j-1]*j$,然后第一维就可以降次了,有:$g[i]-1=g[i-1]+1$,是一个等差数列,对于$n=1$是一个一次函数,那么$n$维就是$2n-1$次多项式。

然后就可以对于$k$自变量进行拉格朗日插值,直接$n^{2}$dp即可

对于加强版,式子太长我就直接贴题解区的了:

上文所提到的exp,可以直接对于一次式exp,也可以对于e进行阶乘展开多项式求逆,注意减一以后整体左移,运算时要多保留一位。

 

CF1086F

一个拉格朗日插值很好的一道题,思路还是很清晰的。

我们记$f(x)$为前$x$秒的着火点数量,边界$f(0)=n$

单个$f$的计算是很简单的,直接矩阵面积并即可。

考虑计算答案,答案$$ans=(t+1)f(t)-\sum_{i=1}^tf(i)$$

考虑$f(i)$这个东西,它其实是一个分段的二次函数,两个没有相交的时候,总面积是二次函数;两个相交以后它们之间“互相渗透”的面积变化也是一个二次函数。

要求的是sum,那么对于这个二次函数再取一个前缀和,答案是三次函数。

所以我们对于每一段可以选取4个点来进行拉格朗日插值,代入自变量即可。

复杂度$O(n^{4})$或$O(n^{3}logn)$,取决于矩阵面积并的实现复杂度。

 

AGC008E

做这道题那天状态非常不好。(其实感觉自己已经很长一段时间低效率了)

很容易想到置换,即变的元素向坐标连一条边,两次之内所求值必定经过边到达指定位置,但反着处理更简单:即每个点出发至多两步必须到所要求的值。

根据每个点出度都为1,可以把图分成若干个奇环内向树,对于简单环和内向树分别统计。

对于简单环,有三种情况,一种是直接连,一种是每个点都是跨一个连一个,一种是两个长度相同的环拼起来。

第一种不用说,第二种只会奇环有贡献,因为偶环这样连肯定是两个小环而不是大环了。

对于第三种,要乘上选出环的方案,钦定两个集合的方案,除以先后顺序无关的2的次幂,再乘上拼接时共有环长种的方案。通过枚举拼接个数可以很好统计。

对于奇环内向树,相当于把它的一些长出来的链拍进环里面,环的两点间一旦拍进一个点就废掉了,注意一个链不是往两边排都可以的,它是有方向的(顺着环的方向)。

所以直接按照上述进行模拟即可,注意到如果一条链拍进了废的点那么无解,如果刚刚好那么没有系数,如果有多的那么系数乘2(就是第一个挂的位置)。

 

AGC038E

看到MinMax激动了老一会,然后推式子了半天甚至只会$2^{2n}$,然后看题解,发现原来是自己概率期望没学好。

首先对于$n$个元素进行MinMax,然后就是要计算对于若干个元素至少有一个到达要求的期望步数。

可以把每个元素选的个数看成状态,状态的转移显然是一个DAG,就是对于所有刚好到达要求的状态深度期望统计求和。

把之前做数据结构题LCA的套路用上,对于深度拆贡献,那么就是每个状态达到的概率求和(把贡献统计在父亲处更好处理)。

那么式子就是:

$$\begin{aligned} &(-1)^{|T|+1}E(\min(T)) \\ =&(-1)^{m+1}\sum_{i \geqslant 0} \left( \frac{s-\sum a_{x_i}}{s} \right)^i\sum_{0 \leqslant c_i < b_{x_i}} \frac{(\sum c_i)!}{\prod(c_i!)}\prod\left(\frac{a_{x_i}}{\sum a_{x_i}} \right)^{c_i} \\=&(-1)^{m+1}\frac{s}{\sum a_{x_i}}\sum_{0 \leqslant c_i < b_{x_i}} \frac{(\sum c_i)!}{\prod(c_i!)}\prod\left( \frac{a_{x_i}}{\sum a_{x_i}} \right)^{c_i} \\\end{aligned}$$

状态发生概率是先无序然后乘上有序多重集排列

其实之前的整体dp总结的不是很好,那个套路不仅仅是把答案放进去统计方案,而是把便于放入状态的,而且可以表示整个式子的值放进状态进行dp。

像这里把$\sum a$和$\sum c$作为状态放进去,可以发现答案甚至被拆了($B[i]$处的枚举),但是只要不重不漏地表示所有答案即可。

在dp的时候,把常系数提取出来更好处理

 

LOJ6587

对于同余这一类的问题,先想一些特殊情况。

假如所有的周期都是互质的,那么彼此之间所有状态都能出现,独立算贡献即可。

如果所有数都是倍数关系,那么最小公倍数就是最大值,直接暴力即可。

然后就是想办法把那些不互质的全部搞成倍数关系。

暴力是一步步枚举的,周期是$r+g$

现在改变枚举的步长,那么这个周期如果和步长有公约数的话就会被缩短。

我们可以借此使得所有值都是倍数关系。

打表出满足这样条件的数最小是2520,直接对于2520每一个余数(即出发时间对2520的余数)枚举各个点的概率贡献即可

复杂度$O(2520pn)$

 

IOI2018 Highway

从部分分一步步扩展成正解,先看树上的问题。

加入已经知道一个端点,那么对于根节点建立bfs序,然后二分,每次把$[mid+1,r]$染成不同的颜色,看是否最短路会改变,然后就能找出另一个节点了

然后看树的一般情况,步骤是先找到一条最短路上的边然后断开在两边分别找一个端点。

找一条边就是对边进行二分,然后把$[1,mid]$的边权改变,看最短路是否改变,即可找到。

现在转化成图,找一条边的步骤是一样的,虽然这条路不一定是必经过的,但是它的选或不选会影响答案,肯定是其中一条。

然后看怎么把图变成树,对于最短路的那条边$(u,v)$,对于起点终点$x,y$一定有$dis(u,x)>dis(u,y),dis(v,y)>dis(u,x)$或$dis(u,x)<dis(u,y),dis(v,y)<dis(u,x)$

所以我们就可以对于$(u,v)$bfs找出$x,y$的候选集合,这两个集合一定不交,而且是一颗树,直接搞就行了

有一个注意点,对于图来说,因为有多条最短路,所以如果是把子树里面一部分改成较大值,可能最短路仍然存在,所以应该提前把两棵树无关的边全部赋值成较大值,这样剩下的最小值构成一棵树就可以不被影响直接查询了。

 

IOI2018 Seats

记得好像是IOI02年的题,就是每次翻转一个矩形黑白然后要求全部变白步数尽量小,看整个矩形很难搞,但是如果对于颜色异同二次差分一下,这样每次修改只改了3个端点,然后就很好做了

这启发我们可以用一些比较好维护的特征来维护整个矩形。

前k个构成一个矩形?我们把小于等于k的染成黑色,其它的染成白色,然后让我们用简单的,可以$O(1)$的充分必要条件代替是矩形(以下是看题解的):

1.对于所有黑色点,它左上都是白色的点有且仅有1个(保证连通性),有一个就贡献1

2.对于所有白色点,它不可能周围有3个黑色点,有一个就贡献1

这样每次修改的时候暴力扫描改的两个点的周围,先把它们的贡献删掉,然后重新统计贡献。(贡献指上述两个条件对不同的k的贡献,用线段树维护不同的k,然后修改的一定是一个区间)

因为对于每一种颜色一定有1个黑色点,然后$k=0$必然成立,所以只要记录最小值个数就可以统计答案

 

IOI2018 Meetings

最近一天几乎只能做3/4道题,很多做题思路,甚至是别人口中的套路,都不是很熟悉,还是多加整理,可能在不断被虐以后才能有一点点进步吧

先讲一下JZOJ的一道题:(感觉不是很有关,但是对它模糊的记忆让我想出了dp方程式)

记录一下$pre_i$表示从$i$向前第一个比$i$小的数的位置

 

(好像没什么关系的说,但是取最大值然后分段击破的第一步可以启发)

 挑出最大值,然后两边选一边,那一边的代价全是最大值,即有dp另外一边则是原来dp值,可以列出$O(n^{2})$的方程式。

$$dp[l][r]=min(dp[l][mid-1]+(r-mid+1)*a[mid],dp[mid+1][r]+(mid-l+1)*a[mid])$$

然后观察dp转移,发现对于一个确定的$mid,r$,方程去左边还是取右边的断点是可以二分$l$得到的。

然后我们按照最大值建立笛卡尔树,然后观察询问$(l,r)$在树上所覆盖的点。

把$l,r$的$lca$搞出来,然后对于左子树,一定是$l$到该子树的最右端点,对于右子树,一定是$r$到该子树的最左端点,所以dfs的时候对于每一个节点保存到最左,最右分别的答案,然后在$lca$处统计对应的$l,r$答案即可

因为决策可二分的性质,所以可以线段树区间修改,即需要线段树支持区间推平,区间加,区间加等差数列,二分断点等功能,都是比较容易实现的

个人实现的时候大概展开写了20个线段树操作,常数非常大,但是4.5s还是跑得过的

posted @ 2020-12-07 22:23  'Clovers'  阅读(142)  评论(1编辑  收藏  举报