MnZn求助,线下答案正确但是在某谷上RE了
  • 板块题目总版
  • 楼主justalearner
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/2/12 13:16
  • 上次更新2023/10/24 00:59:52
查看原帖
MnZn求助,线下答案正确但是在某谷上RE了
774330
justalearner楼主2023/2/12 13:16

跪求大佬康康有没有越界。
(https://www.luogu.com.cn/problem/P3391)[文艺平衡树]

#include<cstdio>
const int N=1e6+10;
#include<algorithm>
#include<stack>
using std::stack;
namespace Splay
{
	struct node
	{
		int rev,val,siz;
		int son[2],fa;
	}T[N];
	stack<int> trash_bin;
	int size=0,root=0;
	bool get(int p) {return p==T[T[p].fa].son[1];}
	int new_node()
	{
		if(!trash_bin.empty())
		{
			int ret=trash_bin.top();
			trash_bin.pop();
			return ret;
		}
		else return ++size;
	}
	void pushup(int p)
	{
		T[p].siz=T[T[p].son[0]].siz+T[T[p].son[1]].siz+1;
	}
	void pushdown(int p)
	{
		if(T[p].rev)
		{
			T[p].rev=0;
			T[T[p].son[0]].rev^=1;
			T[T[p].son[1]].rev^=1;
			std::swap(T[p].son[0],T[p].son[1]);
			T[0].rev=0;
		}
	}
	int build(int vals[],int l,int r,int fa=0)
	{
		if(l>r) return 0;
		int mid=l+r>>1,p=new_node();
		T[p].val=vals[mid];
		T[p].siz=1;T[p].fa=fa;
		T[p].son[0]=build(vals,l,mid-1,p);
		T[p].son[1]=build(vals,mid+1,r,p);
		pushup(p);
		return p;
	}
	int rotate(int p)
	{
//		printf("%d\n",p);
		int f=T[p].fa,g=T[f].fa,t=get(p);
		T[g].son[get(f)]=p;
		T[T[p].son[t^1]].fa=f;T[f].fa=p;
		T[p].fa=g;
		T[f].son[t]=T[p].son[t^1];T[p].son[t^1]=f;
		T[0].fa=T[0].son[0]=T[0].son[1]=0;
		pushup(f),pushup(p);
	}
	void print(int p=root)
	{
		if(!p) return;
		pushdown(p);
		print(T[p].son[0]);
		printf("%d ",T[p].val);
		print(T[p].son[1]);
	}
	void splay(int p,int goal=0)
	{
//		print();printf("as %d\n",T[p].val);
		while(T[p].fa!=goal)
		{
//			printf("!%d %d\n",p,goal);
			if(T[T[p].fa].fa!=goal) rotate(get(T[p].fa)==get(p)?T[p].fa:p);
			rotate(p);
		}
		if(goal==0) root=p;
//		print();printf("\n");
	}
	int kth(int k,int goal=0)
	{
		int p=root,s=0;//s means the rank of p
//		printf("\nstart as %d\n",p);
		while(1)
		{
			pushdown(p);pushdown(T[p].son[0]),pushdown(T[p].son[1]);
			s+=T[T[p].son[0]].siz+1;
//			printf("%d(%d) %d ask:%d\n",p,T[p].val,s,k);
			if(k==s) {splay(p,goal);return p;}
			else if(k<s) s-=T[T[p].son[0]].siz+1,p=T[p].son[0];
			else p=T[p].son[1];
		}
	}
	int interval(int l,int r)
	{
//		printf("[%d,%d]",l,r);
		if(l==1&&r==size) return root;
		if(l==1) {kth(r+1);return T[root].son[0];}
		if(r==size) {kth(l-1);return T[root].son[1];}
		kth(r+1),kth(l-1,root);return T[T[root].son[0]].son[1];
	}
	void reverse(int l,int r)
	{
		int p=interval(l,r);
//		printf("%d\n",T[0].val);
		T[p].rev^=1;
//		pushdown(p);
//		splay(p);
//		print();printf("\n");
	}
}
int a[N];
int main()
{
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	a[i]=i;
	Splay::root=Splay::build(a,1,n);
	for(int i=1,l,r;i<=m;i++)
	scanf("%d%d",&l,&r),Splay::reverse(l,r);
	Splay::print();
}
2023/2/12 13:16
加载中...