现场这题写的好挫,最后也没调出来,今天改良了一下代码,找到了BUG,终于AC了~
我深深的SB了好久,这题是队名字典序大的排前面Orz....
简单回顾下题意,给出N个(N<=50000)个提交,包括队名,题目,时间,返回,然后让你输出比赛结束封榜状态下的榜,滚board的过程和最终榜
首先5W个提交暴力撸是不行了,需要set优化一下
我们先封装一个Team结构体,包括队名,解题数,罚时什么的,然后对于每个题目,记录ac时间,封榜前(后)是否通过,封榜前no的数量,封榜后的提交数,和总的no的数量
然后重载一下<运算符,用索引扔到set里面,每次从最后面取出一支队并删掉,对这个队relax一下,就是处理当前的第一个pending,我用了一个vector存的
处理之后就可以看看插回去的时候他在哪,如果不是最后一名了,就说明rank有变化
同时如果取出的队伍pending.size()为0,就说明这个队已经没有pending了,直接从set里删掉就好
现场的时候脑残没写索引,华丽丽的TLE了,这种结构体里面元素多的时候还是直接上索引吧
另外提交不是按时间给出的,也要先读入再排一下序
最后我把一个队交题(add)和处理pending(relax)都封装在Team结构体里面了,这样代码清晰了很多
剩余的输出部分主要就是细节了,注意一下就好,尤其注意The team whose name comes later in lexicographical order will place higher
具体的细节可以参考代码
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <string>
#include <set>
using namespace std;
#define eps 1e-8
#define LL long long
#define mod 1000000007
#define mxn 50005
int n, m, T, t, cnt;
struct Team {
string name;
int solve, penalty;
int ac_time[26];
int submit_forzen[26]; //封榜前交了多少no
int su