题解:P15081 [ICPC 2024 Chengdu R] Grand Prix of Ballance
Colubrid_L · · 题解
废话时间
十年 OI 一场空,不开 long long 见祖宗!!
记得开 long long!!!!
正文
纯模拟。
记下当前关卡
- 若传入
1 x,则将g 归零; - 若传入
2 id x,则判断x 是否等于now 。若不等于,则当前消息无效,若等于,还要判断是否是第一条消息,然后更新flag_{id} ; - 若传入
3 id x,则判断是否是第一条消息,并更新flag_{id} 。
最后排个序输出就好了。
其它也没什么要注意的,除了开 long long。
代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+5;
struct node{
int sum,id,flag;
node(){
sum=id=flag=0;
}
bool operator< (const node &a)const{
if(sum!=a.sum)return sum>a.sum;
return id<a.id;
}
void to_zero(){
sum=id=flag=0;
}
}a[N];
int op,t,n,m,q,id,val,now,gt;
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>t;
while(t--){
cin>>n>>m>>q,now=gt=0;
for(int i=1;i<=m;i++)
a[i].to_zero(),a[i].id=i;
while(q--){
cin>>op;
if(op==1)
cin>>val,now=val,gt=0;
if(op==2){
cin>>id>>val;
if(val!=now)continue;
if(a[id].flag==now)continue;
a[id].flag=now;
a[id].sum+=m-gt,gt++;
}
if(op==3){
cin>>id>>val;
if(val!=now)continue;
if(a[id].flag==now)continue;
a[id].flag=now;
}
}
sort(a+1,a+m+1);
for(int i=1;i<=m;i++)
cout<<a[i].id<<" "<<a[i].sum<<'\n';
}
return 0;
}
感谢阅读。