【模拟】【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;
}
【模拟】【set】hdu 4789 ICPC Ranking的更多相关文章
- HDU 5949 Relative atomic mass 【模拟】 (2016ACM/ICPC亚洲区沈阳站)
Relative atomic mass Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
- 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 ...
- 【贪心】【模拟】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个个数在 ...
- 【模拟】HDU 5774 Where Amazing Happens
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5774 题目大意: 已知1946~2015每一年赢得人是谁,给n个名字,问赢了多少次. 题目思路: [ ...
- 【模拟】HDU 5762 Teacher Bo
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5762 题目大意: 给n个点,坐标范围0~m(n,m<=105),求是否存在2个点对满足哈夫曼距 ...
- 【模拟】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. ...
- HDOJ(HDU) 2309 ICPC Score Totalizer Software(求平均值)
Problem Description The International Clown and Pierrot Competition (ICPC), is one of the most disti ...
- 并行程序模拟(Concurrency Simulator, ACM/ICPC World Finals 1991,Uva210)
任务介绍 你的任务是模拟n个程序的并行运算.(按照输入编号为1~n)的并行执行. 代码实现 #define LOCAL #include<bits/stdc++.h> using name ...
- 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) ...
随机推荐
- c语言中网络字节序和主机字节序的转换
函数说明 相关函数:htonl, htons, ntohl 头文件:#include <netinet/in.h> 定义函数:unsigned short int ntohs(unsi ...
- bugku逗号过滤注入
URL:http://120.24.86.145:8002/web15/ 直接给出了源码: <?php error_reporting(0); function getIp(){ $ip = ' ...
- Python【模块】importlib,requests
内容概要: 模仿django中间件的加载方式 importlib模块 requests模块 rsplit() 用实际使用的理解来解释两个模块 importlib模块 ...
- TCP之Nagle算法与延迟ACK
(一)Nagle算法 为了减少网络中小分组的数目,减少网络拥塞的情况.Nagle算法要求在一条TCP连接上最多只能有一个未被确认的未完成小分组,在该分组ACK到达之前不能够发送其他的小分组,发送端需要 ...
- Linux 入门记录:十、Linux 下获取帮助
一.获取帮助 Linux 提供了极为详细的帮助工具和文档,通过查阅相关文档,可以大大减少需要记忆的东西并提高效率. 二.--help参数 几乎所有命令都可以使用 -h 或 --help 参数获取命令的 ...
- Bit banging
Bit banging Bit banging is a technique for serial communications using software instead of dedicated ...
- 用pyperclip 模块拷贝粘贴字符串
>>> import pyperclip>>> pyperclip.copy('Hello world!')>>> pyperclip.paste ...
- ASP.NET MVC 文件上传
如果想要用HTML表单实作文件上传的功能,那么必须在输出的<form>表单标签加上一个enctype属性,且内容必须设定为multipart/form-data,要通过Html.Begin ...
- 2017多校第8场 HDU 6143 Killer Names 容斥,组合计数
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6143 题意:m种颜色需要为两段长度为n的格子染色,且这两段之间不能出现相同的颜色,问总共有多少种情况. ...
- 同步方法-java
除了同步代码块能实现同步执行外,同步方法也可以. 先看下同步代码块实现同步执行: public class Demo4 { public static void main(String[] args) ...