求助treap模板,全WA,快调吐了
查看原帖
求助treap模板,全WA,快调吐了
421265
eastcloud楼主2022/7/18 19:59
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdlib>
#define ll long long
using namespace std;
ll ty=-1,tot,root,con;
struct Node{
	ll l,r,dat,val;
	ll cnt,size;
}a[100001];
void New(ll val){
	a[++tot].val=val;
	a[tot].cnt=a[tot].size=1;
	a[tot].dat=rand();
}
void push_up(ll p){
	a[p].size=a[a[p].r].size+a[a[p].l].size+a[p].cnt;
}
void build(){
	New(-(1<<30));
	New(1<<30);
	a[1].r=2;
	push_up(1);
	root=1;
}
void zig(ll &p){
	ll q=a[p].l;
	a[p].l=a[q].r;
	a[q].r=p;
	p=q;
	push_up(p);
	push_up(a[p].r);
}
void zag(ll &p){
	ll q=a[p].r;
	a[p].r=a[q].l;
	a[q].l=p;
	p=q;
	push_up(p);
	push_up(a[p].l);
}
void insert(ll &p,ll val){
	if(!p){
		New(val);
		p=tot;
		return;
	}
	if(a[p].val==val){
		a[p].cnt++;
		push_up(p);
		return;
	}
	if(a[p].val<val){
		insert(a[p].r,val);
		if(a[a[p].r].dat>a[p].dat) zag(p);
	}
	else{
		insert(a[p].l,val);
		if(a[a[p].l].dat>a[p].dat) zig(p);
	}
	push_up(p);
}
void remove(ll &p,ll val){
	if(!p) return;
	if(val==a[p].val){
		if(a[p].cnt>1){
			a[p].cnt--;
			push_up(p);
		}
		else if(a[p].l || a[p].r){
			if(a[p].r==0 || a[a[p].l].dat>a[a[p].r].dat){
				zig(p);
				remove(a[p].l,val);
			}
			else{
				zag(p);
				remove(a[p].r,val);
			}
			push_up(p);
		}
		else p=0;
		return;
	}
	if(val>a[p].val) remove(a[p].r,val);
	else remove(a[p].l,val);
	push_up(p);
}
ll get_pre(ll p,ll val){
	ll ans=1;
	while(p){
		if(a[p].val<=val && a[p].val>a[ans].val) ans=p;
		if(val<a[p].val) p=a[p].l;
		else p=a[p].r;
	}
	return a[ans].val;
}
ll get_next(ll p,ll val){
	ll ans=2;
	while(p){
		if(a[p].val>=val && a[p].val<a[ans].val) ans=p;
		if(val<a[p].val)p=a[p].l;
		else p=a[p].r;
	}
	return a[ans].val;
}
int main(){
	ll n,x,y,ans=0;
	cin>>n;
	build();
	for(ll i=1;i<=n;i++){
		cin>>x>>y;
		if(!con || x==ty){
			ty=x;
			insert(root,y);
			con++;
		}
		else{
			ll tmpa=get_pre(root,y),tmpb=get_next(root,y);
			if(tmpa==-(1<<30) || tmpb==(1<<30)){
				if(tmpa==-(1<<30)){
					ans+=abs(tmpb-y);
					remove(root,tmpb);
					con--;
				}
				else{
					ans+=abs(tmpa-y);
					remove(root,tmpa);
					con--;
				}
			}
			else{
				if(tmpb-y==y-tmpa || tmpb-y>y-tmpa){
					ans+=abs(tmpa-y);
					remove(root,tmpa);
					con--;
				}
				else{
					ans+=abs(tmpb-y);
					remove(root,tmpb);
					con--;
				}
				if(!con) ty=-1;
			}
		}
	}
	cout<<ans;
}
2022/7/18 19:59
加载中...