[ICPC 2024 Chengdu R] Grand Prix of Ballance题解
P15081 [ICPC 2024 Chengdu R] Grand Prix of Ballance
题目描述
Ballance 是一款经典游戏,玩家使用键盘控制一颗球在高空复杂的结构中穿行,避免坠落,同时解开谜题以抵达每个关卡的终点。最近,玩家社区开发了在线模组,并定期举办在线比赛,例如 Ballance 大奖赛。
大奖赛包含 nnn 个关卡,编号从 111 到 nnn,以及 mmm 名参与者,编号从 111 到 mmm。比赛采用积分制:玩家根据他们在每个关卡中的排名获得积分,他们在所有关卡中的积分总和决定了最终排名。每个关卡都有指定的开始时间,参与者必须尽快完成该关卡。作为工作人员,你在比赛期间收到一份服务器日志,其中包含三种类型的消息(保证 1≤x≤n1\le x\le n1≤x≤n 且 1≤id≤m1\le id\le m1≤id≤m):
- 1 x\tt{1\ x}1 x —— 类型 1:第 xxx 关的比赛开始。
- 2 id x\tt{2\ id\ x}2 id x —— 类型 2:编号为 ididid 的参与者完成了第 xxx 关。
- 3 id x\tt{3\ id\ x}3 id x —— 类型 3:编号为 ididid 的参与者自愿放弃完成第 xxx 关。
一条类型 1 的消息标志着第 xxx 关的开始,直到出现针对另一关卡的新类型 1 消息为止。只有与当前活动关卡对应的消息才被视为有效;所有针对其他关卡的消息都应被忽略。第一条类型 1 消息之前的消息也一并忽略。每个关卡在类型 1 消息中最多出现一次。
每名玩家在每个关卡可能产生多条类型 2 和类型 3 消息,但只有第一条有效消息会被计入。具体规则如下:
- 如果消息与类型 1 消息指示的活动关卡不匹配,则忽略该消息。
- 如果玩家对某关卡的第一条有效消息是类型 2,则认为他在该时刻成功完成了该关卡,并且该玩家针对该关卡的后续所有消息都将被忽略。
- 如果玩家对某关卡的第一条有效消息是类型 3,则认为他在该时刻放弃了完成该关卡,并且该玩家针对该关卡的后续所有消息都将被忽略。
- 如果玩家对某关卡没有产生任何消息,则认为他未完成该关卡。
完成关卡的参与者将按如下规则获得积分:第一个完成关卡的玩家获得 mmm 分,第二个获得 m−1m-1m−1 分,以此类推。未完成关卡的参与者(包括放弃者)不得分。
你的任务是根据日志输出每位参与者当前的总积分,并按积分降序排序。如果多名参与者积分相同,则按他们的编号升序列出。
输入格式
- 第一行包含一个整数 TTT(1≤T≤1041 \leq T \leq 10^41≤T≤104),表示测试用例的数量。
- 对于每个测试用例,第一行包含三个整数 nnn、mmm 和 qqq(1≤n≤1051 \leq n \leq 10^51≤n≤105,2≤m≤1052 \leq m \leq 10^52≤m≤105,1≤q≤2⋅1051 \leq q \leq 2 \cdot 10^51≤q≤2⋅105),分别表示关卡数、参与者人数和日志消息数。
- 接下来的 qqq 行包含如上所述的日志消息。消息按时间顺序给出。日志可能不包含所有关卡,因为你可能是在比赛中途收到它的。你只需要处理当前的结果。
保证所有测试用例的 nnn 之和、mmm 之和以及 qqq 之和分别不超过 5⋅1055 \cdot 10^55⋅105。
输出格式
对于每个测试用例,输出 mmm 行,每行包含两个整数:ididid 和 xxx,其中 ididid 是参与者的编号,xxx 是其总积分,按积分降序排序。如果多名参与者积分相同,则按编号升序列出。
输入输出样例 #1
输入 #1
3
3 4 6
1 2
2 1 1
2 2 2
3 3 2
2 3 2
2 1 2
3 4 8
1 2
2 1 1
2 2 2
3 3 2
2 3 2
2 1 2
1 1
2 1 1
3 4 7
1 2
2 1 1
2 2 2
3 3 2
2 3 2
2 1 2
1 1
输出 #1
2 4
1 3
3 0
4 0
1 7
2 4
3 0
4 0
2 4
1 3
3 0
4 0
说明/提示
翻译由 DeepSeek V3 完成
思路
直接模拟。
代码见下
#include<bits/stdc++.h>
using namespace std;
long long t,n,m,q,opt,id,xx,xc=0;
struct one{
long long x,i;
}a[500005];
vector<long long> v[500005];
map<pair<long long,long long>,long long> mp;
bool cmp(one a1,one b1){
if(a1.x!=b1.x){
return a1.x>b1.x;
}
else{
return a1.i<b1.i;
}
}
int main(){
cin>>t;
while(t--){
cin>>n>>m>>q;
mp.clear();
for(int i=1;i<=n;i++){
v[i].clear();
}
for(int i=1;i<=m;i++){
a[i]={0,i};
}
xc=0;
while(q--){
cin>>opt;
if(opt==1){
cin>>xx;
xc=xx;
}
else if(opt==2){
cin>>id>>xx;
if(mp[{id,xx}]==0&&xc==xx){
v[xx].push_back(id);
mp[{id,xx}]=1;
}
}
else{
cin>>id>>xx;
if(mp[{id,xx}]==0&&xc==xx){
mp[{id,xx}]=1;
}
}
}
for(int i=1;i<=n;i++){
for(int j=0;j<v[i].size();j++){
a[v[i][j]].x+=(m-j);
}
}
sort(a+1,a+m+1,cmp);
for(int i=1;i<=m;i++){
cout<<a[i].i<<" "<<a[i].x<<endl;
}
}
return 0;
}

浙公网安备 33010602011771号