牛客练习赛69 B 划分

H y p e r l i n k Hyperlink Hyperlink

https://ac.nowcoder.com/acm/contest/7329/B


D e s c r i p t i o n Description Description

定义 v a l ( i , j ) val(i,j) val(i,j)表示将数组划分成 i i i个不相交的子串,每个子串取前 j j j大的值作为权值,求任意 i , j i,j i,j的最大 v a l val val值和

数据范围: n ≤ 1 0 5 , x × y ≤ n n\leq 10^5,x\times y\leq n n105,x×yn


S o l u t i o n Solution Solution

一定是求前若干大的值,所以排序后用前缀和计算即可

时间复杂度: O ( n l o g n + x y ) O(nlogn+xy) O(nlogn+xy)


C o d e Code Code

#include
#include
#include
#include
#define LL long long
using namespace std;int n,x,y,m;
LL a[100010],s[100010],ans;
inline LL read()
{
     
	char c;LL d=1,f=0;
	while(c=getchar(),!isdigit(c)) if(c=='-') d=-1;f=(f<<3)+(f<<1)+c-48;
	while(c=getchar(),isdigit(c)) f=(f<<3)+(f<<1)+c-48;
	return d*f;
}
signed main()
{
     
	n=read();
	for(register int i=1;i<=n;i++) a[i]=read();
	x=read();y=read();
	sort(a+1,a+1+n);
	reverse(a+1,a+1+n);
	for(register int i=1;i<=n;i++) s[i]=s[i-1]+a[i];
	for(register int i=1;i<=x;i++)
	 for(register int j=1;j<=y;j++)
	  ans+=s[i*j];
	printf("%lld",ans);
}

你可能感兴趣的:(牛客练习赛69,B,划分)