现场这题写的好挫,最后也没调出来,今天改良了一下代码,找到了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 submit_final[26]; //封榜后的提交,3种状态都算进去
int submit_valid[26]; //ac之前的no,算罚时的时候用他

博客作者分享了在2013 ACM-ICPC亚洲区域赛成都现场赛中的解题经历,指出由于初始代码的不足导致未能及时解决题目。博主重构代码后,成功解决并提供了优化策略,包括使用set优化、定义Team结构体以及处理排行榜变化的方法。文章强调了结构体中元素多时使用索引的重要性,以及提交排序和输出细节的处理技巧,尤其是队名字典序的排序规则。
最低0.47元/天 解锁文章
337

被折叠的 条评论
为什么被折叠?



