写了一晚上,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;
}

【模拟】【set】hdu 4789 ICPC Ranking的更多相关文章

  1. HDU 5949 Relative atomic mass 【模拟】 (2016ACM/ICPC亚洲区沈阳站)

    Relative atomic mass Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Oth ...

  2. HDU 5873 Football Games 【模拟】 (2016 ACM/ICPC Asia Regional Dalian Online)

    Football Games Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

  3. 【贪心】【模拟】HDU 5491 The Next (2015 ACM/ICPC Asia Regional Hefei Online)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5491 题目大意: 一个数D(0<=D<231),求比D大的第一个满足:二进制下1个个数在 ...

  4. 【模拟】HDU 5774 Where Amazing Happens

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5774 题目大意: 已知1946~2015每一年赢得人是谁,给n个名字,问赢了多少次. 题目思路: [ ...

  5. 【模拟】HDU 5762 Teacher Bo

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5762 题目大意: 给n个点,坐标范围0~m(n,m<=105),求是否存在2个点对满足哈夫曼距 ...

  6. 【模拟】HDU 5752 Sqrt Bo

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5752 题目大意: 定义f(n)=⌊√n⌋,fy(n)=f(fy-1(n)),求y使得fy(n)=1. ...

  7. HDOJ(HDU) 2309 ICPC Score Totalizer Software(求平均值)

    Problem Description The International Clown and Pierrot Competition (ICPC), is one of the most disti ...

  8. 并行程序模拟(Concurrency Simulator, ACM/ICPC World Finals 1991,Uva210)

    任务介绍 你的任务是模拟n个程序的并行运算.(按照输入编号为1~n)的并行执行. 代码实现 #define LOCAL #include<bits/stdc++.h> using name ...

  9. HDU 5437 & ICPC 2015 Changchun Alisha's Party(优先队列)

    Alisha’s Party Time Limit: 3000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

随机推荐

  1. Select 使用不当引发的core,你应该知道的

    排查一个死机问题,搞了好几天时间,最终确定原因:最终确定问题原因,在此分享一下: 第一步:常规根据core文件查看栈信息,gdb –c core xxxx 如下rip不正确,指令地址错乱,栈信息已破坏 ...

  2. Intel MKL(Math Kernel Library)

    1.Intel MKL简介 Intel数学核心函数库(MKL)是一套高度优化.线程安全的数学例程.函数,面向高性能的工程.科学与财务应用.英特尔 MKL 的集群版本包括 ScaLAPACK 与分布式内 ...

  3. sqlmap参数说明

    --delay 设置每隔几秒测试一次注入 --safe-url 设置sqlmap要访问的正常url --safe-freq 设置每测试多少条注入语句后才去访问safe-url --code 设置能正常 ...

  4. supervisor 简单使用

    supervisor是一个c/s系统,被用来在类Unix系统中监控进程状态.supervisor使用python开发. 服务端进程为supervisord,主要负责启动自身及其监控的子进程,响应客户端 ...

  5. Linux汇编教程02:编写第一个汇编程序

    学习一门语言,最好的方式就是在运用中学习,那么在这一章节中,我们开始编写我们的第一个汇编程序.当然作为第一个程序,其实十分的简单,但可以给大家一个基本的轮廓,了解汇编大概是这样的. 我们这个程序实际上 ...

  6. 64_j2

    jetty-websocket-server-9.4.3-3.v20170317.fc26.n..> 14-Apr-2017 12:03 62034 jetty-websocket-servle ...

  7. 004 ConcurrentHashMap原理

    下面这部分内容转载自: http://www.haogongju.net/art/2350374 JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为 ...

  8. goreplay HTTP-HTTPS流量复制工具

    goreplay相比tcpcopy只能复制HTTP和HTTPS的流量 goreplay编译很麻烦,就直接使用编译好的版本 gor_0.10.1_x64.tar.gz 支持centos5,测试的是cen ...

  9. C/C++——[01] 程序的基本框架

    我们以HelloWorld这个简单程序为例,该程序在终端打印一行文本: Hello World! 代码如下: #include <stdio.h> int main(){ printf(& ...

  10. RSA加密解密与加签验签

    RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.1987年7月首次在美国公布 ...