请求 DEBUG
查看原帖
请求 DEBUG
922691
Hisy楼主2024/7/3 11:30
#include<cstdlib>
#include<cstdio>
#include<ctime>
int data[500005<<1],prev[500005<<1],next[500005<<1],first,second,middle;
inline int abs(int number){
	if(number<0){
		return -number;
	};
	return number;
};
inline int min(int first,int second){
	if(first<second){
		return first;
	};
	return second;
};
struct node{
	int size,randkey,value,left,right;
};
namespace treap1{
	int top,root,answer=2147483647;
	node tree[500005<<1];
	inline int newnode(int value){
		tree[++top].value=value;
		tree[top].size=1;
		tree[top].randkey=rand();
		return top;
	};
	inline void pushup(int root){
		tree[root].size=tree[tree[root].left].size+tree[tree[root].right].size+1;
		return;
	};
	inline void split(int root,int value,int &first,int &second){
		if(!root){
			first=second=0;
			return;
		};
		if(tree[root].value<=value){
			first=root;
			split(tree[root].right,value,tree[root].right,second);
		}else{
			second=root;
			split(tree[root].left,value,first,tree[root].left);
		};
		pushup(root);
		return;
	};
	inline int merge(int first,int second){
		if(!first||!second){
			return first+second;
		};
		if(tree[first].randkey>tree[second].randkey){
			tree[first].right=merge(tree[first].right,second);
			pushup(first);
			return first;
		};
		tree[second].left=merge(first,tree[second].left);
		pushup(second);
		return second;
	};
	inline int head(int root){
		while(tree[root].left){
			root=tree[root].left;
		};
		return tree[root].value;
	};
	inline int tail(int root){
		while(tree[root].right){
			root=tree[root].right;
		};
		return tree[root].value;
	};
	inline void insert(int value){
		split(root,value,first,second);
		if(tree[first].size){
			answer=min(answer,abs(value-head(first)));
		}else{
			answer=min(answer,abs(tail(second)-value));
		};
		root=merge(merge(first,newnode(value)),second);
		return;
	};
};
namespace treap2{
	node tree[500005<<1];
	int top,root;
	inline int newnode(int value){
		tree[++top].value=value;
		tree[top].size=1;
		tree[top].randkey=rand();
		return top;
	};
	inline void pushup(int root){
		tree[root].size=tree[tree[root].left].size+tree[tree[root].right].size+1;
		return;
	};
	inline void split(int root,int value,int &first,int &second){
		if(!root){
			first=second=0;
			return;
		};
		if(tree[root].value<=value){
			first=root;
			split(tree[root].right,value,tree[root].right,second);
		}else{
			second=root;
			split(tree[root].left,value,first,tree[root].left);
		};
		pushup(root);
	};
	inline int merge(int first,int second){
		if(!first||!second){
			return first+second;
		};
		if(tree[first].randkey>tree[second].randkey){
			tree[first].right=merge(tree[first].right,second);
			pushup(first);
			return first;
		};
		tree[second].left=merge(first,tree[second].left);
		pushup(second);
		return second;
	};
	inline void insert(int value){
		split(root,value,first,second);
		root=merge(merge(first,newnode(value)),second);
		return;
	};
	inline void erase(int value){
		split(root,value,first,second);
		split(first,value-1,first,middle);
		middle=merge(tree[middle].left,tree[middle].right);
		root=merge(merge(first,middle),second);
		return;
	};
	inline int head(int root){
		while(tree[root].left){
			root=tree[root].left;
		};
		return tree[root].value;
	};
};
int main(int argc,char **argv){
	srand(time(0));
	int size,action;
	scanf("%d %d",&size,&action);
	for(int iter=1;iter<=size;++iter){
		scanf("%d",&data[iter]);
		treap1::insert(data[iter]);
	};
	for(int iter=1;iter<size;++iter){
		treap2::insert(abs(data[iter+1]-data[iter]));
		next[iter]=iter+1;
	};
	for(int iter=2;iter<=size;++iter){
		prev[iter]=iter-1;
	};
	prev[size+1]=size;
	int count=size;
	do{
		char str[55];
		scanf("%s",str);
		if(str[0]=='I'){
			int dot,value;
			scanf("%d %d",&dot,&value);
			if(dot<size){
				treap2::erase(abs(data[dot+1]-data[prev[dot+1]]));
			};
			treap2::insert(abs(data[prev[dot+1]]-value));
			if(dot<size){
				treap2::insert(abs(value-data[dot+1]));
			};
			data[++count]=value;
			prev[count]=prev[dot+1];
			next[count]=dot+1;
			next[prev[dot+1]]=count;
			prev[dot+1]=count;
			treap1::insert(value);
		}else if(str[4]=='S'){
			printf("%d\n",treap2::head(treap2::root));
		}else{
			printf("%d\n",treap1::answer);
		};
	}while(--action);
	return 0;
};

全 WA。

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