Advertisement
Guest User

Untitled

a guest
Sep 13th, 2015
401
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.47 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cmath>
  5. #include <string>
  6. #include <vector>
  7. #include <stack>
  8. #include <queue>
  9. #include <set>
  10. #include <cstring>
  11. #include <map>
  12. #include <cstdlib>
  13. #include <ctime>
  14. #define f first
  15. #define s second
  16. #define ll long long
  17. #define ull unsigned long long
  18. #define mp make_pair
  19. #define pb push_back
  20. #define vi vector <int>
  21. #define pii pair<int, int>
  22. using namespace std;
  23. const int N = 5010;
  24. int n,a[N],m;
  25. ll d[N],sum[N],cost[N];
  26. pair <ll,ll> line[N];
  27. int sz;
  28. long double x1,x2;
  29.  
  30. long double meet(pair <ll,ll> a, pair <ll,ll> b){
  31. return (a.s - b.s + 0.0) / (b.f - a.f);
  32. }
  33.  
  34. void add(pair <ll,ll > p){
  35. int k = sz;
  36. while (k >= 2 && (line[k-1].f - line[k].f) * (line[k].s - p.s) >= (line[k].s - line[k-1].s) * (p.f - line[k].f)) k--;
  37. line[++k] = p;
  38. sz = k;
  39. }
  40.  
  41. int main () {
  42. //freopen("out","w",stdout);
  43. scanf("%d%d",&n,&m);
  44. for(int i=1;i<=n;i++){
  45. scanf("%d",&a[i]);
  46. sum[i] = sum[i-1] + a[i];
  47. cost[i] = cost[i-1] + i * a[i];
  48.  
  49. }
  50. for(int i=1;i<=n;i++){
  51. d[i] = cost[i];
  52. add(mp(-i,d[i] - cost[i] + sum[i] * ( i)));
  53. }
  54. int k;
  55. for(int j=2;j<=m;j++){
  56. k = 1;
  57. for(int i=j;i<=n;i++){
  58. while(k < sz){
  59. x1 = meet(line[k],line[k+1]);
  60. if(x1 >= sum[i]) break;
  61. k++;
  62. }
  63. d[i] = line[k].f * sum[i] + line[k].s + cost[i];
  64. }
  65. sz = 0;
  66. for(int i=j;i<=n;i++){
  67. add(mp(-i,d[i] - cost[i] + sum[i] * (i)));
  68. }
  69. }
  70. cout << d[n];
  71.  
  72. return 0;
  73. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement