Educational Codeforces Round 108 (Rated for Div. 2) C. Berland Regional

一、算法分析

基本思路就是枚举,还有利用vector的一些小技巧。注意的点是,最后的枚举方式要有一个小优化,不能外层对k进行枚举,如果那样会超时,因为两层循环都是n。而是应该开一个res数组,以组为单位去维护res数组。

二、代码及注释

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<vector>
 6 #define LL long long 
 7 using namespace std;
 8 const int N=200050;
 9 vector<LL> s[N];
10 int n;
11 int u[N];
12 LL res[N];                                            //res of every group
13 int main(){
14     
15     int T;
16     cin>>T;
17     while(T--){
18         scanf("%d",&n);
19         for(int i=1;i<=n;i++){
20             scanf("%d",&u[i]);
21             s[i].clear();
22             res[i]=0;
23         }
24         for(int i=1;i<=n;i++){
25             int v;
26             scanf("%d",&v);
27             s[u[i]].push_back(v);
28         }
29         for(int i=1;i<=n;i++){
30             sort(s[i].begin(),s[i].end());
31             reverse(s[i].begin(),s[i].end());
32             for(int j=1;j<s[i].size();j++) s[i][j]=s[i][j-1]+s[i][j];
33         }
34         for(int i=1;i<=n;i++){                       //枚举每个组
35             int len=s[i].size();
36             for(int j=1;j<=len;j++){                 //这个组j个j个出的情况
37                 int mod=len%j;
38                 res[j]+=s[i][len-1-mod];
39             }
40         }
41         for(int i=1;i<=n;i++) printf("%lld ",res[i]);
42         printf("\n");
43     }
44     
45     
46     
47     
48     return 0;
49     
50 }

 

posted @ 2021-04-30 10:31  _rhinoceros  阅读(100)  评论(0)    收藏  举报