A
- 输出1+n个0+n个1
B
- 考虑用两两之间的距离来描述这棵树的边权,可以发现固定一个起点,操作u,vu,vu,v相当于交换dis(x,v),dis(x,u)dis(x,v),dis(x,u)dis(x,v),dis(x,u),然而当操作xxx以及xxx相邻的点的时候并不满足,因此考虑建一个虚点x′x'x′,与xxx相连并能够被修改,但是不能被操作,然后不失一般性也满足之前的结论。由于所有的dis(x′,v)dis(x',v)dis(x′,v)都要xor dis(x,x′)xor\ dis(x,x')xor dis(x,x′),因此可以将所有a,ba,ba,b异或起来得到这条边的边权,然后判断一下b xor dis(x,x′)b\ xor\ dis(x,x')b xor dis(x,x′)是否是aaa的排列即可。
C
- 先考虑怎么判断一个排列是否是好的。首先和不能是PPP的倍数,然后如果出现次数最多的数次数不超过n/2n/2n/2那么一定可以。证明可以考虑每一次选次数最多的,如果加上之后是PPP的倍数那么就换次数次多的。
- 但这并不是必要条件,如果超过n/2n/2n/2,方便起见将它设为1,可以通过乘逆元得到。那么当cnt1≤∑(P−ai)+(P−1)cnt1\le\sum(P-a_i)+(P-1)cnt1≤∑(P−ai)+(P−1)时可以将多出来的1减到一半,反之1一定会多出来,这就是充要条件了。
- 考虑直接DP。注意到我们还要要求∑ai\sum a_i∑ai不是PPP的倍数,但是DpDpDp状态里不能记下∑ai%P\sum a_i\%P∑ai%P和∑(P−ai)\sum(P-a_i)∑(P−ai),因此考虑计算不合法的方案,那么∑ai<n\sum a_i<n∑ai<n就可以直接记下并DPDPDP了。
D
- 如果LIS为偶数的话,记f(i)f(i)f(i)表示以iii为结尾的LIS长度然后把所有f(i)≤LIS/2f(i)\le LIS/2f(i)≤LIS/2的放在一组即可。
- 反之考虑在上述方法中进行一点调整,设2K+1=LIS2K+1=LIS2K+1=LIS,如果在某个LIS的集合以外还有一个xxx的所在LIS长度>=K+1>=K+1>=K+1,那么可以把xxx所在LIS的所有f(i)f(i)f(i)归为一组,除了f(i)=f(x),x≠if(i)=f(x),x\neq if(i)=f(x),x=i。这样显然两个集合都恰好是K+1K+1K+1。