zoukankan      html  css  js  c++  java
  • 【模拟】【set】hdu 4789 ICPC Ranking

    写了一晚上,TLE到死,我选择GG

    喵的好像还是前几年我校出的题,这整场都……tm……

    改日在战

    /*TLE代码*/

    #include<cstdio>
    #include<vector>
    #include<string>
    #include<cstring>
    #include<map>
    #include<algorithm>
    #include<iostream>
    #include<set>
    int e;
    using namespace std;
    map<string,int>ma;
    struct data{
    	vector<int>lasts;
    	int solved,penalty;
    	string name;/*
    	data(const int &_solved,const int &_penalty,const vector<int> & _lasts,const string &_name){
    		solved=_solved;
    		penalty=_penalty;
    		lasts=_lasts;
    		name=_name;
    	}*/
    	data(const string &_name){
    		solved=penalty=0;
    		name=_name;
    		lasts.clear();
    	}
    	data(){}
    };
    bool operator < (const data &a,const data &b){
    	if(a.solved!=b.solved){
    		return a.solved>b.solved;
    	}
    	if(a.penalty!=b.penalty){
    		return a.penalty<b.penalty;
    	}
    	for(int i=a.lasts.size()-1,j=b.lasts.size()-1;i>=0 && j>=0;--i,--j){
    		if(a.lasts[i]!=b.lasts[j]){
    			return a.lasts[i]<b.lasts[j];
    		}
    	}
    	return a.name>b.name;
    }
    typedef set<data>::iterator set_ITER;
    struct Query{
    	string name;
    	char pro;
    	int t,type;
    }Q[50010];
    bool operator < (const Query &a,const Query &b){
    	if(a.t!=b.t){
    		return a.t<b.t;
    	}
    	return a.type<b.type;
    }
    set<data>S;
    data A[50010],output[50010];
    int p;
    int B[50010][26]/*,D[50010][26]*/,aftersubs[50010][26];
    int C[50010][26],E[50010][26];
    int n,m,T,t,ZU;
    int main(){
    //	freopen("i.in","r",stdin);
    	char tmp1[10],tmp2[10];
    	scanf("%d",&ZU);
    	for(int zu=1;zu<=ZU;++zu){
    		printf("Case #%d:
    ",zu);
    //		memset(aftersubs,0,sizeof(int)*(e+1)*26);
    //		memset(B,0,sizeof(int)*(e+1)*26);
    //		memset(C,0,sizeof(int)*(e+1)*26);
    //		memset(D,0,sizeof(int)*(e+1)*26);
    //		memset(E,0,sizeof(int)*(e+1)*26);
    		ma.clear();
    		e=0;
    		S.clear();
    		p=0;
    		S.insert(data(""));
    		scanf("%d%d%d%d",&n,&m,&T,&t);
    		for(int i=1;i<=n;++i){
    			cin>>Q[i].name;
    			if(!ma[Q[i].name]){
    				ma[Q[i].name]=++e;
    				A[e]=data(Q[i].name);
    				S.insert(A[e]);
    			}
    			scanf("%s%d%s",tmp1,&Q[i].t,tmp2);
    			Q[i].pro=tmp1[0];
    			if(tmp2[0]=='E'){
    				Q[i].type=0;
    			}
    			if(tmp2[0]=='N'){
    				Q[i].type=1;
    			}
    			else{
    				Q[i].type=2;
    			}
    		}
    		sort(Q+1,Q+n+1);
    		for(int i=1;i<=n;++i){
    			int id=ma[Q[i].name];
    			if(Q[i].t>=t){
    				++aftersubs[id][Q[i].pro-'A'];
    				continue;
    			}
    			if(Q[i].type==0 || (Q[i].type==2 && C[id][Q[i].pro-'A'])){
    				continue;
    			}
    			if(Q[i].type==1){
    				++B[id][Q[i].pro-'A'];
    //				++D[id][Q[i].pro-'A'];
    			}
    			else{
    				S.erase(A[id]);
    				C[id][Q[i].pro-'A']=Q[i].t;
    				E[id][Q[i].pro-'A']=Q[i].t;
    				++A[id].solved;
    				A[id].penalty+=(Q[i].t+B[id][Q[i].pro-'A']*20);
    				A[id].lasts.push_back(Q[i].t);
    				S.insert(A[id]);
    			}
    		}
    		int rank=1;
    		set_ITER jt=S.begin(); ++jt;
    		for(set_ITER it=S.begin();;++it,++rank,++jt){
    			if(jt==S.end()){
    				break;
    			}
    			cout<<(*it).name<<' '<<rank<<' '<<(*it).solved<<' '<<(*it).penalty;
    			int id=ma[(*it).name];
    			for(int i=0;i<m;++i){
    				putchar(' ');
    				if(C[id][i]){
    					putchar('+');
    					if(B[id][i]){
    						printf("%d",B[id][i]);
    					}
    				}
    				else{
    					if(aftersubs[id][i]){
    						if(B[id][i]){
    							printf("-%d",B[id][i]);
    						}
    						else{
    							putchar('0');
    						}
    						putchar('/');
    						printf("%d",aftersubs[id][i]);
    					}
    					else{
    						if(B[id][i]){
    							printf("-%d",B[id][i]);
    						}
    						else{
    							putchar('.');
    						}
    					}
    				}
    			}
    			puts("");
    		}
    		int From;
    		for(int i=1;i<=n;++i){
    			if(Q[i].t>=t){
    				From=i;
    				break;
    			}
    		}
    		for(int i=From;i<=n;++i){
    			int id=ma[Q[i].name];
    			if(Q[i].type==0 || (Q[i].type==2 && C[id][Q[i].pro-'A'])){
    				continue;
    			}
    			else if(Q[i].type==1){
    				++B[id][Q[i].pro-'A'];
    			}
    			else{
    				C[id][Q[i].pro-'A']=Q[i].t;
    				++A[id].solved;
    			}
    		}
    		set_ITER it=S.end(); --it; --it;
    		while(1){
    			bool allsolved=0;
    			while((*it).solved==A[ma[(*it).name]].solved){
    				if(it==S.begin()){
    					allsolved=1;
    					break;
    				}
    				jt=it; --jt;
    				output[++p]=(*it);
    				S.erase(it);
    				it=jt;
    			}
    			if(allsolved){
    				output[++p]=(*S.begin());
    				break;
    			}
    			data nextFrom;
    			if(it!=S.begin()){
    				--it;
    				nextFrom=(*it);
    				++it;
    			}
    			int id=ma[(*it).name];
    			for(int i=0;i<m;++i){
    				if(C[id][i]!=E[id][i]){
    					E[id][i]=C[id][i];
    					data tmp=(*it);
    					set_ITER jt=it;
    					data __next=*(++jt);
    					++tmp.solved;
    					tmp.penalty+=(C[id][i]+B[id][i]*20);
    					tmp.lasts.push_back(C[id][i]);
    					S.erase(it);
    					S.insert(tmp);
    					it=S.find(tmp);
    					++it;
    					if((*it).name!=__next.name){
    						cout<<tmp.name<<' '<<(*it).name<<' '<<tmp.solved<<' '<<tmp.penalty<<endl;
    						it=S.find(nextFrom);
    					}
    					else{
    						--it;
    					}
    					break;
    				}
    			}
    		}
    		for(int i=p,rank=1;i>=1;--i,++rank){
    			int id=ma[output[i].name];
    			cout<<output[i].name<<' '<<rank<<' '<<output[i].solved<<' '<<output[i].penalty;
    			for(int j=0;j<m;++j){
    				putchar(' ');
    				if(C[id][j]){
    					putchar('+');
    					if(B[id][j]){
    						printf("%d",B[id][j]);
    					}
    				}
    				else{
    					if(B[id][j]){
    						printf("-%d",B[id][j]);
    					}
    					else{
    						putchar('.');
    					}
    				}
    			}
    			puts("");
    		}
    		for(int i=1;i<=n;++i){
    			int id=ma[Q[i].name];
    			aftersubs[id][Q[i].pro-'A']=
    			B[id][Q[i].pro-'A']=
    			C[id][Q[i].pro-'A']=
    			E[id][Q[i].pro-'A']=0;
    		}
    	}
    	return 0;
    }
  • 相关阅读:
    (005)Linux 复制命令cp总提示是否覆盖的解决方法,在cp前加
    (030)Spring Boot之RestTemplate访问web服务案例
    Gym
    Gym
    Gym.102006:Syrian Collegiate Programming Contest(寒假自训第11场)
    BZOJ-5244 最大真因数(min25筛)
    HDU
    HDU 1272 小希的迷宫(并查集)
    HDU 3038 How Many Answers Are Wrong(带权并查集)
    POJ 1182 食物链(带权并查集)
  • 原文地址:https://www.cnblogs.com/autsky-jadek/p/6649269.html
Copyright © 2011-2022 走看看