我 Easy Ver. 的代码可见 https://www.luogu.com/article/nkrt3zt6
就改了个数组大小和 map->unordered_map.
#include<bits/stdc++.h>
using namespace std;
const int N=30,M=2e5+10;
struct Team {
string name;
int pas,tim,id;
int pt[N],st[N],t[N];
bool ac[N],fac[N];
bool operator <(const Team &b) const {
if(pas!=b.pas) return pas>b.pas;
if(tim!=b.tim) return tim<b.tim;
return id<b.id;
}
}a[M];
int main() {
int n,m,k,cnt=0; unordered_map<string,int>idx; scanf("%d %d %d",&n,&m,&k);
while(k--) {
int h,m,s; char p; string nm,sta; scanf("%d:%d:%d %c",&h,&m,&s,&p),cin>>nm,getline(cin,sta);
if(!idx[nm]) cnt++,idx[nm]=a[cnt].id=cnt,a[cnt].name=nm;
int x=idx[nm],y=p-'A'+1;
if(a[x].ac[y]) continue;
if(sta!=" Accepted") { a[x].st[y]++; continue; }
a[x].ac[y]=true,a[x].t[y]=h*60+m;
if(h*3600+m*60+s>14400) a[x].fac[y]=true;
else a[x].pas++,a[x].pt[y]=a[x].t[y]+a[x].st[y]*20,a[x].tim+=a[x].pt[y];
}
priority_queue<Team>q;
for(int i=1;i<=m;i++) q.push(a[i]);
while(q.size()>1) {
Team x=q.top(); q.pop(),cout<<x.name<<'\n';
Team y=q.top(); q.pop();
for(int i=1;i<=n;i++)
if(x.fac[i]) {
x.pas++,x.tim+=x.t[i]+x.st[i]*20,x.fac[i]=false;
if(x<y) { q.push(x); break; }
}
q.push(y);
}
cout<<q.top().name;
return 0;
}