炒鸡水但是卡我空间……
居然没有一遍过,不爽……
下次这种题应该写树状数组套线段树而非线段树套线段树……
跟「『TJOI2017』不勤劳的图书管理员」一个套路,交换 al,ar 的时候更新 [l,r] 的贡献即可。
具体地说,首先去除 (x,r)(x∈[l,r),ax>ar) 的个数和 (l,x)(x∈(l,r],al>ax) 的个数。
在维护的数据结构中去除 al,ar 的贡献。
然后交换 al,ar。
计算新的贡献,即加上 (x,r)(x∈[l,r),ax>ar) 的个数和 (l,x)(x∈(l,r],al>ax) 的个数(注意此处已交换)。
以及要考虑一下 l,r 本身为逆序对的情况,这样可能被算两次。
现在我们需要维护一个数据结构,资瓷区间查询属于某值域的数的个数。
如果是静态的话,主席树即可解决。
动态的话,其实就是一个三维偏序问题,用任何一种树套树即可解决。
注意判掉一些情况,比如 l=r,l>r……
代码:
1 |
|