自造数据未过但洛谷AC
查看原帖
自造数据未过但洛谷AC
735763
_ChongYun_楼主2024/7/3 11:51

我的代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=1e6;
int opt,q,rt,l,r,px,tot=0,ans=0,cnt=0;
struct node{
	int l,r,siz,val,randval;
}Treap[1145141];
void pushup(int p){
	Treap[p].siz=Treap[Treap[p].l].siz+Treap[Treap[p].r].siz+1;
	return ;
}
void build(int x){
	++cnt;
	Treap[cnt].l=Treap[cnt].r=0;
	Treap[cnt].siz=1;
	Treap[cnt].val=x;
	Treap[cnt].randval=rand()%1919810;
	return ;
}
void Split(int p,int val,int &l,int &r){
	if(!p){
		l=r=0;
		return ;
	}
	if(Treap[p].val<=val){ 
		l=p; 
		Split(Treap[p].r,val,Treap[p].r,r); 
	}else{
		r=p; 
		Split(Treap[p].l,val,l,Treap[p].l); 
	}
	pushup(p);
	return ;
}

int Merge(int l,int r){
	if(!l||!r) return l+r;
	if(Treap[l].randval<=Treap[r].randval){
		Treap[l].r=Merge(Treap[l].r,r);
		pushup(l);
		return l;
	}
	Treap[r].l=Merge(l,Treap[r].l);
	pushup(r);
	return r;
}

void Insert(int x){
	Split(rt,x,l,r);
	build(x);
	rt=Merge(Merge(l,cnt),r);
	return ;
}

void Delete(int x){
	Split(rt,x,l,r);
	Split(l,x-1,l,px);
	px=Merge(Treap[px].l,Treap[px].r);
	rt=Merge(Merge(l,px),r);
	return ;
}

void rank_query(int x){
	Split(rt,x-1,l,r);
	cout<<Treap[l].siz+1<<endl;
	rt=Merge(l,r);
	return ;
}

int pre(int x){
	Split(rt,x-1,l,r);
	int now=l;
	while(Treap[now].r) now=Treap[now].r;
	int qans=Treap[now].val;
	rt=Merge(l,r);
	return qans;
}

int nxt(int x){
	Split(rt,x,l,r);
	int now=r;
	while(Treap[now].l) now=Treap[now].l;
	int qans=Treap[now].val;
	rt=Merge(l,r);
	return qans;
}

signed main(){
    srand(20111019);
	cin>>q;
	while(q--){
		int op,x;
		cin>>op>>x;
		if(!tot||op==opt){
			++tot;
			Insert(x);
			opt=op;
		}
		else{
			--tot;
			int qq=0;
			int qwq=pre(x);
			int qaq=nxt(x);
			if(!qwq&&qaq){
				qq=abs(qaq-x);
				Delete(qaq);
			}
			else if(qwq&&!qaq){
				qq=abs(qwq-x);
				Delete(qwq);
			}
			else if(qwq&&qaq){
				if(abs(qwq-x)<=abs(qaq-x)){
					qq=abs(qwq-x);
					Delete(qwq);
				}
				else{
					qq=abs(qaq-x);
					Delete(qaq);
				}
			}
			ans=(ans+qq)%mod;
		}
	}
	cout<<ans<<endl;
	return 0;
}

HACK:

输入:

5                 
0 2                     
0 4     
1 2
1 3
1 5

正确输出:


1

错误输出:


3

2024/7/3 11:51
加载中...