关于 UB
查看原帖
关于 UB
175590
Zxx200611楼主2022/3/24 11:16

第一组数据,我的代码在本地 0ms,但在洛谷上或是 CF 的 Custom Test 均 TLE。
求助,调了一早上了:

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

struct Splay
{
	struct Node
	{
		int ch[2],fth,siz;
		int val,cnt;
		bool tag;
	};
	vector<Node> t;
	int rt;
	
	inline
	int newNode(int _fth,int _siz,int _val,int _cnt,bool _tag)
	{
		t.push_back((Node){{-1,-1},_fth,_siz,_val,_cnt,_tag});
		return t.size()-1;
	}
	inline
	void pushUp(int u)
	{
		t[u].siz=(t[u].ch[0]==-1?0:t[t[u].ch[0]].siz)+(t[u].ch[1]==-1?0:t[t[u].ch[1]].siz)+t[u].cnt;
	}
	inline
	void pushDown(int u)
	{
		if(t[u].tag==1)
		{
			if(t[u].ch[0]!=-1) swap(t[t[u].ch[0]].ch[0],t[t[u].ch[0]].ch[1]),t[t[u].ch[0]].tag^=1;
			if(t[u].ch[1]!=-1) swap(t[t[u].ch[1]].ch[0],t[t[u].ch[1]].ch[1]),t[t[u].ch[1]].tag^=1;
			t[u].tag=0;
		}
	}
	inline
	int recognize(int u)
	{
		return (t[u].fth==-1?0:(u!=t[t[u].fth].ch[0]));
	}
	inline
	void rotate(int u)
	{
		int v=t[u].fth,w=t[v].fth;
		pushDown(v),pushDown(u);
		int id=recognize(u);
		if(t[u].ch[!id]!=-1)
		{
			t[t[u].ch[!id]].fth=v;
		}
		t[v].ch[id]=t[u].ch[!id];
		t[u].fth=w;
		if(w!=-1)
		{
			t[w].ch[recognize(v)]=u;
		}
		t[v].fth=u,t[u].ch[!id]=v;
		pushUp(v),pushUp(u);
	}
	inline
	void splay(int u,int aim)
	{
		while(t[u].fth!=aim)
		{
			int v=t[u].fth;
			if(t[v].fth==aim)
			{
				rotate(u);
			}
			else
			{
				if(recognize(u)!=recognize(v))
				{
					rotate(u),rotate(u);
				}
				else
				{
					rotate(v),rotate(u);
				}
			}
		}
		if(aim==-1)
		{
			rt=u;
		}
	}
	inline
	int buildTree(vector<int> &s)
	{
		int u=newNode(-1,1,s[s.size()/2],1,0);
		vector<int> sl(0),sr(0);
		for(int i=0;i<s.size()/2;i++)
		{
			sl.push_back(s[i]);
		}
		for(int i=s.size()/2+1;i<s.size();i++)
		{
			sr.push_back(s[i]);
		}

		int v1=-1,v2=-1;
		if(sl.size()>=1) v1=buildTree(sl);
		if(sr.size()>=1) v2=buildTree(sr);

		t[u].ch[0]=v1,t[u].ch[1]=v2;
		if(v1!=-1) t[v1].fth=u;
		if(v2!=-1) t[v2].fth=u;
		pushUp(u);
		return u;
	}
	inline
	int getPos(int rak)
	{
		int u=rt;
		while(1)
		{
			pushDown(u);
			int lsz=t[u].ch[0]==-1?0:t[t[u].ch[0]].siz;
			if(lsz+1<=rak&&lsz+t[u].cnt>=rak)
			{
				return u;
			}
			else if(lsz+t[u].cnt<rak)
			{
				rak-=t[t[u].ch[0]].siz+t[u].cnt,u=t[u].ch[1];
			}
			else
			{
				u=t[u].ch[0];
			}
		}
		return -1;
	}
	inline
	void flipInterval(int l,int r)
	{
		int u=getPos(l-1),v=getPos(r+1),w;
		splay(u,-1),splay(v,u),w=t[v].ch[0];
		t[w].tag^=1,swap(t[w].ch[0],t[w].ch[1]);
	}
	inline
	vector<int> getAns(int u)
	{
		vector<int> res(0),tmp(0);
		pushDown(u);
		if(t[u].ch[0]!=-1)
		{
			tmp=getAns(t[u].ch[0]);
			res.insert(res.end(),tmp.begin(),tmp.end());
		}
		res.push_back(t[u].val);
		if(t[u].ch[1]!=-1)
		{
			tmp=getAns(t[u].ch[1]);
			res.insert(res.end(),tmp.begin(),tmp.end());
		}
		return res;
	}
};
Splay st;

int main()
{
	int n,q;
	cin>>n>>q;

	vector<int> s(n+2);
	for(int i=0;i<=n+1;i++)
	{
		s[i]=i;
	}
	st.rt=st.buildTree(s);

	while(q--)
	{
		int l,r;
		cin>>l>>r;
		st.flipInterval(l+1,r+1);
	}

	vector<int> res=st.getAns(st.rt);
	for(int i=1;i<=n;i++)
	{
		cout<<res[i]<<" ";
	}
	cout<<endl;
}
2022/3/24 11:16
加载中...