Codeforces Round #692 Div1
A
首先忽略初始在对角线上的点
答案的下界显然为现在的点数
考虑对于对角线\((i,i)\),在第\(i\)行出现的与在第\(i\)列出现的点连边
容易得到答案的下界为:点数+环的个数
容易证明
B
结论:最后填数一定是某个前缀填\(0\),剩下的填\(1\),或前缀填\(1\),剩下的填\(0\)
证明:
考虑两个位置\(0,1\),交换后发现01与10的数量不变
C
结论:当\(n\ge 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\)
以下讨论\(n\ge 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\)的点个数,用异或卷积定义乘法
显然答案为:
可通过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)\)