后缀和 推公式

题意:n个数,分为k组,每组的数字的下标是连续的,则分组的代价为∑(组号*数字)。例如3个数1,2,3,分为2组{1,2},{3},这么分组的代价为1*1+1*2+2*3。n,k<=3e5。

题解

1.假设pi是第i组的第1个数字的下标,sum[i]是第i个数到第n个数求和。那么分组的代价为1*(sum[p1]-sum[p2])+2*(sum[p2]-sum[p3])+...+k*sum[pk]=sum[p1]+sum[p2]+...+sum[pk],其中p1=1

2.对后缀和数组sum排序,注意不要对第1个数排序

3.对最大的k-1个sum和sum[1]累加即为答案。

题目链接:http://codeforces.com/contest/1175/problem/D

AC代码:

#include<bits/stdc++.h>
#define N 300005
#define inf 2e9
using namespace std ;
typedef long long ll ;
int n , k ;
ll a[N] ;
ll sum[N] ;
ll ans = 0 ;
int main()
{
	int i , j ;
	scanf("%d%d" , &n , &k) ;
	for(i = 1 ; i <= n ; i ++)
	  cin >> a[i] ;
	sum[n + 1] = 0 ; 
	for(i = n ; i >= 1 ; i --)
      sum[i] = sum[i + 1] + a[i] ;
    sort(sum + 2 , sum + n + 1) ;
	for(i = n ; i >= n - k + 2 ; i --)
	   ans += sum[i] ;
	ans += sum[1] ;
	cout << ans ;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章