Educational Codeforces Round 108 (Div. 2), C map套vector存储

地址  Problem - C - Codeforces

题目

 

 

 

 

 

题意

一个学校有n个人参加比赛,他们分别属于ui队,每个人的能力值为si

当每个队需要1~n个人的时候,这个学校能参加的人的能力值和最大为多少

 

解析

map<int,vector<int>>存储不会爆

每一队直接处理出队伍人数为1~n时的能力值最大和,这样不会超时,看代码

 

代码

#include <iostream>
#include <algorithm>
#include <vector>
#include <map>

using namespace std;

typedef long long LL;
const int N = 2e5+10;

int b[N],c[N];
int main()
{
    int t;
    cin >> t;
    while(t --)
    {
        int n;
        scanf("%d", &n);
        map<int,vector<LL>> a;//存第二波输入
        
        for(int i = 1; i <= n; i ++)    scanf("%d", &b[i]); //存所属队
        for(int i = 1; i <= n; i ++){
            int x;
            scanf("%d", &x);
            a[b[i]].push_back(x);
        }
        
        vector<LL> res(n+1);//存结果
        for(auto p1:a)//遍历每一队
        {
            vector<LL> &p = p1.second;
            sort(p.begin(), p.end());
            
            int len = p.size();
            
            for(int i = 1; i < len; ++i)
                p[i] += p[i-1];
                
            for(int i = 1; i <= len; i ++)
                res[i]+=p[len-1]-((len%i)?p[len%i-1]:0LL);//把这一队的算出来
        }
        for(int i = 1; i <= n; i ++)
            cout << res[i] << ' ';
        puts("");
        
    }
    return 0;
}

 

posted @ 2021-05-01 10:47  la-la-wanf  阅读(49)  评论(0编辑  收藏  举报