题解:P15081 [ICPC 2024 Chengdu R] Grand Prix of Ballance

· · 题解

废话时间

十年 OI 一场空,不开 long long 见祖宗!!

记得开 long long!!!!

正文

纯模拟。

记下当前关卡 now,与当前关卡通过人数 g。此外,每个选手都应该记录其最后一个消息的对应关卡是什么,设为 flag 数组。这样的话,对于给定的关卡 x,我们只要判断 flag_i 是否等于 x,若不等于,则当前消息为第一条消息,若等于,则不是。然后就是按题意模拟:

最后排个序输出就好了。

其它也没什么要注意的,除了开 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;
}

感谢阅读。