难得遇上一把 CF ,结果 unr 了。
A Mainak and Array
显然最优策略只有三种:选一个 \(i\in [1,n-1]\) 的 \(a_i\) 作为 \(a_1\) ;选一个 \(i\in [2,n]\) 的 \(a_i\) 作为 \(a_n\) ;shuffle 整个序列若干次。
B Mainak and Interesting Sequence
构造题,讨论以下几种情况:
- 若 \(n>m\) ,无解;
- 否则,若 \(n\) 为奇数,放 \(n-1\) 个 \(1\) 与 \(1\) 个 \(m-n+1\) ;
- 若 \(n\) 为偶数,\(m\) 为偶数,放 \(n-2\) 个 \(1\) 与 \(1\) 个 \(\frac{m-n+2}{2}\) 。
- 若 \(n\) 为偶数,\(m\) 为奇数,无解。
C Jatayu's Balanced Bracket Sequence
每个左括号都只与它后面能匹配的第一个右括号连边,并且当它成功匹配时,如果它上一个字符是右括号,则还要将它们之间连上边,这样任意一对可以匹配的括号都可以传递出来。连边的过程中用并查集维护连通块数目即可。
D Edge Split
把所有红边做成一棵生成树一定是最优方案之一:如果只用红边时整张图还没有连通,就可以把一条蓝边换成红边,使得红边连通块减 1,而蓝边连通块最多加 1;如果红边在生成树之外还有其他边,将非树边换成蓝边,红边连通块不变,蓝边连通块不会增加。
于是我们可以先随便做一棵生成树出来,将树边作为红边,非树边作为蓝边。此时红边连通块数目一定是 1,而非树边的数目最多为 3,故蓝边连通块在蓝边不形成三元环时,数目最少。
如果 3 条蓝边形成了三元环 \(u-v ,v-w,u-w\) ,且在生成树上 \(w\) 是 \(v\) 的祖先,\(v\) 是 \(u\) 的祖先,那么我们可以进行调整,将 \(v-fa(v)\) 这条边换成蓝边,将 \(v-w\) 这条边换成红边,此时红边仍然形成生成树,而蓝边就不会出现三元环了。
E Almost Perfect
考虑满足条件的排列 \(p\) 的置换环结构:环的大小只可能是 1,2,4。其中大小为 4 的环一定是由两对相邻的数构成的。我们枚举有 \(k\) 个大小为 4 的环,则答案为
\[\sum_{4k\le n}\binom{n-2k}{2k}\frac{(2k)!}{k!}f(n-4k) \]其中 \(f(k)\) 是把 \(k\) 个点分成若干个一元环和二元环的方案数,考虑最后一个点是否被分到某个二元环中,可以得出递推式 \(f(k)=f(k-1)+(k-1)f(k-2)\) ,边界为 \(f(0)=f(1)=1\) 。
F Late for Work
首先可以把每个 \(\sum_{i=1}^{k-1}d_i\) 加到 \(c_k\) 上,并且让最后的答案加上 \(\sum d_i\) ,就可以不再考虑 \(d_i\) 的影响。利用改变后的 \(c_i\) 可以计算出每个红绿灯的绿灯时间区间。
显然只用考虑所有作为区间端点的时间点,从前往后依次考虑每个红绿灯,每次新增一个红灯区间时,会导致之前的某些时间点变得不可用,需要等到新的绿灯区间端点才能继续走。
于是可以用 multiset 维护当前所有还没有被红灯区间 block 住的所有时间点,新增一个红灯区间时,取出被它 block 住的所有时间点,从这些时间点向新增的绿灯区间端点连边,边权为对应的需要等待的时间。最后新建虚拟的起点与终点,从起点向所有一开始没有被 block 住的时间点连边,从最后没有被 block 住的时间点向终点连边,跑一个从起点到终点的最段路即可。
标签:连边,连通,红灯区,蓝边,Codeforces,括号,814,Round,block From: https://www.cnblogs.com/jklover/p/16719876.html