[haoi2008]排名系统

Posted CHADLZX

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[haoi2008]排名系统相关的知识,希望对你有一定的参考价值。

 蛤省省选题。

 一道彻头彻尾的码农题。

 该题的主要知识点有:字符串hash,平衡树。(两颗平衡树?)。

 4T用splay怎么都调不过。可能是由于splay常数太大。(想写treap,但又实在不想写)。

 字符串hash不想写啊,用map水的话时限卡着。

 这题就当我过了吧...

 过不去的程序:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<string>
#include<map>
#include<cstdlib>
#include<cmath>
#include<cstdio>
#include<ctime>
#include<queue>
using namespace std;
#define LL long long
#define FILE "dealing"
#define eps 1e-10
#define db double
#define pii pair<int,int>
#define up(i,j,n) for(int i=j;i<=n;i++)
int read(){
	int x=0,f=1,ch=getchar();
	while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
	while(ch>=‘0‘&&ch<=‘9‘)x=(x<<1)+(x<<3)+ch-‘0‘,ch=getchar();
	return x*f;
}
const int maxn=600000,mod=1000000007,inf=1000000007;
bool cmin(int& a,int b){return a>b?a=b,true:false;}
bool cmax(int& a,int b){return a<b?a=b,true:false;}
int n;
//namespace tree{
	int siz[maxn],c[maxn][2],cnt=0,rt,fa[maxn];
	pii val[maxn];
	void updata(int x){siz[x]=siz[c[x][0]]+siz[c[x][1]]+1;}
	void rotate(int x){
		int y=fa[x],z=fa[y],d=c[y][1]==x;
		if(z)c[z][c[z][1]==y]=x;
		fa[y]=x;fa[x]=z;if(c[x][d^1])fa[c[x][d^1]]=y;
		c[y][d]=c[x][d^1],c[x][d^1]=y;
		updata(y);updata(x);
	}
	void splay(int x,int S){
		while(fa[x]!=S){
			int y=fa[x],z=fa[y];
			if(z!=S){
				if(c[z][1]==y^c[y][1]==x)rotate(x);
				else rotate(y);
			}
			rotate(x);
		}
		if(!S)rt=x;
	}
	int getK(int k){//右边有k个数的数
		int x=rt;
		while(x){
			if(k==siz[c[x][1]])return x;
			if(k>siz[c[x][1]])k-=(siz[c[x][1]]+1),x=c[x][0];
			else x=c[x][1];
		}
		return -1;
	}
	int insert(pii key){
		if(!rt){rt=++cnt;val[rt]=key;siz[rt]=1;return rt;}
		int x=rt,y;
		while(x){
			y=x;
			x=c[x][key>val[x]];
		}
		x=++cnt;
		fa[x]=y;
		val[x]=key;
		siz[x]=1;
		c[y][key>val[y]]=x;
		updata(y);
		splay(y,0);
		return x;
	}
	int findl(int x){x=c[x][0];while(c[x][1])x=c[x][1];return x;}
	int findr(int x){x=c[x][1];while(c[x][0])x=c[x][0];return x;}
	void delet(int x){
		splay(x,0);
		int y=findl(x),z=findr(x);
		splay(y,0);
		splay(z,y);
		c[z][0]=fa[x]=0;
		updata(z),updata(y);
	}
//};
string s[maxn],ch;
map<string,int> t;
void dfs(int x){
	if(c[x][0])dfs(c[x][0]);
	cout<<s[n-val[x].second]<<" "<<val[x].first<<endl;
	if(c[x][1])dfs(c[x][1]);
}
int main(){
	freopen(FILE".in","r",stdin);
	freopen(FILE".out","w",stdout);
	ios::sync_with_stdio(true);
	n=read();
	insert(make_pair(inf,-1));
	insert(make_pair(-inf,-1));
	up(i,1,n){
		char w;
		cin>>w;
		if(w==‘+‘){
			cin>>ch;
			s[i]=ch;
			int key;cin>>key;
			if(t.count(ch))delet(t[ch]);
			t[ch]=insert(make_pair(key,n-i));
			continue;
		}
		if(w==‘?‘){
			cin>>ch;
			if(ch[0]>=‘A‘&&ch[0]<=‘Z‘){
				int x=t[ch];
				splay(x,0);
				cout<<siz[c[x][1]]<<endl;
			}
			else {
				int k=0;
				up(j,0,ch.length()-1)
					k=k*10+ch[j]-‘0‘;
				int y=k;
				while(k-y<10){
					int x=n-val[getK(k)].second;
					if(x!=-1)cout<<s[x]<<" ";
					k++;
				}
				cout<<endl;
			}
			continue;
		}
		//dfs(rt);
		//cout<<endl;
	}
	return 0;
}

  

以上是关于[haoi2008]排名系统的主要内容,如果未能解决你的问题,请参考以下文章

HAOI2008排名系统

数据结构(Splay平衡树):HAOI2008 排名系统

[haoi2008]排名系统

P4291 [HAOI2008]排名系统

bzoj1056 [HAOI2008]排名系统updating

HAOI2008题解