Codeforces Round #692 Div1

A

首先忽略初始在对角线上的点
答案的下界显然为现在的点数

考虑对于对角线((i,i)),在第(i)行出现的与在第(i)列出现的点连边
容易得到答案的下界为:点数+环的个数

容易证明

B

结论:最后填数一定是某个前缀填(0),剩下的填(1),或前缀填(1),剩下的填(0)

证明:
考虑两个位置(0,1),交换后发现01与10的数量不变

C

结论:当(nge 2)(n-1)最后的符号一定是(-)(n)最后的符号一定是(+),其他位置符号任意

证明:
对于----+???-+这种情况,显然左边的-是可以全部实现的
于是我们考虑+????-+是否能被构造出来
我们找到最靠右的一个-,使得前面为+(-可以是(n-1)
考虑+????+---+,看成两段(+????+-)(--+)
由于左边要取反使得上我们要构造(取反)(不取反)这两段
发现这两段最后两个元素均为-+,通过归纳可以证明结论

然后题目转化成了给一些二的次幂前填+/-的系数,问能否凑出(N)
可以考虑从大到小考虑二的次幂,让(N)的绝对值最小

正确性:
(|x|le |y|),如果(y)可行,可以通过调整法证明(x)也可行

D

第一问是个经典小学奥数题:

  • (n=1)(1)
  • (n\%3=0)(3,3,3,cdots,3)
  • (n\%3=1)(3,3,3,cdots,3,2,2)(3,3,3,cdots,3,4)
  • (n\%3=2)(3,3,3,cdots,2)

以下讨论(nge 2)

下面考虑最小操作数
为了方便,我们先将环全部拆开,再全部合并,这样不影响操作

观察:大于(4)的环我们会反复将其分离出一个(3)的环,直到其长度(le 4)

特殊情况,(n=4)时可能拆(3),容易证明其他情况的(3)环我们都不会动

那么现在我们有(1)环、(2)环、(4)

我们分类讨论哪些拼成非(3)环的那部分,其他的都拼成(3)

下面将一下代码怎么写比较简单
容易发现在非(3)环拼完后,这时(4)环我们均会拆成(1,3)
那么我们仅需讨论(1,2)环怎么拼成若干(3)环,我们单独写一个函数query(c1,c2)来解决此问题

具体可以看下代码

E

(c_i)为sg值等于(i)的点个数,用异或卷积定义乘法
显然答案为:

[frac{1}{n+1}sumlimits_{i=0}^{infty} frac{c^k}{(n+1)^k}=frac{1}{n+1}cdot frac{1}{1-c/(n+1)} ]

可通过fwt实现

F

定义:对于路径(u,v),令(key(u,v)=lca(u,v))。对于路径集合(P),令(key(P))(key(u,v))深度最大的点。
定义:令(up(u,d))(u)往根跳(d)步的点,若不存在令(up(u,d))为根

结论1:对于集合(P),若(d)邻域有交集,则包含(up(key(P),d))

证明:
(x=up(key(P),d))
首先(key(P))(x)子树内的路径显然(d)邻域包含(x)
(key(P))不在(x)子树内的路径(d)邻域不包含(x),则显然整条路径均不在(x)子树内,容易证明必定无交

(key(P))容易维护
(x=up(key(P),d))
于是我们将问题转化为:

询问一个点(x)是否存在于每条路径的(d)邻域

(K=up(x,d))

结论2:对于集合(P),若(d)邻域包含(x),必要条件是每条路径至少存在一个端点在(K)子树内

证明显然

具体来讲,结论2是在处理(key(u,v))不在(K)子树的路径是否均合法(路径经过(K)
现在是要讨论(key(u,v))(K)子树内的路径集合是否合法

结论3:对于(key(u,v))(K)子树内的路径,该路径(d)邻域包含(x)的充要条件为(key(u,v))(K)的距离(le d)

证明:
对于(key(u,v))(x-K)路径上的情况,显然(d)邻域包含(x)
其他情况,路径(u,v)距离(x)的最短路径等于(key(u,v))(x)的距离

我们将问题转化为:

(K)子树中的有效点是否离(x)距离均(le d)

这是一个经典问题,可以用线段树维护树的直径
(O(nlogn+qlogn))

原文地址:https://www.cnblogs.com/Grice/p/14170116.html