• [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;
    }
    

      

  • 相关阅读:
    三列布局_左右绝对定位_中间适应
    三列布局_左右固定_中间自适应
    两列布局_左右二侧_绝对定位
    二列布局_左右固定_自己撑开父级块
    两列布局_右侧固定_左侧自适应
    两列布局_左侧固定_右侧自适应
    单列布局_宽度自适应_内容居中
    单列布局_上中下等宽
    聊一聊Unity协程背后的实现原理
    发火箭和做游戏有什么共通点?
  • 原文地址:https://www.cnblogs.com/chadinblog/p/6446070.html
Copyright © 2020-2023  润新知