地址 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; }