1 条题解

  • 1
    @ 2025-1-18 14:47:58
    #include<bits/stdc++.h>
    using namespace std;
    int n,q,t,x,l,r;
    template<typename T>
    class Splay
    {
    	static int rt,tot;
    	struct node
    	{
    		T v;int lc,rc,cnt,sum,fa,la;
    		node(){}
    		node(T x){v=x;lc=rc=fa=la=0;cnt=sum=1;}
    	}a[2000005];
    	void pushdown(int x)
    	{
    		a[x].la=0;
    		if(a[x].lc)a[a[x].lc].la^=1;
    		if(a[x].rc)a[a[x].rc].la^=1;
    		swap(a[x].lc,a[x].rc);
    	}
    	void upt(int &x){a[x].sum=a[a[x].lc].sum+a[a[x].rc].sum+a[x].cnt;}
    	void lx(int x)
    	{
    		int t=a[x].rc;
    		a[x].rc=a[t].lc;if(a[t].lc)a[a[t].lc].fa=x;
    		a[t].fa=a[x].fa;a[t].lc=x;
    		a[a[x].fa].lc==x?a[a[x].fa].lc=t:a[a[x].fa].rc=t;a[x].fa=t;upt(t);upt(x);
    	}
    	void rx(int x)
    	{
    		int t=a[x].lc;
    		a[x].lc=a[t].rc;if(a[t].rc)a[a[t].rc].fa=x;
    		a[t].fa=a[x].fa;a[t].rc=x;
    		a[a[x].fa].lc==x?a[a[x].fa].lc=t:a[a[x].fa].rc=t;a[x].fa=t;upt(t);upt(x);
    	}
    	public:
    	T v(int x){return a[x].v;}; 
    	void splay(int x,int fa=0)
    	{
    		while(a[x].fa!=fa)
    		{
    			int y=a[x].fa,z=a[y].fa;
    			if(z!=fa)(a[y].lc==x)^(a[z].lc==y)?(a[y].rc==x?lx(y):rx(y)):(a[z].rc==y?lx(z):rx(z));
    			a[a[x].fa].rc==x?lx(a[x].fa):rx(a[x].fa);
    		}
    		if(!fa)rt=x;
    	}
    	void insert(T v,int &x=rt,int fa=0)
    	{
    		if(!x)return x=++tot,a[x]=v,a[x].fa=fa,splay(x);
    		if(v<a[x].v)insert(v,a[x].lc,x);
    		else if(v>a[x].v)insert(v,a[x].rc,x);
    	}
    	T kth(int k,int x=rt)
    	{
            int kk=k;
    		while(x)
    		{
    			if(a[x].la)pushdown(x);
    			if(a[a[x].lc].sum<k)
    				if(a[a[x].lc].sum+a[x].cnt>=k)break;
    				else k-=a[a[x].lc].sum+a[x].cnt,x=a[x].rc;
    			else x=a[x].lc;
    		}
    		return x;
    	}
    	void reverse(int l,int r)
    	{
    		splay(kth(l)),splay(kth(r+2),rt);
    		a[a[a[rt].rc].lc].la^=1;
    	}
    	void print(int x=rt)
    	{
    		if(!x)return;
    		if(a[x].la)pushdown(x);
            //cout<<a[x].v<<" "<<a[a[x].lc].v<<" "<<a[a[x].rc].v<<endl;
    		print(a[x].lc);
    		if(a[x].v!=INT_MAX&&a[x].v!=INT_MIN)cout<<a[x].v<<" ";
    		print(a[x].rc);
    	}
    	Splay(){rt=tot=0;}
    };
    template<typename T>int Splay<T>::rt=0;
    template<typename T>int Splay<T>::tot=0;
    Splay<int> a;
    int main()
    {
    	ios::sync_with_stdio(false);
    	cin.tie(0);
    	cout.tie(0);
    	a.insert(INT_MAX);
    	a.insert(INT_MIN);
    	cin>>n>>q;
    	for(int i=1;i<=n;i++)a.insert(i);
    	while(q--)cin>>l>>r,a.reverse(l,r);
    	a.print();
    	return 0;
    }
    
    • 1

    信息

    ID
    5536
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者