cf补题

备战EC,EC完应该就退役了吧
感觉最近能大概率出一些2E,2400左右的题目了,还是比较开心的。

CF题目

\(比赛\)
\(C\)
\(D\)
\(E\)
\(F\)
\(G\)
\(H\)
\(1647\) \(\checkmark\) \(\checkmark\)
\(1651\) \(\checkmark\) \(\checkmark\)
\(1670\) \(\checkmark\) \(\checkmark\)
\(1671\) \(\checkmark\) \(\checkmark\)
\(1712\) \(\checkmark\) \(\checkmark\)
\(1717\) \(\checkmark\) \(\checkmark\)
\(1721\) \(\checkmark\) \(\checkmark\)
\(1726\) \(\checkmark\) \(\checkmark\) \(\checkmark\)
\(1728\) \(\checkmark\) \(\checkmark\)
\(1730\) \(\checkmark\) \(\checkmark\)
\(1733\) \(\checkmark\) gugugu
\(1734\) 场切 \(\checkmark\)
\(1735\) \(\checkmark\) \(\checkmark\)
\(1739\) 场切 \(\checkmark\)
\(1771\) 场切 待补
\(1766\) 待补 待补
\(1762\) \(\checkmark\) \(\checkmark\) 待补
\(1767\) \(\checkmark\) 待补
\(1774\) 场切 待补 待补 待补
\(1763\) 场切 \(\checkmark\)

题解

1647E

关键一步是可以通过当前在场学生的编号最大值算出变换的步数,进而算出对于每个座位,哪些座位上的人最终会到达它上面。然后对于每个座位,它对应的到达集合中标号最小的座位上一定坐的是最终序列中坐在它上面的人,剩下的字典序贪心即可。

1647F

官方题解没看懂,但是自己好像yy出了一个,就是用这个的第一题的做法,设f[i][j]表示前i个元素形成两个上升子序列,其中一个末尾是a[i],另外一个末尾是j的可行性,和之前提到的题目一样转移,中途用可持久化线段树维护历史版本,还要对后缀维护一个同样的东西。然后枚举其中一个最高点(并且是两个最高点中高的那个,便于统计),对两边线段树上小于最高点的值的位置求和(注意这里有细节,不是所有的可行点都可以计入答案,要去掉小于两边最小值中较大的那个的所有位置)。复杂度1个log。

1651E

一张每个点度数均不超过2的二分图就是一堆环+路径,考虑从所有点中除去不会成为匹配中的点,那么最终结果就是剩下的点数目/2。环和偶数长度路径显然不需要删点,奇数长度路径需要删去一个点。对于每个可能的奇数路径统计出现次数,一个奇数路径存在当且仅当路径上的每个点都在区间中,而路径两边的点不在。

1651F

考虑一次怪物从前往后走的过程,假设在某个位置怪物死亡,那么塔的序列将变成:
这个位置之前:怪物路过时清零,只有新增的部分
这个位置:减去怪物死亡前的血量
这个位置之后的部分:不影响
如果在每次操作的位置放一个隔板,那么显然两个隔板之间的区间和可以O(1)求出(二维前缀和),如果一次操作怪兽路径覆盖某个隔板,那么这个隔板就不再有意义,可以删去。对于后面未访问过的部分,直接暴力推就行,每个点只会作为“没被访问过的点”访问一次。

1671E

有一个非常有用的启发:
对于一个可逆的操作,一个状态能达到的极大状态集合与集合内其他状态相同(证明显然),对于不同构的两个状态,前面定义的这个集合交集为空。
对于树上的一个点(显然代表的实质上是一个区间),如果左右子树同构,那么定义节点i表示区间可以通过swap得到的不同字符串的种类个数为 \(f(x),那么有:f(x)=f(ls) \times f(rs) \times (ls与rs同构)?1:2\)
意思是如果同构,那么方案数就是左右乘积,交换无异议;否则交换有意义,要乘2。

1671F

直接dp合法序列数,令\(dp[i][j][k]\)表示1-i的排列,逆序对个数为j,相邻逆序对个数为k的排列个数,转移枚举i放在1到i-1的排列中的哪个位置。后两维用矩阵乘法维护,再用小Y与奴隶主的经典套路维护答案。

1678E

相当于若干个环,随意赋值,最小化相邻两个数的距离之和。
先考虑只有一个环,发现,对于偶数长度的环,假如有3个连续的位置满足单调,总能够从通过交换而构造出一个更优的,且这三个位置不单调的方案,所以最终结果一定是类似于山峰-山谷型的,山峰对答案贡献+2,山谷贡献-2,显然把大的数全部放在山峰,小的数放在山谷最优。奇数长度的环,考虑1所在的位置,它的前一个数一定大于它,而它前面的前面的数又一定大于它前面的数(环长是奇数),一定有一个数对答案的贡献是0,其他数和偶数长度环同理。
对于多个环,贪心的把大数放在山峰,小数放在山谷即可。

1678F

每次冒泡相当于序列非0数字-1,左移一位并在最右端添0,可以得知k次冒泡之后的结果是右边若干个0,左边的每个数分别对应最初序列中的某个数。可以直接简单组合算出最初v序列的可能数量,然后可以发现v和原排列是一一对应的。

1670E

考虑到答案不可能小于(1<<(p-1)),而样例给出的答案正好是(1<<2),于是尝试去构造一个答案等于(1<<(p-1))的解。
一个合法的解是在根放(1<<(p-1)),然后相邻点随意放大于等于(1<<(p-1))的数字,在后面再放上这个数-(1<<(p-1)),然后在随便放一个小于(1<<(p-1))的数,再放这个数+(1<<(p-1)),剩下的依次类推。

1670F

转化为前缀。考虑当前这一位能放多少,如果这一位能放的数超过2n,那么后面显然没有限制,可以随意,否则用类似与数位dp的方式处理,令f(i,j)表示当前第i位,能放多少的方案数。复杂度 \(O(n^{2}\log |r|)\)

1712E

题意是让你求满足 \(lcm(i,j,k)\geq i+j+k\) 的三元组个数。
我们通常都有一个直观感觉,lcm应该是各数之积级别的,换句话说, 不满足 \(lcm(i,j,k)\geq i+j+k\) 的三元组个数应该不太多,考虑用总的个数减去不合法的个数。
\(lcm(i,j,k)< i+j+k\) ,因为k是三元组中最大的数,所以 \(lcm(i,j,k)< i+j+k< k+k+k< 3k\)。又由于lcm一定是k的倍数,所以lcm的值只可能是k或者2*k。
1.lcm=k
i,j只要是k的约数即可,对于一组询问,答案为

\[\sum_{i=l}^{r}\binom{i在[l,r]中的约数}{2} \]

初始给每个位置赋初值为约数个数,对询问按照左端点排序,枚举左端点,每枚举一个就把当前枚举值的倍数的约数个数-1,那么询问 \([l,r]\) 就是区间的 \(\binom{a_{i}}{2}\)的和,线段树即可。
这部分 \(O(w\log w)\),其中w是值域=200000。

2.lcm=2k
设k的唯一分解中2的幂次是x,那么lcm=2k相当于要求i和j其中有一个的唯一分解中2的幂次是x+1。
枚举2k的所有约数作为i,如果2k中唯一分解中2的幂次是x+1,那么j只要满足在i和k之间且是2k约数即可。否则j的唯一分解中2的幂次必须是x+1。对于这两种情况都不难统计固定k之后,对于每一个合法的i,有多少个j符合我们设置的条件。这里要枚举1-2w的所有数的约数并存下来,还要对每个数的约数求出作为i的贡献并存下来,时空均是1个log的。
在之前的讨论中没有考虑l的限制,加入l的限制的话,用前缀和差分即可。
和前一种情况类似,对询问按照左端点排序,枚举左端点,每枚举一个左端点t就对t的倍数去掉t作为i对答案的贡献。这里具体实现可以把所有数放进优先队列(关键字为大于t的最小因数),t增加时查询当前堆顶是否有关键字等于t的元素,把t的贡献去除,再把关键字改为下一个约数后放回。快速查询下一个约数可以用链表。

总复杂度 \(O(w\log^{2} w)\)

1712F

我的做法:
原题等价于建一个虚点向所有叶子连边,边权为 \(\frac{w}{2}\)。求直径。
在加上这些边之后,两点的最短距离只有两种可能,即原树上的简单路径或者在两点的子树中找深度最小的叶子,先到达叶子,然后走新加的边到另一个叶子,再到终点。
考虑点分,先处理过重心的所有路径。
直径可以写成这个样子:

\[ \max_{i,j}(\min(dep(i)+dep(j),dep(i子树内深度最小的叶子)+dep(j子树内深度最小的叶子)-(dep(i)+dep(j))+w)) \]

如果类似于树链剖分一样,选择拥有最浅的叶子的儿子为重儿子,树将被剖成若干条链,其中对于同一条链上所有节点,“子树内深度最小的叶子”相同。那么,对于两个点,如果他们所属的链已经确定, \(\min(dep(i)+dep(j),dep(i子树内深度最小的叶子)+dep(j子树内深度最小的叶子)-(dep(i)+dep(j))+w)\) 就只与 \(dep(i)+dep(j)\) 有关。而且前者随之递增,后者随之递减。而 \(dep(i)+dep(j)\) 的取值范围是 \([dep(i所属链链顶)+dep(j所属链链顶),dep(i所属链链底)+dep(j所属链链底)]\) 如果取不到折点(即 \(\frac{dep(i子树内深度最小的叶子)+dep(j子树内深度最小的叶子)+w}{2}\)),答案就是 \(dep(i所属链链顶)+dep(j所属链链顶)\) ,否则是\(\frac{dep(i所属链链底)+dep(j所属链链底)+w}{2}\)。判断条件是

\[dep(i所属链链顶)+dep(j所属链链顶)\leq \frac{dep(i所属链链底)+dep(j所属链链底)+w}{2} \]

这等价于

\[(dep(i所属链链顶)-\frac{dep(i所属链链底)}{2})+(dep(j所属链链顶)-\frac{dep(j所属链链底)}{2})\leq \frac{w}{2} \]

把所有剖后的链按照 \(dep(链顶)-\frac{dep(链底)}{2}\) 排序(注意到这里值域是 \(O(n)\) 级别,可以用桶排),那么对于每一条链,一个前缀与它的贡献就是\(dep(i所属链链顶)+dep(j所属链链顶)\),转化为查找前缀最小值。剩下的和它产生的贡献是 \(\frac{dep(i子树内深度最小的叶子)+dep(j子树内深度最小的叶子)+w}{2}\) ,与前者类似转化为查找后缀最小值。由于不同询问的树形态不变,所以可以先点分,树剖处理完之后枚举每条链的时候,再枚举每个询问的不同的w,对每个询问求出当前链的贡献。
复杂度:点分之后树剖,每条链按照特征值排序之后维护前后缀最小值,再枚举每条链,枚举每个询问,求出链对答案的贡献,复杂度 \(O(nq\log n+nlog^2)\)

CF官方做法:
维护一个数组val(i,j)表示i子树内距离最近叶子距离为j的所有点中深度的最大值。
维护当前的ans值。(这个ans不清楚可以看官方题解,我觉得这个ans的维护方式还是挺妙的。)
val(i)随着j的增加递减:对于一个点x,若其被记入val(?,j),那么一定存在一个儿子k,depth(k)=depth(x)+1,k距离最近叶子距离为j-1。
合并子树时枚举两颗子树的第二维,如果能更新答案则更新答案,否则直接break即可。此时的根节点用同样的方法维护即可。
复杂度的证明等同于长链剖分。
同时枚举两维的部分复杂度正确是因为内层循环不超过n次(每次ans+1,ans不超过n)。

1715E

普通边用dij转移,特殊边的转移经观察发现是斜率优化。

1715F

CF的图一看就懂,很妙的构造。

1717E

枚举c,再枚举gcd(a,b)=gcd(a,n-c-a)。剩下的部分只跟欧拉函数有关,线性筛即可。

1717F

用网络流模拟分配,一次分配相当于先两边都-1,然后选一边+2。网络流模拟+2过程,图建成后发现想要的是两边均满流,对无限制的所有点建一个虚点,向汇连m-总需求的边,这样最大流就可以保证两边均满流。

1721E

暴力跳next会T,所以对每个位置维护一个快速转移数组(类似于回文自动机那个不基于势能的构造算法)

1721F

二分图最大匹配=最小覆盖,每次删去最小覆盖中的一个点。注意此时最小覆盖一定-1,证明的两个不等号分别用定义和反证法完成。由于最小覆盖的点集和最大匹配的边集大小相同,而且每条最大匹配边必然与某个最小覆盖点集中的点相连(最小覆盖定义),且同一个点只会被连一次(最大匹配定义),所以点和边形成双射。在删去点时同时删去边即可。

1720D2

虽然不等号两边同时异或之后不等号不一定成立,但是可以强行异或之后观察结果,可以发现形如a>bc的形式,其中a和c只与当前位置有关,b是之前的每个位置的本质属性。用01trie维护bc,考虑a和bc最高的不同位,根据两边同时异或的那个数在当前位的值和当前位两边数的差异可以得出另一侧子树中所有满足b某一位为0/1的值符合题意,每次向trie里面插入$a_{i}$\(b_{i}\),再用全局异或维护b^c,查询最大值则是把\(a_{i+1}\)放在trie上跑,每走一步就判断另一棵子树是否满足题意,是则取出子树中\(b_{i}\)当前位为指定值的最大值,这里需要维护子树内\(b_{i}\)为指定值的最大值,在插入时维护即可。复杂度 \(O(nlogn)\)

1720E

先对一个正方形前缀染,然后再对这个前缀的正方形后缀染。正方形后缀的边长增加1,答案的减少值不超过2,而你又可以操控染的颜色,即答案+1或不变,于是值域内所有的值都可以取到。

1726E

考虑环长只有124三种情况。枚举4的个数,1和2可以直接递推。

1726G

0.每个数操作后只会增加,每个数的操作都有一个类似于窗口期的东西。
1.最终值是最小的a操作一次的值。
2.当同时有多个值可以操作时,最先操作大的数,相同的数则优先操作类型为1的数,这样可以保证这个数的操作不会影响其他可以操作的数的可操作性。
用一个数据结构维护每个数的可操作性即可。

1728E

先考虑在确定红辣椒和黑辣椒个数的时候怎么做,假设全部选红,把所有菜按照\(b_i-a_i\)排序。那么最后的结果一定是一段前缀选了黑,其余选红,换句话说,最大收益关于红辣椒个数是凸的。
求出凸点,那么对于每一组询问,都可以快速求出在凸点左边和右边最靠近凸点的解。询问是O(1)的。

1728F

提出一个结论,即局部最优为全局最优。
证明考虑如果有一个位置没有使用局部最优,那么把当前的局部最优插入当前使用的元素之前,当前元素答案不变,而其他元素的答案不增。
但是可能有多种a_{i}满足全局最优,所以考虑每一次决策都有若干个元素可以选,每次只能且必须选一个,每一个只能选一次,这可以用最大匹配解决,每加入一个点就按照匹配代价从小到大加入边。
cf的题解则是说,观察b数组可得b数组有如下性质:各元素互异,b被a整除。而这个必要条件正好也是充分条件,因为按照b排序后的下标分配a就可以得到一个合法的方案。所以相当于给a和它的倍数找匹配,每个数只能被用一次,二分图带权匹配解决。然后发现把左右交换之后直接跑匈牙利也是对的,但是匈牙利是O(左部点E+右部点)的,在这道题中是4次方的,无法通过。然后在匈牙利中有一个优化:如果没找到增广路就不对vis数组memset为0,这样复杂度变为最大匹配(点数+边数),最大匹配小于等于min(左部点,右部点)。在这道题中是 \(O(n^3)\) 的,可以通过。

1728G

考虑如果对于某个特殊点集合一定不满足,其余无所谓的分配的方案数。
预处理两个特殊点如果不满足,中间的灯的方案数,这样可以在 \(O(m^{2}n+2^{m}m)\)完成。
发现这个东西本质上是一个类似于高维后缀和的东西,而最后的询问是枚举最左和最右的未照亮点,询问一个类似于某集合子集的东西,这个的本质是个高维前缀和,所以要先高维后缀和转原数组,然后原数组再求高维后缀和。

1730E

考虑r从小到大变化,对于不同的l的区间最大值的变化,发现可以用单调栈维护,贡献也可以在单调栈上算,复杂度O(nD+nlogn)。
cf官方题解的做法则是枚举最大值和最小值,求合法的区间。

1730F

令dp(i,S)表示当前最小的未放置的数是i,i-i+k的放置状态是S,的最小逆序对数。当最小的未放置数是i时,大于i+k一定未放置,小于i的一定已放置,暴力记录状态后逆序对不难算。
很妙的是这个dp不是显式地在p上dp,而是用了"当前最小的未放置的数是i"这一状态定义,同时解决了状态转移无环和逆序对的计算。

1733D2

只考虑x<=y。
几个显然且有用的性质:
代价随着长度单调不降
一个点只能被匹配两次,同一个点作为r只能被匹配一次
这样n^2dp就出来了:令(i,j)表示,前i个位置,还有j个1未匹配的方案数,还要再开一个01维表示当前位是0/1,转移枚举i和之前的谁一起操作一次即可(如果需要操作的话)。
线性dp则是考虑到,每次操作都会操作在1上,不存在交叉的匹配,也不存在不相邻的两个数用若干次x匹配,那么令f(i)表示前i个数的匹配的最小代价考虑第i个数的匹配,可能和之前的用y匹配,也可能和相邻的用若干次x匹配。
还是蛮妙的,我还推出来一个性质:存在一个方案使得,大于临界值(用x和用y代价相同的区间长度)的区间都是互相嵌套的。

1734F

结论:\(S_{i}\) 为1当且仅当i的二进制有奇数个1。
问题变成了对于x\(\in [0,m-1]\),有多少个x满足x+n和x的二进制中1的个数和为奇数。
数位dp即可。复杂度\(O(log^{2}n)\)

1735E

考虑p2-p1只有2n种可能。枚举这2n中可能,对于大于枚举值的d,它一定和一个d-枚举值的d匹配,匹配完之后剩下的都是在两点之间,互相匹配即可。

1735F

把(p,q)看成点,放在二维平面上,初始是(0,0)和(p,q)形成的矩形。每次操作相当于沿着\((p_{i},-q_{i})\)向量平移,可以发现图形始终是凸包。暴力平移是O(n^{2})的,但是考虑平移不影响相对关系,那么维护边的长度和角度即可。每次就是插入一条边,维护和两个坐标轴的交点,然后再切掉不在第一象限的部分。

1739F

存在一个keyboard能构造出某个串意味着按照相邻字符连边之后,图的形态是一条链加若干个孤立点。这又等价于链表示的字符串或者它的reverse在keyboard中出现过。
然后两个结论:串和反串在同一个keyboard中的出现次数之和不超过1,所以可以把权值赋到字符串上,一个keyboard的权值等于包含的关键子串权值之和。状压使用过的字符集之后在AC自动机上跑DP即可。

1762E

想了半天才反应过来d(1,n)其实只有代表意义,相当于求两两路径权值之和,等价于对每条边,求它对答案的贡献次数之和和自身权值之积的总和。
把一棵树中所有点的题目限制中的等式乘起来发现,枚举边的权值=-1的两边siz次方,算贡献次数就是两边siz的乘积乘上两个有标号有根树的数量,记得乘一个组合数分配标号。

1762F

先考虑没有绝对值怎么做,对于每个数x找到后面第一个比自己大的数y,这个数的答案就是y的答案加上后缀中值域在[x,y-1]内的数。
现在有绝对值,考虑到虽然路径可以上下起伏,但是一定存在一条路径是单调的,只考虑没有绝对值的答案正反做两遍即可。

1767E

翻转题目,先把所有颜色选上,考虑最大化能放弃的颜色的权值。
题目要求等价于,对于相邻的元素,若不同色,则在这两个颜色之间连边,若同色,则这种颜色必须选择。最后在颜色构成的图上求一个最大权独立集。
把点分成两部,内部分别求最大权独立集,枚举左部点的集合,合法的右部点集合是一个集合的子集,fwt维护高维前缀max即可。

1763F

翻转题目,先把所有颜色选上,考虑最大化能放弃的颜色的权值。
题目要求等价于,对于相邻的元素,若不同色,则在这两个颜色之间连边,若同色,则这种颜色必须选择。最后在颜色构成的图上求一个最大权独立集。
把点分成两部,内部分别求最大权独立集,枚举左部点的集合,合法的右部点集合是一个集合的子集,fwt维护高维前缀max即可。

posted @ 2022-03-15 00:56  永无岛  阅读(69)  评论(1编辑  收藏  举报