萌新刚学oi,求助fhq-treap
查看原帖
萌新刚学oi,求助fhq-treap
505805
ass_wecan楼主2022/4/3 09:56

代码量挺短的,求求神仙们花时间帮蒟蒻看看吧qwq

样例过了全部WA,求助

#include<bits/stdc++.h>
#define printlf(x) print(x),putchar('\n')
#define printsp(x) print(x),putchar(' ')
using namespace std;
const int N=1e5+5;
struct node{
	int s[2];
	int val,siz,rd,tag;
}tree[N];
int num,root,x,y,z;
inline int read(){
    int x=0;
    bool w=0;
    char c=getchar();
    while(!isdigit(c))  w|=c=='-',c=getchar();
    while(isdigit(c))   x=(x<<1)+(x<<3)+(c^48),c=getchar();
    return w?-x:x;
}
inline void print(int x){
    if(x<0) x=-x,putchar('-');
    if(x>9) print(x/10);
    putchar('0'+x%10);
}
inline void push_up(int p){
	tree[p].siz=tree[tree[p].s[0]].siz+tree[tree[p].s[1]].siz+1;
}
inline void push_down(int x){
	swap(tree[x].s[0],tree[x].s[1]);
	tree[tree[x].s[0]].tag^=1;
	tree[tree[x].s[1]].tag^=1;
	tree[x].tag=0;		
}
inline void split(int p,int val,int &x,int &y){
	if(!p){
		x=y=0;
		return ;
	}
	push_down(p);
	if(tree[p].val<=val)	x=p,split(tree[p].s[1],val,tree[p].s[1],y);
	else	y=p,split(tree[p].s[0],val,x,tree[p].s[0]);
	push_up(p);	
}
inline int merge(int x,int y){
	if(!x || !y)	return x+y;
	if(tree[x].rd<tree[y].rd){
		if(tree[x].tag)	push_down(x);
		tree[x].s[1]=merge(tree[x].s[1],y);
		push_up(x);
		return x;
	}
	if(tree[y].tag)	push_down(y);
	tree[y].s[0]=merge(x,tree[y].s[0]);
	push_up(y);
	return y;
}
inline int Newnode(int x){
	tree[++num].rd=rand(),tree[num].siz=1,tree[num].val=x;
	return num;
}
inline void Insert(int val){
	root=merge(root,Newnode(val));
}
inline void Get_ans(int p){
	if(tree[p].tag)	push_down(p);
	if(tree[p].s[0])	Get_ans(tree[p].s[0]);
	printsp(tree[p].val);
	if(tree[p].s[1])	Get_ans(tree[p].s[1]);
}
signed main(){
	int n=read(),m=read();
	for(register int i=1;i<=n;++i){
		Insert(i);
	}
	while(m--){
		int l=read(),r=read();
		split(root,l-1,x,y);
		split(y,r,y,z);
		tree[y].tag^=1;
		root=merge(x,merge(y,z));
	}
	Get_ans(root);
    return 0;
}


2022/4/3 09:56
加载中...