splay 96pts,TLE10,悬2关求调
查看原帖
splay 96pts,TLE10,悬2关求调
541553
wangshi楼主2023/7/7 19:07
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#define ll long long
#define ls(x) t[x].s[0]
#define rs(x) t[x].s[1] 
using namespace std;
const int N=1e6+1e5+10,INF=(1<<30)+1;
typedef pair<int,int> PII;
struct node
{
	int s[2],p,v,cnt,size;
	void init(int p1,int v1)
	{
		p=p1,v=v1;
		cnt=size=1;
	}
}t[N]; 
int root,idx;  
void pushup(int x)
{
	t[x].size=t[ls(x)].size+t[rs(x)].size+t[x].cnt;
}
void rotate(int x)
{
	int y=t[x].p,z=t[y].p;
	int k=rs(y)==x;
	t[y].s[k]=t[x].s[k^1];
	t[t[x].s[k^1]].p=y;
	t[y].p=x;
	t[x].s[k^1]=y;
	t[z].s[rs(z)==y]=x;
	t[x].p=z;
	pushup(y),pushup(x);
}
void splay(int x,int k)
{
	while(t[x].p!=k)
	{
		int y=t[x].p,z=t[y].p;
		if(z!=k)
			(ls(y)==x)==(ls(z)==y)?rotate(x):rotate(y);
		rotate(x); 
	}
	if(!k) root=x;
}
void find(int v)
{
	int x=root;
	while(t[x].s[v>t[x].v]&&v!=t[x].v)
		x=t[x].s[v>t[x].v];
	splay(x,0);
}
int get_pre(int v)
{
	find(v);
	int x=root;
	if(t[x].v<v) return x;
	x=ls(x);
	while(rs(x)) x=rs(x);
	splay(x,0);
	return x;  
}
int get_suc(int v)
{
	find(v);
	int x=root;
	if(t[x].v>v) return x;
	x=rs(x);
	while(ls(x)) x=ls(x);
	splay(x,0);
	return x;
}
void insert(int v)
{
	int x=root,p=0;
	while(x&&t[x].v!=v)
		p=x,x=t[x].s[v>t[x].v];
	if(x) t[x].cnt++;
	else
	{
		x=++idx;
		t[p].s[v>t[p].v]=x;
		t[x].init(p,v);
	}
	splay(x,0);
}
void del(int v)
{
    int suc=get_suc(v);
	int pre=get_pre(v);
	splay(suc,pre);
	int del=ls(suc);
	if(t[del].cnt>1)
		t[del].cnt--,splay(del,0);
	else 
		ls(suc)=0,splay(suc,0);
}
int get_rank(int k)
{
    find(k);
    if(t[root].v==k) return t[ls(root)].size;
    int p=get_pre(k);
    find(t[p].v);
    return t[ls(root)].size+1;
    
}
int get_val(int k)
{
	int x=root;
	while(1)
	{
		int y=ls(x);
		if(t[y].size+t[x].cnt<k)
		{
			k-=(t[y].size+t[x].cnt);
			x=rs(x);
		}
		else
		{
			if(t[y].size>=k) x=y;
			else break;
		}
	}
	splay(x,0);
	return t[x].v;
} 
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	insert(-INF),insert(INF);
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		int x;
		cin>>x;
		insert(x);
	}
	int last=0,ans=0;
	while(m--)
	{
		int op,x;
		cin>>op>>x;
		x^=last;
	//	cout<<"---"<<last<<" "<<x<<endl;
		if(op==1) insert(x);
		if(op==2) del(x);
		if(op==3) 
		{
		    insert(x);
			last=get_rank(x);
			del(x);
			ans^=last;
	//		cout<<"----"<<last<<endl;
		}
		if(op==4) 
		{
			last=get_val(x+1);
			ans^=last;
	//		cout<<"----"<<last<<endl;
		}
		if(op==5) 
		{
			last=t[get_pre(x)].v;
			ans^=last;
	//		cout<<"----"<<last<<endl;
		}
		if(op==6) 
		{
			last=t[get_suc(x)].v;
			ans^=last;
	//		cout<<"----"<<last<<endl;
		}
	}
	cout<<ans<<endl;
	return 0;
}

下了数据发现就是先插入了好多数,然后全删了,最后查询了一次

2023/7/7 19:07
加载中...