把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

Codeforces Round #814

难得遇上一把 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 住的时间点向终点连边,跑一个从起点到终点的最段路即可。

posted @ 2022-09-22 16:40  jklover  阅读(77)  评论(0编辑  收藏  举报