文艺平衡树板子求调
  • 板块灌水区
  • 楼主Targanzqq
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/3/6 21:43
  • 上次更新2024/3/7 12:59:01
查看原帖
文艺平衡树板子求调
555617
Targanzqq楼主2024/3/6 21:43

rt

#include<bits/stdc++.h>
using namespace std;

struct Fhq_Treap{
	int l;
	int r;
	int sz;
	int key;
	int val;
	int lazy;
}tr[114514];

int num=0,root=0,a[114514];

int built_node(int v){
	tr[++num].val=v;
	tr[num].key=rand();
	tr[num].sz=1;
	tr[num].l=0;
	tr[num].r=0;
	tr[num].lazy=0;
	return num;
}

void push_up(int now){
	tr[now].sz=tr[tr[now].l].sz+tr[tr[now].r].sz+1;
}

void swp(int x,int y){
	swap(tr[x].key,tr[y].key);
	swap(tr[x].l,tr[y].l);
	swap(tr[x].r,tr[y].r);
	swap(tr[x].lazy,tr[y].lazy);
	swap(tr[x].sz,tr[y].sz);
	swap(tr[x].val,tr[y].val);
}

void push_down(int now){
	swp(tr[now].l,tr[now].r);
	if(tr[now].l)tr[tr[now].l].lazy^=1;
	if(tr[now].r)tr[tr[now].r].lazy^=1;
	tr[now].lazy=0;
}

void split(int now,int v,int &x,int &y){
	if(!now){
		x=y=0;return;
	}
	if(tr[now].lazy)push_down(now);
	if(tr[tr[now].l].sz<v){
		x=now;
		split(tr[x].r,v-tr[tr[now].l].sz-1,tr[x].r,y);
	}
	else{
		y=now;
		split(tr[y].l,v,x,tr[y].l);
	}
	push_up(now);
}

int merge(int x,int y){
	if(!x||!y){
		return x+y;
	}
	if(tr[x].key<tr[y].key){
		if(tr[x].lazy)push_down(x);
		tr[x].r=merge(tr[x].r,y);
		push_up(x);
		return x;
	}
	else{
	    if(tr[y].lazy)push_down(y);
		tr[y].l=merge(x,tr[y].l);
		push_up(y);
		return y;
	}
}

void outp(int now){
	if(!now)return;
	if(tr[now].lazy)push_down(now);
	outp(tr[now].l);
	cout<<now<<" "<<tr[now].val<<endl;
	outp(tr[now].r);
}

int main(){
	srand(114514);
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		root=merge(root,built_node(i));
	}
	for(int i=1;i<=m;i++){
		int a,b,c,l,r;
		cin>>l>>r;
		split(root,l-1,a,b);
		split(b,r-l+1,b,c);
		//cout<<a<<" "<<b<<" "<<c;
		tr[b].lazy^=1;
		root=merge(a,merge(b,c));
		cout<<"*"<<endl; 
		for(int i=1;i<=n;i++){
		cout<<tr[i].l<<" "<<tr[i].r;
		cout<<endl;
	}
	outp(root);
	cout<<"*"<<endl;
	}
	outp(root);
} 
2024/3/6 21:43
加载中...