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)的点个数,用异或卷积定义乘法
显然答案为:
可通过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))