C
太难了!!!!!!!
首先你可以观察到,我们要按层贪心选择,因为 \(i+j+k\) 相等的点之间肯定没有边。
考虑一个点啥时候能被选。当且仅当,他连到的高层点全都没有被选。
于是,你给边定向,形成一个 dag,那么我们发现,如果把这个 dag 看成博弈图,规定没法走的人输,选的点则为必败态,不选的点就是必胜态。
然后你惊奇地发现,每次是走三个独立游戏中的任何一个。于是这是一个 Nim 和的形式,分别求出三个游戏的 Nim 值后寻找 \(a_i\oplus b_j\oplus c_k=0\) 的 \((i,j,k)\) 对数即可,由于本质不同 SG 函数值个数是 \(\mathrm O(\sqrt m)\) 的,暴力枚举即可线性。
D
比 C 简单多了。
你考虑到,如果一个序列中 \(a_i>a_{i+1}\),那么选了 \(i\) 后立马会选 \(i+1\),将它们合并,然后剩下的元素只是在做归并。
于是容易得出充要条件,我们找出每一个极长单调减子串,只要长度为 1 的个数大于等于长度为 2 的个数,就一定合法。对着这个随便 dp 就好了。
E
对于这个环,从一个点上方经过记作 \(U_i\),从一个点下方经过记作 \(D_i\),任何一个环可以唯一对应到一个 UD 序列。
一个点集 \(S\) 可以把圆环挂住的充要条件可以用这个表示法轻易刻画出来:只保留 \(U_{i\in S},D_{i\in S}\),如果能够通过若干次删掉相邻相同元素的操作将序列删空,则圆环可以掉下去,否则不能。证明是容易的。
我们只要能对所有 \(S\),满足任意 \(T\subset S\) 可以掉下去且 \(S\) 掉不下去,做出构造,那么把这些环连在一起就是答案。
考虑如下递归构造:
- \(S_1=U_1D_1\);
- \(S_{i+1}=U_{i+1}S_iU_{i+1}D_{i+1}\operatorname{rev}(S_i)D_{i+1}\)。
正确性显然。分讨一下 \(i+1\) 在不在集合内即可。代码很难写。
