Codeforces Round #715 (Div. 1)

A

存在两个串,\(0\)的个数或者\(1\)的个数均大于\(n\)
\(0\)\(1\)间把另外一个字符插进去。

B

结论:对于\(n\)阶排列,合法的方案数为\(2^{n-1}\)

证明:
对于\(n\)阶排列,假设第一个位置填的是\(x\),那么前缀会是\(x,x-1,\ldots,1\)
\(f_i\)\(i\)阶排列合法方案数,\(f_0=1\),有递推式:
\(f_n=\sum\limits_{i=1}^n f_{n-i}=2^{n-1}\)

C

第五发才过...菜死了,我的做法相对较复杂,谨慎观看。

\(w=\bigoplus\limits_{(u,v)\in E}w_{u,v}\)

结论:存在最优解,需要填的边,除一条边权为\(w\)外,其他均为\(0\)

证明:
若有两条边权不为\(0\),将其中一条改变这两的异或,\(\text{MST}\)不会增大。

先搜出补图连通性:\(\text{cf920e}\)

将补图连通的点先缩起来,用给出的边跑一个\(\text{MST}\),用到的边权是必须用到的。

如果存在补图的某个连通块,边数\(\ge\)点数,那么在树的基础上将\(w\)放在另一条边,那么\(\text{MST}\)就为之前得到的。

那么现在要考虑补图的某条边边权为\(w\),对\(\text{MST}\)的影响。
对于原图但不在\(\text{MST}\)的边,考虑其是否可能加入\(\text{MST}\),将其与\(w\)\(\min\),在加上原\(\text{MST}\),就为真正的\(\text{MST}\)

  • 如果其两端在补图中连通性相同,可以。
  • 如果其两端在补图中连通性不同,其在\(\text{MST}\)中的路径如果存在补图的边,可以。

感觉讲得及其不清楚,就放下代码吧...

D

定义:点\(i\)简写为\(i\),标签\(i\)简写为\(\hat{i}\)

观察1:对于\(a_i=i\)的点,若存在解,则一定存在没有操作过\(i\)的解。

证明:
\(\hat{i}\)离开\(i\),之后必定还要回到\(i\),找到第一次离开\(i\)的操作与第一次回到\(i\)的操作,容易观察将这两次操作删除,不会对结果产生影响。

于是我们可以忽略所有\(a_i=i\)的所有点。

考虑如果一开始就是单轮换,该怎么做?

枚举任何一个点,作为中心,其他点与其连边。
这形成了一个菊花图,考虑中心的标签,将中心与上面标签数字的点交换,依次操作所有边后,显然合法。

但如果开始不是单轮换呢?
观察2:对于两个轮换,交换这两个轮换中任意两点的标签,会合并成一个轮换。

我们的大概思路是:将所有轮换合并成一个轮换,再将单轮换调整好。

我们依然枚举任意一个点,作为中心,对其他点极角排序,考虑相邻的两个点这种连边,即外围的蓝色边。
利用蓝色边,将多个轮换合并成一个轮换,这很容易实现。

但还有另外一种情况

如果选择的中心点在凸包上,是可能蓝色边与黄色边有交的。
考虑所有的点都在凸包上的情况。(否则选择不在凸包上的点,所有蓝色边有效)
但这样的蓝色边至多有一条,考虑是否可以忽略这条蓝边,以达到目的。
这相当于,对于一个凸包上的边,忽略两条相邻的边,是否可以通过其他边以达到目的,由于一个轮换至少有两个点,这是可行的。

综上,我们在\(O(n\log n)\)(极角排序),在最多\(1.5n\)次操作内解决了此问题。

E

定义:令点\(i\)上的标签为\(a_i\)

总共\(n\)个过程,第\(i\)个过程为将\(i\)向下推。
在前\(i\)个过程结束后,将当前点的值\(\le i\)的看作绿色节点,其他的看作红色节点。

结论1:当前处在第\(\max(1,a_1-1)\)个过程。

结论2:在前\(i\)个过程结束后,红色节点值的相对顺序跟原来的相对顺序相同。

容易证明

推论:在任何时候,任意节点的子节点的值相对顺序不变。

结论3:在前\(i\)个过程结束后,经过的天数为现在点值为\(1\sim i\)的高度之和。

假设目前处在某一个过程恰好结束的时候,根据推论,容易求出所有绿点与红点的\(a_i\)
假设目前处在过程\(dem=\max(i,a_1-1)\),将\(a_i=dem\)的点移到根,以还原到前\(dem-1\)个过程恰好结束的时候。

考虑原来\(a_i=dem\)这个位置是否合法呢,找到最终\(a_j=dem\)的位置,判断\(j\)是否在\(i\)子树内即可。

感觉讲得非常不清楚...可以看下代码

F

题意:
给出一个\(n\)阶排列\(A\),及\(q\)个区间\([l_i,r_i]\)
定义排列\(B\)\(A\)\([l,r]\)相似,当且仅当在区间\([l,r]\)中,\(A\)\(B\)的相对顺序相同。
定义排列\(B\)\(\text{k}\)相似的,当且仅当对于\(1\le i\le k\)\(B\)\(A\)\([l_i,r_i]\)均相似。
对于一个\(\text{DAG}\)\(G\),定义\(G\)\(\text{k}\)相似的,当且仅当其拓扑序与\(\text{k}\)相似的排列一一对应。
输出\(q\)行,第\(k\)行输出\(\text{k}\)相似的图\(G\)的最小边数。
\(n\le 25000,q\le 100000\)
时限:\(7s\)

首先不考虑具体复杂度,可以构造出一个多项式复杂度算法:

对于目前的所有区间\([l_i,r_i]\),对于每个区间\(l,r\),令其长度为\(len=r-l+1\),保留\(len-1\)条边(相对顺序相邻的点之间连边)。
然后对于有向边\((u,v)\),若删掉\((u,v)\)后,\(u\)仍可以到达\(v\)则删除。

对于每个点,假设包含其的区间左端点最小为\(ld\),包含其的区间右端点最大为\(rd\)

与其相关的边至多有四条:
\([ld,i)\)中比其大的最小位置,比其小的最大位置
\((i,rd]\)中比其大的最小位置,比其小的最大位置
对于点对\((i,j)(i< j)\),若其同时在\(i,j\)中都为相关的边,则保留,否则不保留。

正确性显然。

由于\(ld_i,rd_i\)增长的总次数为\(O(n^2)\),故总复杂度\(O(n^2+q)\)

posted @ 2021-04-17 13:52  Grice  阅读(122)  评论(0编辑  收藏  举报