Advertisement
Guest User

Untitled

a guest
Nov 24th, 2014
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.50 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <algorithm>
  4. #include <cmath>
  5. #define FOR(i,a,b) for(int i=a;i<=b;i++)
  6. #define RFOR(i,a,b) for(int i=a;i>=b;i--)
  7. #define MAX(x,y) ((x) > (y) ? (x) : (y))
  8. #define MIN(x,y) ((x) > (y) ? (y) : (x))
  9. using namespace std;
  10. const int maxn=100000+10;
  11. int n,k,size,temp,leave[maxn];
  12. pair<long long,long long> s[maxn];
  13. long long dp[maxn][11],sum[maxn];
  14.  
  15. void addline(long long a,long long b)
  16. {
  17. while (size>=2&& (s[size-1].second-b)/(a-s[size-1].first)>=(s[size-1].second-s[size].second)/(s[size].first-s[size-1].first) ) size--;
  18. size++;
  19. s[size].first=a;
  20. s[size].second=b;
  21. }
  22. long long query(int x)
  23. {
  24. long long best=x*s[temp].first+s[temp].second;
  25. int i=temp+1;
  26. while (i<=size){
  27. if (x*s[i].first+s[i].second>best) {
  28. best=x*s[i].first+s[i].second;
  29. temp=i;
  30. } else break;
  31. i++;
  32. }
  33. return best;
  34. }
  35.  
  36.  
  37. int main()
  38. {
  39. long long res=0;
  40. //freopen("input.txt","r",stdin);
  41. //freopen("output.txt","w",stdout);
  42. scanf("%d %d",&n,&k);
  43. FOR(i,1,n) scanf("%d",&leave[i]);
  44. RFOR(i,n,1){
  45. sum[i]=sum[i+1]+leave[i];
  46. res=res+sum[i];
  47. }
  48. temp=1;
  49. FOR(j,2,k){
  50. size=0;
  51. int tg=n-j+2;
  52. addline( -sum[tg],dp[tg][j-1]+tg*sum[tg]);
  53. temp=1;
  54. RFOR(i,n-j+1,1){
  55. dp[i][j]=query(i);
  56. addline(-sum[i],dp[i][j-1]+i*sum[i]);
  57. temp=MIN(temp,size);
  58. }
  59. }
  60. cout << res-sum[1]-dp[1][k];
  61.  
  62. return 0;
  63. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement