2020集训队作业板刷记录(四)

ARC093F

传送门

不会

我们发现,如果\(1\)和某个\(x\)在第\(i\)次比赛中相遇,那么\(x\)必须得是自己的那棵子树中所有\(2^i\)个数字里最小的

由于总共的子树只有\(O(n)\)棵,我们考虑容斥,强制枚举某个集合\(S\)表示这个集合代表的子树的最小值是这\(m\)个数中的某一个,算出\(f(S)\),最后统计答案即可

从大到小考虑每个数字,我们可以设\(f_{i,s}\)表示考虑\(m\)个数中前\(i\)大的,其中集合\(s\)所代表的的子树已经被占据了的方案数,枚举新占据哪个子树,用组合数计算方案数即可

CF708E

传送门

不会

\(c_i\)表示\(k\)秒后左边恰有\(i\)个格子消失的概率,那么一行剩下\([l,r]\)的概率就是\(c_{l-1}\times c_{m-r}\)

我们设\(f_{i,l,r}\)表示第\(i\)行剩下\([l,r]\),且上面都连通的概率,容易写出一个\(O(nm^2)\)的转移

考虑优化,我们设\(f_{i,l}=\sum_r f_{i,l,r},g_{i,r}=\sum_l f_{i,l,r}\),容易发现\(f,g\)可以通过前缀和优化做到\(O(nm)\)的转移

CF571D

传送门

不会

如果只考虑学校的话,用一个带权并查集就能处理

如果只考虑军营的话,也可以用一个带权并查集来处理每个点最后一次被爆破的时间

那么我们先只考虑军营,预处理出每个点最后被爆破的时间,然后离线处理学校就行了

AGC029C

传送门

二分一下,然后模拟即可

AGC037F

传送门

做过,(这里)[https://www.cnblogs.com/yuanquming/p/11378620.html]

CF553E

传送门

不会

我们设\(f_{u,i}\)表示\(i时刻在\)u$时的最小期望代价,转移如下

\[\begin{aligned} f_{u,i}=\min_v \{w_{u,v}+\sum_k p_{v,k}\times f_{v,i+k}\} \end{aligned} \]

边界条件为\(\forall i>t,f_{u,i}=dis_u+x\)

注意到\(f\)的第二维是递减的,而且我们可以把后面那一个东西写成卷积的形式

所以用分治\(FFT\)即可

AGC24E

传送门

不会

如果我们直接算往\(A_i\)中添加一个数使得\(A_{i+1}>A_i\),那么方案会算重,比方说\(233\),添加一个\(3\),它放在第一个\(3\)前面和第\(2\)\(3\)前面是一样的。为了避免这种情况,我们强制这种时候都把\(x\)放在连续一段\(x\)的最后面

方便起见设\(A_0=\{0\}\),那么我们发现一个满足条件的方案中\(x\)需要放在一个严格小于\(x\)的数前面

我们考虑一棵树,有\(n+1\)个点,根为\(0\)表示虚根,每个点的编号表示它是在第几次操作中放入的,权值为这个数的权值,容易发现它满足堆的性质,而且每一个堆和一个操作序列都是一一对应的,所以我们只需要考虑这样的堆的个数即可

\(f_{i,j}\)表示树的大小为\(i\),编号为\([0,i)\),根的权值为\(j\)的方案数,转移我们枚举\(1\)号点(也就是编号最小的儿子)

\[\begin{aligned} f_{i,j}=\sum_{k=0}^{i-1}\sum_{l=j+1}^m f_{k,l}\times f_{i-k,j}\times {i-2\choose l-1} \end{aligned} \]

后面组合数表示子树内的编号,发现\(l\)可以用后缀和优化

最终的答案就是\(f_{n+1,0}\)

AGC027F

传送门

不会

我们先枚举一个不动的点,将它当做根节点,那么此时一个点被操作当且仅当它在两棵树中的父亲不同,且它必须在第一棵树父亲之前被操作,在第二棵树父亲之后被操作

我们模拟一下这个过程,康康是否可行

顺便注意如果根节点度数为\(1\),那么根节点也可能被操作,此时答案为\(n\)

CF536D

传送门

不会

首先求出\(S\)\(T\)到每个点的最短路,离散之后分别作为这个点的横纵坐标,那么就是要求轮流选若干行列

\(f_{i,j,0/1}\)表示选了\([i+1,n]\)行和\([j+1,m]\)列,谁先手时,以\(f_{i,j,0}\)为例,如果第\(i+1\)行没有数了,那么\(f_{i,j,0}=f_{i+1,j,0}\),否则设这些数的和为\(s\)\(f_{i,j,0}=\max(f_{i+1,j,0},-f_{i+1,j,1})+s\)

AGC028D

传送门

不会

我们考虑枚举连通块的左端点和右端点来计算贡献,设\(f_{i,j}\)表示\(i,j\)连通,且\((i,j)\)中的边没有连出\((i,j)\)之外的方案数

先求出\(g_n\)表示\(n\)个点任意匹配的方案数,以及\(c_{i,j}\)表示\([i,j]\)范围内未匹配的点数,那么\(f\)的计算就是用任意的减去不连通的,即

\[\begin{aligned} f_{i,j}=g_{c_{i,j}}-\sum_{k=i+1}^{j-1}f_{i,k}\times g_{c_{k+1,j}} \end{aligned} \]

复杂度\(O(n^3)\)

AGC031E

传送门

做过

首先,我们先枚举选的珠宝的个数\(k\)

然后先来考虑一维的情况,对于\(L\ a_i\ b_i\)来说,就是小于等于\(a_i\)的数最多选\(b_i\)个,等价于选的第\(b_i+1\)个的坐标要大于等于\(a_i+1\)

同理,\(R\ a_i\ b_i\)就代表选的第\(k-b_i\)个的坐标要小于等于\(a_i-1\)

那么我们对于每一个位置,都得到了一个区间\([L_i,R_i]\),表示选的第\(i\)个数的横坐标要在这个区间内(显然这里有\(L_i\leq L_{i+1}\),因为如果\(L_i>L_{i+1}\)等价于把\(L_{i+1}\)设为\(Li\),那么同理\(R_i\leq R_{i+1}\)

然后建二分图,左边\(k\)个点,每个点向右边\(n\)个点中的可行点连边,跑一个最大权匹配就行了

然后回来考虑二维的情况,左边\(k\)个点表示\(x\)坐标的限制,中间\(2n\)个点左边表示\(x\)右边表示\(y\)\(xy\)之间连对应的珠宝的边权,右边\(k\)个点表示\(y\)坐标的限制,跑一个费用流就行了

CF605E

传送门

不会,完全没看到最优策略几个字

\(E(u)\)表示从\(u\)\(n\)的期望步数,考虑下一步,如果是走到\(v\)\(E(v)\geq E(u)\),那么当前这一步的最优策略肯定是停在原地

由于我们永远不会走到一个比当前期望步数大的点,所以我们可以考虑将所有答案按从小到大得到顺序算出,并以此扩展

\(u\)的后继分别为\(v_i\)\(E\)非降,那么

\[\begin{aligned} E(u)=\sum E(v_i)\prod_{j=1}^{i-1}(1-p_{v_j})+\prod_{i}(1-p_{v_i})+1 \end{aligned} \]

第一部分表示\(v_i\)可以走且所有期望步数小于\(v_i\)的都不能走,第二部分表示这些点都不能走,那么就停在原地,第三部分就是这一步

那么我们每一次选出\(E(u)\)最小的\(u\)来更新所有点的答案,为防止\(1-\prod_i(1-p_{v_i})=0\)的情况,我们记下\(\prod_i(1-p_{v_i})\),算的时候再除掉就行了

ARC102F

传送门

不会,题解没看懂

CF666D

传送门

不会

先枚举每个点是上下还是左右,那么去重之后得到四条直线,考虑怎么求正方形顶点

如果是两横两竖,那么必须在四个交点

如果是一横两竖,那么正方形顶点必须在两个交点,枚举剩下的两个交点在上面还是下面

如果是两竖,那么已经知道了边长,对\(x_1\)来说,最大值就是\(x_1,x_2+D,x_3,x_4+D\)的最大最小值的平均值

细节会比较麻烦

CF626G

传送门

不会

我们发现,如果某个位置当前已经加了\(c_i\)张票,再加一张对答案的贡献是\({l_i\over (c_i+l_i)(c_i+l_i+1)}\)

而总共的票数\(t\leq 2\times 10^5\),所以我们可以用一个堆维护所有的位置\(+1\)的贡献

考虑一次更改,可以证明最多只会改变一张票,所以我们可以再开一个堆维护所有已经加入的票,每次取出最小的删掉

AGC027E

传送门

不会

如果将\(a\)视为\(1\)\(b\)视为\(2\),那么整个串在模\(3\)意义下的和是不变的

如果不存在两个相邻且相同的字符那么答案一定是\(1\),否则\(s\)能变成\(t\),当且仅当我们能把\(s\)划分成若干段,使得其中一段为\(0\),剩下每一段都和\(t\)的字符对应,直接\(dp\)就行了

AGC036E

传送门

做过,这里

CF611H

传送门

不会

我们把\(1\)号点当成根,那么可以看做是边和儿子的匹配,由于同种颜色本质相同所以我们一起考虑,每一次取出两个颜色康康在这两个颜色之间连一条边是否合法,合法的话就选择这两个颜色的代表点连边。由于这是一个二分图,根据\(Hall\)定理,如果二分图\((X,Y)\)存在完美匹配且\(|X|\leq |Y|\),那么对于\(X\)的每个点集\(S\),它向另一边连接的点数\(\geq |S|\),用这个判断一下就行了

AGC029E

传送门

不会

我们记\(c_u\)\(u\)的答案,以\(1\)号点为根,\(mp_u\)表示根节点到\(p_u\)的路径上的最大值,\(Q(u,x)\)表示从\(u\)出发,只经过\(id\leq x\)的点能到达的\(u\)的子孙的个数,然后考虑设\(u\)\(v\)的父亲,有

\[\begin{aligned} v>mp_u:c_v-c_u=Q(v,mp_v)+1\\ v<mp_u:c_v-c_u=Q(v,mp_v)-Q(v,mp_u)\\ \end{aligned} \]

发现对于每个数来说只有\(Q\)只有两个值是有用的,而且由于一些奇妙的性质所以爆搜即可

AGC038F

传送门

做过,这里

CF528C

传送门

不会

首先一个充要条件是每个点的度数为偶数且总边数为偶数,这个就随便匹配两个奇数度的点,最后康康要不要再连一条自环

然后我们跑一个欧拉回路,对于回路上第奇数条边原方向,偶数条边反方向就是了

AGC21F

传送门

做过,这里

AGC033E

传送门

不会

我们分情况考虑,如果全都是同一种颜色,假设全都为\(R\),那么连续两段蓝色的圆弧肯定不合法,问题转化为一个长度为\(n\)的序列,不允许有两个相邻的蓝色,首尾也不许同时蓝色的方案数。记一下\(dp_{0,1,2,3}\)分别表示开始是否为蓝色,当前最后一个是否为蓝色的方案数,转移显然

如果不是同一种颜色,假设开头的颜色为\(R\),那么依然不允许存在两端相邻蓝色圆弧。然后还有两个结论

  • 整个序列一定是由若干段组成的,其中每一段都形如连续奇数个红色+一个蓝色

  • 每一段序列的长度都有一个限制,不能超过\(L\)

先考虑第一个结论,如果连续红色的个数为偶数,我们不妨设序列最前面有连续\(k\)\(R\),如果\(k\)是奇数,把起始点设为这段红色的结尾就\(gg\),如果\(k\)是偶数,把起始点设为这段红色结尾前一个依然\(gg\),所以只有红色个数是奇数合法

第二个结论,对于开头的连续\(k\)\(R\),如果\(k\)是偶数,则最多只能放连续\(k+1\)个红色,如果\(k\)是奇数则最多只能放连续\(k\)个。如果这\(k\)个连续\(R\)不在开头,那么它们前面是一个\(B\),也就是说我们现在在一段红色的一个端点处。如果\(k\)是偶数,显然可以走回来,如果\(k\)是奇数,那么这段连续红色的个数不能超过\(k\)

那么我们预处理出\(dp_i\)表示长度为\(i\)的序列的合法方案数,发现奇数的位置肯定全都是红色,所以我们只要考虑偶数位置怎么放就行了,转移也比较显然

最后是旋转导致的多种方案数,我们枚举第一个蓝色和最后一个蓝色之间的距离,乘上对应的系数就好了

CF613E

传送门

不会

我们发现整个路径最多被分成三段,其中第一段先往左再转弯再往右,第二段只能上,下,右,第三段也是先左再转弯再往右,分别用哈希来\(dp\)一下就行了

AGC022D

传送门

不会

实际上就是判断到底会走几个来回

先将\(t_i\over 2L\)加入答案,然后将\(t_i\bmod 2L\),设\(l_i\)表示火车从右边来,下次经过\(i\)时能不能直接上车,\(r_i\)同理

对于最右边的,一定是从左边来的,所以如果\(r_n=0\)\(++ans\)

对于省下的,如果\(i<j\)\(l_i=1,r_j=1\),那么就可以匹配成一组,减少一次来回,由于\(l_i=1,r_i=0\)的点一定在\(l_i=0,r_i=1\)的点右边,所以可以对两端分别匹配

AGC034E

传送门

不会

首先枚举根,那么有两种操作,一种是选两个有祖先关系的点,一种是选两个没有祖先关系的点。由于前一种操作不会改变深度之和,所以可以证明不需要考虑,那么我们只考虑第二种操作

如果记所有子树的深度和分别为\(sz_1,...,sz_n\),每次可以选择两个不同的点同时\(-1\),那么这是一个经典模型,结论就是如果\(sum-mx\geq mx\)则最后剩下的是\(0/1\)(取决于\(sum\)的奇偶性),否则是\(mx-(sum-mx)\)

这是只操作根的情况,我们还需要递归一下\(mx\)的那棵子树,康康能得到的最小深度和是多少

CF566E

传送门

不会

先考虑一般情况,即非叶结点个数大于等于\(3\)

两个非叶节点\((u,v)\)有边,当且仅当存在两个集合的交为\(\{x,y\}\),用\(bitset\)优化就可以得到所有非叶节点之间的边了

然后考虑叶节点,叶节点对应的集合一定是所有包含它的集合里最小的那个,找出一一对应之后,发现去掉这个集合里所有叶节点,就等于它所连的非叶节点的连边集合,那么我们就可以找到它所连的非叶节点了

剩下的特殊情况讨论一下即可

ARC029F

传送门

不会

考虑一条边\((u,v)\),如果他俩在同一个强连通分量里,那么\(diff\)的条件就是不存在另一条\(u\)\(v\)的路径,如果在同一个强联通分量里,那么\(diff\)的条件就是存在另一条\(u\)\(v\)的路径

那么我们以每个点\(u\)为根遍历一遍,记录下到达每个点时是从\(u\)的哪条出边出来的,每个点最多只会被遍历到\(2\)次(第一次和大于等于\(2\)次),时间复杂度\(O(nm)\)

CF700E

传送门

不会

建出\(SAM\)后线段树合并,然后在\(parent\)树上树形dp一下就行了

CF566C

传送门

做过

假设现在根节点为\(u\),康康往\(v\)走会不会更优

设现在根节点在\((u,v)\)这条边上,离\(u\)的距离为\(x\),那么权值为

\[\begin{aligned} \sum_{i\notin tree_v} a_i(d_i+x)^{3\over 2}+\sum_{i\in tree_v} a_i(d_i-x)^{3\over 2} \end{aligned} \]

求导之后为

\[\begin{aligned} \sum_{i\notin tree_v} {3\over 2}a_i(d_i+x)^{1\over 2}-\sum_{i\in tree_v} {3\over 2}a_i(d_i-x)^{1\over 2} \end{aligned} \]

如果\(x>0\)时导数小于\(0\)就往这棵子树走,那么只需要判断一下此时是否有\(v\)满足\(2\times \sum_{i\in tree_v} a_i\sqrt{d_i}\geq \sum_{i} a_i\sqrt{d_i}\)即可,然后点分往里面跑,这样只会走\(O(\log n)\)个点,总复杂度\(O(n\log n)\)

posted @ 2020-05-31 19:06  源曲明  阅读(321)  评论(0编辑  收藏  举报