Stay Hungry,Stay Foolish!

C - Sum of Numbers Greater Than Me

C - Sum of Numbers Greater Than Me

https://atcoder.jp/contests/abc331/tasks/abc331_c

 

思路

由于 值 可以是重复的, 需要记录每出现的值 对应的位置 , 记录在 map<int, vector<int>> valpos;

此处利用了map key的自动排序属性, 把所有值 进行从小到大 做了排序,

然后根据valpos,将每个值计算 前缀和, 记录在 map<int, long long> valsum;

每个值的和 = 值 * 出现的次数

 

最后根据前缀和valsum, 计算每个位置 的答案(大于此位置值的所有值的和), 记录在 long long ABiggerSum[1000010];

打印 long long ABiggerSum[1000010];

 

Code

https://atcoder.jp/contests/abc331/submissions/48138824

 

复制代码
int N;
int A[1000010];
map<int, vector<int>> valpos;
map<int, long long> valsum;
long long ABiggerSum[1000010];

int main()
{
    cin >> N;
    
    for(int i=1; i<=N; i++){
        cin >> A[i];
        valpos[A[i]].push_back(i);
    }

    map<int, vector<int>>::iterator it, itprev;
    for(it=valpos.begin(); it!=valpos.end(); it++){
        int thisval = it->first;
        vector<int> indice = it->second;

        long long thissum = thisval * indice.size();
        if (it == valpos.begin()){
            valsum[it->first] = thissum;
        } else {
            valsum[it->first] = valsum[itprev->first] + thissum;
        }
        
        itprev = it;
    }

    long long total = valsum[itprev->first];
    for(it=valpos.begin(); it!=valpos.end(); it++){
        int thisval = it->first;
        vector<int> indice = it->second;
        
        long long thissum = valsum[thisval];
        long long biggersum = total - thissum;
        
        for(auto one_pos: indice){
            ABiggerSum[one_pos] = biggersum;
        }
    }

    for(int i=1; i<=N; i++){
        cout << ABiggerSum[i] << " ";
    }

    return 0;
}
复制代码

 

posted @   lightsong  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
历史上的今天:
2020-12-04 50 web wonderful UI effect
千山鸟飞绝,万径人踪灭
点击右上角即可分享
微信分享提示