写了一晚上,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. Windows Server 2008 R2 SP1安装SQL 2012安装报错之0x858C001B

    使用Windows Server 2008 R2 SP1安装SQL 2012的时候总是报这样一个错: SQL Server Setup has encountered the following er ...

  2. hdu 1162 Eddy's picture(最小生成树算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1162 Eddy's picture Time Limit: 2000/1000 MS (Java/Ot ...

  3. 【C语言】Coursera课程《计算机程式设计》台湾大学刘邦锋——Week6 String课堂笔记

    Coursera课程 <计算机程式设计>台湾大学 刘邦锋 Week6 String 6-1 Character and ASCII 字符变量的声明 char c; C语言使用一个位元组来储 ...

  4. socket 编程 TCP 实现简单聊天功能【转】

    转自:http://blog.csdn.net/liujia2100/article/details/9006479 版权声明:本文为博主原创文章,未经博主允许不得转载. 各个主要函数的功能: .so ...

  5. DTW 算法(转)

    DTW为(Dynamic Time Warping,动态时间归准)的简称.应用很广,主要是在模板匹配中,比如说用在孤立词语音识别,计算机视觉中的行为识别,信息检索等中.可能大家学过这些类似的课程都看到 ...

  6. 获取并编译最新的Notepad++源码

    获取并编译最新的Notepad++源码 http://blog.csdn.net/u012814856/article/details/68947310 Notepad++源码编译及其分析 http: ...

  7. python爬虫模块之HTML下载模块

    HTML下载模块 该模块主要是根据提供的url进行下载对应url的网页内容.使用模块requets-HTML,加入重试逻辑以及设定最大重试次数,同时限制访问时间,防止长时间未响应造成程序假死现象. 根 ...

  8. 2015多校第6场 HDU 5354 Bipartite Graph CDQ,并查集

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5354 题意:求删去每个点后图是否存在奇环(n,m<=1e5) 解法:很经典的套路,和这题一样:h ...

  9. caffe Python API 之激活函数ReLU

    import sys import os sys.path.append("/projects/caffe-ssd/python") import caffe net = caff ...

  10. CentOS 7下安装php-redis扩展及简单使用

    前言: 在本篇文章中,我将给大家介绍如何在CentOS7上安装PHP-Redis扩展以及一些简单的实用,关于如何在Centos上安装redis的,可以参考 Redis在CentOS 7上的安装部署   ...