後綴和 推公式

題意: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 ;
}

 

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