P3369 0分求调
  • 板块学术版
  • 楼主suheming2010
  • 当前回复6
  • 已保存回复6
  • 发布时间2024/8/10 11:18
  • 上次更新2024/8/10 12:05:27
查看原帖
P3369 0分求调
673480
suheming2010楼主2024/8/10 11:18

awa 样例#1的输出与我的程序的输出一样,也同样没有超时

#include<bits/stdc++.h>
using namespace std;
const int INF=1e9+1000;
const int N=1e7+1000;
struct TreeNode {
	int left;
	int right;
	int mix;
	int val;
	int weight;
	int size;
}a[N];
int n,tot=0,rt;
int read(){
	int x=0,f=1;char c=getchar();
	while(c<'0'||'9'<c){if(c=='-')f=-1;c=getchar();}
	while('0'<=c&&c<='9')x=x*10+c-'0',c=getchar();
	return x*f;
}
int pushup(int root)
{
	a[root].size=a[a[root].left].size+a[a[root].right].size+a[root].weight;
}
void Left_Rotate(int &root) { //左旋
	int temp=a[root].right;
	a[root].right=a[temp].left;
	a[temp].left=root;
	pushup(root);
	pushup(temp);
	root=temp;
}
void Right_Rotate(int &root) { //右旋
	int temp=a[root].left;
	a[root].left=a[temp].right;
	a[temp].right=root;
	pushup(root);
	pushup(temp);
	root=temp;
}
void insert(int &root,int val) { //插入
//	cout<<a[root].val<<" "<<a[root].left<<" "<<a[root].right<<" "<<a[root].mix<<" "<<'\n';
	if(root==0) {
		tot++;
		root=tot;
		a[tot].left=0;
		a[tot].right=0;
		a[tot].val=val;
		a[tot].mix=rand();
		a[tot].size=1;
		a[tot].weight=1;
		return;		
	}
	else if(val==a[root].val) {
		a[root].weight++;
	}
	else if(val<a[root].val) {
		insert(a[root].left,val);
		if(a[root].mix>a[a[root].left].mix) {
			Right_Rotate(root);
		}
	}
	else if(val>a[root].val) {
		insert(a[root].right,val);
		if(a[root].mix>a[a[root].right].mix) {
			Left_Rotate(root);
		}
	}
	pushup(root);
}
void T_delete(int &root,int val) { //删除
	if(!root) return ;
	if(val<a[root].val) {
		T_delete(a[root].left,val);
	} else if(val>a[root].val) {
		T_delete(a[root].right,val);
	} else {
		if(a[root].weight>1)
		{
			a[root].weight--;
			pushup(root);
			return;
		}
		if(a[root].left==0&&a[root].right==0) {
			root=0;
			return;
		} else {
			if(a[a[root].left].mix>a[a[root].right].mix) {
				Right_Rotate(root);
				T_delete(a[root].right,val);
			}
			else {
				Left_Rotate(root);
				T_delete(a[root].left,val);
			}
		}
	}
	pushup(root);
}
int get_rank(int root,int num) { //求当前数的排名
	if(!root) return 1;
	if(num==a[root].val) return a[a[root].left].size+1;
	else if(num<a[root].val) return get_rank(a[root].left,num);
	else return a[a[root].left].size+a[root].weight+get_rank(a[root].right,num);
}
int get_num(int root,int rank) { //求当前排名的数
	if(!root) return INF;
	if(rank<=a[a[root].left].size) return get_num(a[root].left,rank);
	else if(rank<=a[a[root].left].size+a[root].weight) return a[root].val;
	else return get_num(a[root].right,rank-a[a[root].left].size-a[root].weight);
}
int get_pre(int findnum) {//找前驱 
	int root=rt,num;
	while(root)
	{
		if(a[root].val<findnum) num=a[root].val,root=a[root].right;
		else root=a[root].left;
	}
	return num;
}
int get_next(int findnum) {//找后继 
	int root=rt,num;
	while(root)
	{
		if(a[root].val>findnum) num=a[root].val,root=a[root].left;
		else root=a[root].right;
	}
	return num;
}
int main() {
	n=read();
	for(int i=1;i<=n;i++)
	{
		int opt=read(),k=read();
		if(opt==1) insert(rt,k);
		if(opt==2) T_delete(rt,k);
		if(opt==3) printf("%d\n",get_rank(rt,k));
		if(opt==4) printf("%d\n",get_num(rt,k));
		if(opt==5) printf("%d\n",get_pre(k));
		if(opt==6) printf("%d\n",get_next(k));
//		cout<<'\n';
//		for(int i=1;i<=tot;i++)
//		{
//			cout<<a[i].val<<" "<<a[i].left<<" "<<a[i].right<<" "<<a[i].mix<<' '<<a[i].size<<" "<<'\n';
//		}
//		cout<<'\n';
	}
}
2024/8/10 11:18
加载中...