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 }

浙公网安备 33010602011771号