【模拟】【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:\n",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;
}

转载于:https://www.cnblogs.com/autsky-jadek/p/6649269.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
校园失物招领系统管理系统按照操作主体分为管理员和用户。管理员的功能包括字典管理、论坛管理、公告信息管理、失物招领管理、失物认领管理、寻物启示管理、寻物认领管理、用户管理、管理员管理。用户的功能等。该系统采用了Mysql数据库,Java语言,Spring Boot框架等技术进行编程实现。 校园失物招领系统管理系统可以提高校园失物招领系统信息管理问题的解决效率,优化校园失物招领系统信息处理流程,保证校园失物招领系统信息数据的安全,它是一个非常可靠,非常安全的应用程序。 ,管理员权限操作的功能包括管理公告,管理校园失物招领系统信息,包括失物招领管理,培训管理,寻物启事管理,薪资管理等,可以管理公告。 失物招领管理界面,管理员在失物招领管理界面中可以对界面中显示,可以对失物招领信息的失物招领状态进行查看,可以添加新的失物招领信息等。寻物启事管理界面,管理员在寻物启事管理界面中查看寻物启事种类信息,寻物启事描述信息,新增寻物启事信息等。公告管理界面,管理员在公告管理界面中新增公告,可以删除公告。公告类型管理界面,管理员在公告类型管理界面查看公告的工作状态,可以对公告的数据进行导出,可以添加新公告的信息,可以编辑公告信息,删除公告信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值