Atcoder Regular Contest 120 比赛记录 (vp)
题解
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,那答案就是 \(\sum\limits_{x\in B} x-\sum\limits_{x\in 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。