题解
A,B 略
C: 这个操作相当于把 ((a,b)) 变成 ((b+1,a-1))
观察 (a'_i=a_i+i) 这个东西。设我们操作的是 (a_i,a_{i+1}),然后操作完会变成 (a_{i+1}+1,a_i-1)
(a'_{i}=(a_{i+1}+1)+i=a_{i+1}+(i+1))
(a'_{i+1}=a_{i}-1+(i+1)=a_{i}+i)
发现这个东西相当于是交换了 (a') 的两个位置。然后相当于是有两个数组,每次只能交换相邻两个,要把A变成B。这玩意就逆序对做一做就行了。
D: 把前 (n/2) 小的看做A类,前(n/2)大的看做B类。那如果我们的每一对匹配括号都恰好一个是A,一个是B,那答案就是 (sumlimits_{xin B} x-sumlimits_{xin A} x)
然后我们一定能构造。就我们维护一个栈,如果当前元素和栈顶类型不同就匹配,否则就直接入栈。
实况
A,B比较简单,很快就没了
C的话,我们可以玩玩发现 (i+a_i) 这个东西。我其实是瞎jb交换了很多次,然后发现一个数原来是 (a),后来变成了 (a-3),而它正好被换出去三格。然后我就发现了其实是在交换 (i+a_i)。
D那个应该是个经典结论。我感觉这个东西好像很难对,我就没这么猜。我还瞪了好久性质,没瞪出来。还他妈睡着了,也许是因为我在下午4点左右vp的缘故吧。众所周知,那会人的精力低下。
总结
“对相邻做...操作, 把A变成B”,通常我们会把它转换成交换相邻,从A变到B的问题。
D题有一个经典结论就是, 我们有2n个数,其中n个0,n个1。我们一定能找到一种括号匹配使得每对匹配括号都包含了一个1和一个0。