求错误样例
查看原帖
求错误样例
718740
xhabc66楼主2023/7/16 21:51
#include<bits/stdc++.h>
using namespace std;

struct Node
{
	int v;
	int lc,rc;
	int cnt,sz;
	int rd;
}tr[1000000+10];

int cnt=-1,root=-1;

void print(int p)
{
	printf("%d:%d,lc:%d,rc:%d,rand:%d,sz:%d\n",p,tr[p].v,tr[p].lc,tr[p].rc,tr[p].rd,tr[p].sz);
}

void Print(int p)
{
	if(p==-1)return;
	Print(tr[p].lc);
	print(p);
	Print(tr[p].rc);
}
 
int newNode(int v)
{
	cnt++;
	tr[cnt].v=v;
	tr[cnt].lc=tr[cnt].rc=-1;
	tr[cnt].cnt=tr[cnt].sz=1;
	tr[cnt].rd=rand();
	return cnt;
}

int Marge(int l,int r)
{
	//printf("marge:%d&%d\n",l,r);
	if(l==-1)return r;
	if(r==-1)return l;
	if(tr[l].rd>tr[r].rd)
	{
		tr[l].sz+=tr[r].sz;
		tr[l].rc=Marge(tr[l].rc,r);
		//print(l),print(r);
		if(r==root)root=l; 
		return l;
	}
	else{
		tr[r].sz+=tr[l].sz; 
		tr[r].lc=Marge(l,tr[r].lc);
		//print(l),print(r);
		if(l==root)root=r; 
		return r;
	}
}

pair<int,int> Spilt(int p,int v)
{
	//printf("spilt %d by %d\n",p,v);
	if(p==-1)return make_pair(-1,-1);
	if(v<=tr[p].v)
	{
		tr[p].sz-=tr[tr[p].lc].sz;
		pair<int,int>t=Spilt(tr[p].lc,v);
		tr[p].lc=t.second;
		tr[p].sz+=tr[t.second].sz;
		return make_pair(t.first,p);
	}
	else{
		tr[p].sz-=tr[tr[p].rc].sz;
		pair<int,int> t=Spilt(tr[p].rc,v);
		tr[p].rc=t.first;
		tr[p].sz+=tr[t.first].sz;
		return make_pair(p,t.second);
	}
}

void Insert(int v)
{
	pair<int,int> t=Spilt(root,v);
	Marge(Marge(t.first,newNode(v)),t.second);
}

int Kth(int p,int k)
{
	if(p==-1)return -1;
	if(tr[tr[p].rc].sz>=k)return Kth(tr[p].rc,k);
	else if(k==tr[tr[p].rc].sz+1)return tr[p].v;
	else return Kth(tr[p].lc,k-tr[tr[p].rc].sz-1);
}

pair<int,int> Del(int p,int a)
{
	if(p==-1)return make_pair(0,-1);
	if(tr[p].v<a)
	{
		int ans=tr[tr[p].lc].sz+1; 
		pair<int,int> t=Del(tr[p].rc,a);
		ans+=t.first;
		if(p==root)root=t.second;
		return make_pair(ans,t.second);
	}
	else
	{
		pair<int,int> t=Del(tr[p].lc,a);
		tr[p].lc=t.second;
		return make_pair(t.first,p);
	}
}

int main()
{
	int n,mi,zhi=0,ans=0;
	cin>>n>>mi;
	//newNode(0);
	for(int i=0;i<n;i++)
	{
		int a;
		char p;
		cin>>p>>a;
		if(p=='I')
		{
			if(a>=mi)
				if(cnt-ans==-1)root=newNode(a-zhi);
				else Insert(a-zhi);
		}
		else if(p=='A')zhi+=a;
		else if(p=='S')
		{
			zhi-=a;
			ans+=Del(root,mi-zhi).first;
		}
		else if(p=='F')
		{
			int t=Kth(root,a);
			if(t==-1)cout<<"-1\n";
			else cout<<t+zhi<<'\n';
		}
		//cout<<"root:"<<root<<'\n';
		//Print(root);
	}
	cout<<ans<<'\n';
	return 0;
}

Ac#1,10pts

最好 n≤20n\le 20

2023/7/16 21:51
加载中...