萌新刚学OI,平衡树求助TLE
查看原帖
萌新刚学OI,平衡树求助TLE
342090
Lips楼主2020/8/14 10:27
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN=1000010;
const int INF=100000089;
struct Splay
{
	int f,siz,cnt,value,tag;
	int ch[2];
};
Splay s[MAXN];
int vis[MAXN],root,tot,n,m,k,x[MAXN],y[MAXN];
bool is(int x){return x==s[s[x].f].ch[1];}
int lc(int p){return s[p].ch[0];}
int rc(int p){return s[p].ch[1];}
void update(int x)
{
	if(!x) return;
	s[x].siz=s[x].cnt;
	if(lc(x)) s[x].siz+=s[lc(x)].siz;
    if(rc(x)) s[x].siz+=s[rc(x)].siz;
}
void pushdown(int x)
{
    if(x&&s[x].tag)
	{
    	s[rc(x)].tag^=1;
    	s[lc(x)].tag^=1;
    	swap(s[x].ch[1],s[x].ch[0]);
    	s[x].tag=0;
    }	
}
void rotate(int x)
{
	int fnow=s[x].f,ffnow=s[fnow].f;
	pushdown(x);
	pushdown(fnow);
	bool w=is(x);
	s[fnow].ch[w]=s[x].ch[w^1];
	s[s[fnow].ch[w]].f=fnow;
	s[fnow].f=x;
	s[x].f=ffnow;
	s[x].ch[w^1]=fnow;
	if(ffnow) s[ffnow].ch[s[ffnow].ch[1]==fnow]=x;
	update(fnow);
}
inline void splay(int x,int to)
{
	for(register int i;(i=s[x].f)!=to;rotate(x))
		if(s[i].f!=to)
		{
			if(is(x)==is(i)) rotate(i);
			else rotate(x);
		}
	if(to==0) root=x;
}
int build(int l,int r,int father) 
{
    if(l>r) return 0;
    int mid=(l+r)>>1;
    int now=++tot;
    s[now].f=father;
    s[now].ch[0]=s[now].ch[1]=0;
	s[now].cnt++;
	s[now].value=vis[mid];
	s[now].siz++;
    s[now].ch[0]=build(l,mid-1,now);
    s[now].ch[1]=build(mid+1,r,now);
    update(now);
    return now;
}
int find(int x)
{
	int now=root;
	while(1)
	{
	    pushdown(now);
		if(x<=s[lc(now)].siz) now=lc(now);
		else  
		{
			x-=s[lc(now)].siz+1;
		    if(!x) return now;
		    else now=rc(now);
		}
	}
}
void reverse(int x,int y)
{
	int l=find(x-1),r=find(y+1);
	splay(l,0);
	splay(r,l);
	int pos=lc(rc(root));
	s[pos].tag^=1;
}
void dfs(int now)
{
	pushdown(now);
	if(lc(now)) dfs(lc(now));
	if(s[now].value!=-INF&&s[now].value!=INF) printf("%d\n",s[now].value);
	if(rc(now)) dfs(rc(now));
}
int main()
{
	scanf("%d%d%d",&n,&m,&k);
	vis[1]=-INF,vis[n+2]=INF;
	for(int i=1;i<=n;i++) vis[i+1]=i;
	root=build(1,n+2,0);
	for(register int i=1;i<=m;i++) scanf("%d%d",&x[i],&y[i]);
	for(register int i=1;i<=k;i++) for(register int j=1;j<=m;j++) reverse(x[j]+1,y[j]+1);
	dfs(root);
}
2020/8/14 10:27
加载中...