洛谷测评显示错误,自己用同样数据测试显示正确?
查看原帖
洛谷测评显示错误,自己用同样数据测试显示正确?
479724
WSYWWH楼主2022/9/25 21:22
#include<bits/stdc++.h>
#define N 300010
using namespace std;
inline int read(){
	int x=0,f=1;
	char a=getchar();
	while(a<'0'||a>'9'){if(a=='-')f=-1;a=getchar();}
	while(a>='0'&&a<='9'){x=x*10+a-'0';a=getchar();}
	return x*f;
}
struct node{
	int son[2];/*0--left,1--right*/
	int fa;
	int inx;//权值 
	int cnt;/*权值为x的出现次数*/
	int siz;/*子树大小*/
	void init(int p1,int v1){
		fa=p1;
		inx=v1;
		cnt=siz=1;
	}
};
node tree[N];
int root,tot;
int n,minn,realn;
int delt;
void update(int x)/*更新子树大小*/{
	int l=tree[x].son[0],r=tree[x].son[1];
    tree[x].siz =tree[l].siz /*左儿子的子树大小*/+tree[r].siz +tree[x].cnt ;
}
void rotate(int x){
	int y=tree[x].fa ,z=tree[y].fa ;
	int k=tree[y].son[1]==x;
	tree[y].son[k]=tree[x].son[k^1];
	tree[y].fa =x;
	tree[tree[x].son[k^1]].fa =y;
	tree[x].son[k^1]=y;
	tree[x].fa =z;
	tree[z].son[tree[z].son[1]==y]=x;
	update(x);update(y);
}
void splay(int x,int k){
	while(tree[x].fa !=k){
		int y=tree[x].fa ;int z=tree[y].fa ;
	    if(z!=k){
	    	if((tree[z].son[0]==y)^(tree[y].son[0]==x) ) rotate(y);
	    	else rotate(x);
		}
		rotate(x);
	}
	if(k==0) root=x;
}
void insert(int v){
	int x=root;
	int fa=x;
	while(v!=tree[x].inx&&x){
		fa=x;
		x=tree[x].son[v>tree[x].inx ];
	}
	if(x) tree[x].cnt ++;
	else{
		x=++tot;
		tree[fa].son [v>tree[fa].inx ]=x;
		tree[x].init(fa,v);
	}
	splay(x,0);
}
void find(int v)/*查找权值为v的点,上根*/{
	int x=root;
	while(tree[x].son[v>tree[x].inx]&&v!=tree[x].inx ){
		x=tree[x].son[v>tree[x].inx];
	}
	splay(x,0);
}
int get_pre(int v)/*前驱*/{
	find(v);
	int x=root;
	if(tree[x].inx <v){
		return x;//v是不在序列中存在的数 
	}
	x=tree[x].son[0];
	while(tree[x].son[1]) x=tree[x].son[1];
	return x;
}
int get_suc(int v)/*后继*/{
	find(v);
	int x=root;
	if(tree[x].inx>v){
		return x;//v是不在序列中存在的数 
	}
	x=tree[x].son[1];
	while(tree[x].son[0]) x=tree[x].son[0];
	return x;
}
void del(int v){
	int pre=get_pre(v);
	int suc=get_suc(v);
	splay(pre,0);splay(suc,pre);
	int del=tree[suc].son[0];
	if(tree[del].cnt >1){
		tree[del].cnt --;splay(del,0);
	}
	else{
		tree[suc].son[0]=0;
		splay(suc,0);
	} 
}
int get_rank(int v){
	find(v);
	return tree[tree[root].son[0]].siz ;
}
int get_val(int k){
	int x=root;
	while(1){
		int y=tree[x].son[0];
		if(tree[y].siz+tree[x].cnt <k){
			k-=tree[y].siz+tree[x].cnt;
			x=tree[x].son[1];
		}
		else{
			if(tree[y].siz >=k)x=tree[x].son[0];
			else break;
		}
	}
	splay(x,0);
	return tree[x].inx ;
}
int main(){
	n=read();minn=read();
	insert(-1e9);insert(1e9);//哨兵
	for(int i=1;i<=n;i++){
		char a=getchar();
		if(a=='I'){
			int k=read();
			if (k<minn) continue;
			insert(k-delt);
			realn++;
		}
		else if(a=='A'){
			int k=read();
			delt+=k;
		}
		else if(a=='S'){
			int k=read();
			delt-=k;
			insert(minn-delt);
			find(-1e9);
			int p=root;
			find(minn-delt);
			int q=root;
			splay(p,0);
			splay(q,p);
			tree[tree[root].son [1]].son[0]=0;
			del(minn-delt);
		}
		else if(a=='F'){
			int k=read();
			int realnum=get_rank(1e9)-1;
			if(realnum<k){
				printf("-1");
			} 
			else{
				printf("%d",get_val(realnum-k+2)+delt);
			}
			cout<<endl;
		}
	}
	cout<<realn-(get_rank(1e9)-1);
	return 0;
}
2022/9/25 21:22
加载中...