求调,在学校oj上能AC,为什么在洛谷上wa,0分
查看原帖
求调,在学校oj上能AC,为什么在洛谷上wa,0分
780372
hoko楼主2024/8/19 21:53
#include<bits/stdc++.h>
using namespace std;
const int N=1010101;
int ch[N][3],root,n,tot,ch1[N][3],root1,tot1;
struct tt{
	int val,date,size,cnt;
}tree[N];
struct kk{
	int val,date,size,cnt;
}tree1[N];
int add(int p){
	tree[++tot].val=p;
	tree[tot].date=rand();
	tree[tot].size=1;
	tree[tot].cnt=1;
	return tot;
}
void push_up(int p){
	tree[p].size=tree[ch[p][0]].size+tree[ch[p][1]].size+tree[p].cnt;
}
void rotate(int &id,int d){
	int temp=ch[id][d^1];
	ch[id][d^1]=ch[temp][d];
	ch[temp][d]=id;
	id=temp;
	push_up(ch[id][d]);
	push_up(id);
}
void insert(int &id,int x){
	if(id==0){
		id=add(x);
		return;
	}
	if(x==tree[id].val)tree[id].cnt++;
	else{
		int d=0;
		if(x<tree[id].val)d=0;
		else d=1;
		insert(ch[id][d],x);
		if(tree[id].date<tree[ch[id][d]].date)rotate(id,d^1);
	}
	push_up(id);
}
void remove(int &id,int x){
	if(id==0)return;
	if(x==tree[id].val){
		if(tree[id].cnt>1){
			tree[id].cnt--;
			push_up(id);
			return;
		}
		if(ch[id][0]!=0||ch[id][1]!=0){
			if(ch[id][1]==0||tree[ch[id][0]].date>tree[ch[id][1]].date){
				rotate(id,1);
				remove(ch[id][1],x);
			}else{
				rotate(id,0);
				remove(ch[id][0],x);
			}
			push_up(id);
		}else id=0;
		return;
	}
	if(x<tree[id].val)remove(ch[id][0],x);
	else remove(ch[id][1],x);
	push_up(id);
}
int get_pre(int x){
	int id=root,ans=0;
	while(id){
		if(tree[id].val<x)ans=tree[id].val,id=ch[id][1];
		else id=ch[id][0];
	}
	return ans;
}
int get_next(int x){
	int id=root,ans=0;
	while(id){
		if(tree[id].val>x)ans=tree[id].val,id=ch[id][0];
		else id=ch[id][1];
	}
	return ans;
}
int add1(int p){
	tree1[++tot1].val=p;
	tree1[tot1].date=rand();
	tree1[tot1].size=1;
	tree1[tot1].cnt=1;
	return tot1;
}
void push_up1(int p){
	tree1[p].size=tree1[ch1[p][0]].size+tree1[ch1[p][1]].size+tree1[p].cnt;
}
void rotate1(int &id,int d){
	int temp=ch1[id][d^1];
	ch1[id][d^1]=ch1[temp][d];
	ch1[temp][d]=id;
	id=temp;
	push_up1(ch1[id][d]);
	push_up1(id);
}
void insert1(int &id,int x){
	if(id==0){
		id=add1(x);
		return;
	}
	if(x==tree1[id].val)tree1[id].cnt++;
	else{
		int d=0;
		if(x<tree1[id].val)d=0;
		else d=1;
		insert1(ch1[id][d],x);
		if(tree1[id].date<tree1[ch1[id][d]].date)rotate1(id,d^1);
	}
	push_up1(id);
}
void remove1(int &id,int x){
	if(id==0)return;
	if(x==tree1[id].val){
		if(tree1[id].cnt>1){
			tree1[id].cnt--;
			push_up1(id);
			return;
		}
		if(ch1[id][0]!=0||ch1[id][1]!=0){
			if(ch1[id][1]==0||tree1[ch1[id][0]].date>tree1[ch1[id][1]].date){
				rotate1(id,1);
				remove1(ch1[id][1],x);
			}else{
				rotate1(id,0);
				remove1(ch1[id][0],x);
			}
			push_up1(id);
		}else id=0;
		return;
	}
	if(x<tree1[id].val)remove1(ch1[id][0],x);
	else remove1(ch1[id][1],x);
	push_up1(id);
}
int get_pre1(int x){
	int id=root1,ans=0;
	while(id){
		if(tree1[id].val<x)ans=tree1[id].val,id=ch1[id][1];
		else id=ch1[id][0];
	}
	return ans;
}
int get_next1(int x){
	int id=root1,ans=0;
	while(id){
		if(tree1[id].val>x)ans=tree1[id].val,id=ch1[id][0];
		else id=ch1[id][1];
	}
	return ans;
}
int main(){
	int anss;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		int x,y,l1,l2;
		scanf("%d%d",&x,&y);
		if(x==0){
			if(root1==0){
				insert(root,y);
				continue;	
			}
			l1=get_pre1(y);
			l2=get_next1(y);
			if(abs(y-l1)<=abs(y-l2)&&l1!=0){
				anss+=abs(y-l1);
				anss=anss%1000000;
				remove1(root1,l1);
			}
			else{
				anss+=abs(y-l2);
				anss=anss%1000000;
				remove1(root1,l2);
			}
		}
		else{
			if(root==0){
				insert1(root1,y);
				continue;
			}
			l1=get_pre(y);
			l2=get_next(y);
			if(abs(y-l1)<=abs(y-l2)&&l1!=0){
				anss+=abs(y-l1);
				anss=anss%1000000;
				remove(root,l1);
			}
			else{
				anss+=abs(y-l2);
				anss=anss%1000000;
				remove(root,l2);
			}
		}
	}
	printf("%d",anss);
}
2024/8/19 21:53
加载中...