正解:构造
解题报告:
这种题目一般都是首先考虑合法性
这题也不例外,思考怎么样是合法的呢?
有四点:
1)a[1]=a[2n-1],显然不说
2)若a[i]=a[j],则(j-i)&1==0,即ij同奇偶性,dfs序的性质
3)若a[x]=a[y],a[m]=a[n],则(x-m)*(y-n)>0,这个可以用st表做(后面会详细解释下st表的,,,然后有时间会开个倍增专题港下st表什么的QwQ
4)a[i]≠a[i-1]
然后判完可行性就考虑构造鸭
考虑如果存在a[x]=a[y],就说明[x,y]这一段是棵子树,于是用一点儿分治思想,先做[x,y],这样就解决了一个子问题,就可以删去[x+1,y],看到这种删除操作就应该能想到并查集维护一波,over
然后这么操作完之后就不会剩下相等的非0数了
然后接着考虑,如果有xy0或0yx的排列,就直接把0=x,然后把xy丢了(就还会剩一个x
如果有xyz这样的序列,就说明不可能了搞不出来辣
然后如果上面这个操作也搞完之后,如果数据是可构造的,就会变成,这样子:X0...0A10...0A20...X
然后就递归着做就好辣
设当前树根为rt,搞个双端队列,把当前的数据放进去,每次看队头队尾两元素(h&t
如果h=t=0,找到一个麻油出现过的值x,令h=t=rt=x,弹去h&t
如果h*t=0,h2+t2!=0,不妨设h=0,t!=0,令rt=h=t,弹去h&t,
如果h!=0,t!=0,不妨选h,令h旁边的点(必为0)=rt,弹去h&rt
就这样,,,具体看代码趴QAQ
代码咕了,,,中午也许会放趴QAQ