Educational Codeforces Round 108 (Rated for Div. 2) C. Berland Regional(计算复杂度,暴力)
Posted issue是fw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Educational Codeforces Round 108 (Rated for Div. 2) C. Berland Regional(计算复杂度,暴力)相关的知识,希望对你有一定的参考价值。
这就一暴力题…
考虑对每个组别计算它的贡献,设当前组的人数为 x x x
当对每个 k k k的贡献为前 j j j个人时,显然 k k k是 j j j的因子且满足 x − j < k x-j<k x−j<k
那么直接暴力枚举每个组别,然后枚举这个组别贡献给 j j j个人时,对哪些 k k k起作用
这样若一个组别人数为 x x x,那么复杂度为 ∑ i = 1 x y i n z i ( i ) \\rm \\sum\\limits_{i=1}^xyinzi(i) i=1∑xyinzi(i),其中 y i n z i ( i ) yinzi(i) yinzi(i)表示 i i i的因子个数
又因为所有组别加起来的人数为 n n n,可以推测复杂度并不会很大
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5+10;
const int mod = 1e9+7;
vector<int>vec[maxn],yin[maxn];
int n,u[maxn],s[maxn];
long long ans[maxn];
void init(int mx)
{
for(int i=1;i<=mx;i++)
for(int j=i;j<=mx;j+=i)
yin[j].push_back( i );
}
bool com(int a,int b){ return a>b; }
int main()
{
init(200000);
int t; cin >> t;
while( t-- )
{
cin >> n;
for(int i=1;i<=n;i++) scanf("%d",&u[i] );
for(int i=1;i<=n;i++) scanf("%d",&s[i] );
for(int i=1;i<=n;i++) vec[u[i]].push_back( s[i] );
for(int i=1;i<=n;i++) sort( vec[i].begin(),vec[i].end(),com );
for(int i=1;i<=n;i++)
{
long long sum = 0;
for(int j=1;j<=vec[i].size();j++)//枚举选择前j个学生
{
sum += vec[i][j-1];
for(auto v:yin[j] )//必须是j的因子且大于vec[i].size()-j
{
if( v>vec[i].size()-j ) ans[v] += sum;
}
}
}
for(int i=1;i<=n;i++) printf("%lld%c",ans[i],i==n?'\\n':' ' );
for(int i=1;i<=n;i++) ans[i] = 0,vec[i].clear();
}
}
以上是关于Educational Codeforces Round 108 (Rated for Div. 2) C. Berland Regional(计算复杂度,暴力)的主要内容,如果未能解决你的问题,请参考以下文章
Educational Codeforces Round 7 A
Educational Codeforces Round 7
Educational Codeforces Round 90
Educational Codeforces Round 33