题目传送门
解题思路
用可以提取区间的平衡树,对区间整体打标记,先不下放,等到操作涉及这个节点时再下放:交换左右儿子并给左右儿子打标记
我用的是无旋treap
刚开始需要建树,建树模仿笛卡尔树,由于所有元素出栈之后自身的儿子不会再有变化,因此出栈的时候再push_up即可,由于栈维护右链,栈顶就是root
要看Splay版本的也可以去这里看>>>Splay版本文艺平衡树(在博客比较靠下的位置)
代码
/*
1.因为维护正确顺序,因此中序遍历需要得到原数组,所以插入的时候下标越小数越小
2.之后就是选取区间操作,已经在树中就没有大小之分,只有顺序,此时只能按照个数分裂
3.pushup操作在build函数中:出栈元素,构建完之后的栈内元素
4.下放标记有点拎不清,标记了就可以,等到需要下放再交换,注意本质的东西,当前信息对的情况下能懒则懒,不需要交换子节点就等到需要下放的时候再交换
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define for1(i,a,b) for (int i=a;i<=b;i++)
#define for0(i,a,b) for (int