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(计算复杂度,暴力)相关的知识,希望对你有一定的参考价值。

LINK

这就一暴力题…

考虑对每个组别计算它的贡献,设当前组的人数为 x x x

当对每个 k k k的贡献为前 j j j个人时,显然 k k k j j j的因子且满足 x − j < k x-j<k xj<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=1xyinzi(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

Codeforces Educational Codeforces Round 54 题解

Educational Codeforces Round 27