题目描述
题解
splay或者块链的话是裸题,不过好像块链只能过六个点。。。
线段树的话这道题有一个非常关键的数据特点题目里没有说,就是它给出的区间一定是线段树里的整块,那这样的话就可以直接用线段树来搞,区间打标记然后交换左右儿子就可以了。其实和splay也差不多。
代码
线段树
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define N 150005
int n,m,x,y;
int a[N],tree[N*4],rev[N*4],ch[N*4][2];
inline void build(int now,int l,int r)
{
int mid=(l+r)>>1;
if (l==r)
{
tree[now]=a[l];
return;
}
ch[now][0]=now<<1,ch[now][1]=now<<1|1;
build(ch[now][0],l,mid);
build(ch[now][1],mid+1,r);
}
inline void pushdown(int now,int l,int r,int mid)
{
if (rev[now])
{
swap(ch[now][0],ch[now][1]);
rev[ch[now][0]]^=1; rev[ch[