ABC 343 D - Diversity of Scores

该篇文章介绍了一种使用C++编程语言解决的问题,涉及动态增加分数的计算。通过两个map数据结构,一个用于存储每个时间段的得分选手及其分数,另一个记录每个选手的当前分数,文章描述了如何高效地更新并统计分数状态的变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:

        输入t行,每行代表的A[i]将在第i秒后增加B,且A[i]除了加上B以外不会有其他变化。

        输出T行,表示A[i]的分数在i-0.5秒时数字会有几种不同的状态。

思路:

                用map存储i秒时A[i]增加得分,B[i]作为key,A[i]value,可以非常快速统计出某一时刻所有分数总数。       

        用另一个map存储每个A[i]的分数,A[i]作为key, 分数作为value。

        A[i]被移除了, 需要使用erase方法消除分数key。

参考程序:

#include<bits/stdc++.h>
using namespace std; 
int n,t;
map<long long,set<int>> ans; //每个时间段的得分选手和分数 
map<int,long long> num; //每个选手的分数 

int main(){
    cin>>n>>t;
    for(int i=1;i<=n;i++){
        ans[0].insert(i);
        num[i] = 0;
    }

    for(int i=0;i<t;i++){
        int a,b;
        cin>>a>>b;
        long long one=num[a];
        long long two=num[a]+b;
        ans[one].erase(a);
        if(ans[one].size() == 0){
            ans.erase(ans.find(one));
        }
        num[a]=two;
        ans[two].insert(a);
        cout<<ans.size()<<endl;
    }

    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值