Advertisement
tsypko

A

Jul 10th, 2021
494
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.55 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int n, k;
  5.  
  6. double sum[200007];
  7. double rev[200007];
  8. double pre[200007];
  9.  
  10. double inf;
  11.  
  12. double dpo[200007];
  13. double dpn[200007];
  14.  
  15. double x[200007];
  16. double y[200007];
  17.  
  18. int tsa, tsb, tss;
  19. vector <int> sta;
  20.  
  21. inline double vec(int s, int a, int b)
  22. {
  23.     return (x[a]-x[s])*(y[b]-y[s])-(x[b]-x[s])*(y[a]-y[s]);
  24. }
  25.  
  26. int main()
  27. {
  28.     inf=1000000000.0;
  29.     inf*=inf;
  30.     scanf("%d%d", &n, &k);
  31.     for (int i=1; i<=n; i++)
  32.     {
  33.         scanf("%lf", &sum[i]);
  34.         pre[i]=pre[i-1]+sum[i-1]/sum[i]+1.0;
  35.         rev[i]=1.0/sum[i]+rev[i-1];
  36.         sum[i]+=sum[i-1];
  37.     }
  38.     for (int i=1; i<=n; i++)
  39.     {
  40.         dpn[i]=pre[i];
  41.     }
  42.     for (int h=2; h<=k; h++)
  43.     {
  44.         for (int i=0; i<=n; i++)
  45.         {
  46.             dpo[i]=dpn[i];
  47.             dpn[i]=pre[i];
  48.  
  49.             x[i]=dpo[i]+rev[i]*sum[i]-pre[i];
  50.             y[i]=sum[i];
  51.         }
  52.         sta.clear();
  53.         for (int i=1; i<=n; i++)
  54.         {
  55.             while(sta.size()>1 && vec(sta[sta.size()-2], sta[sta.size()-1], i-1)>=0)
  56.             sta.pop_back();
  57.             sta.push_back(i-1);
  58.             tsa=0;
  59.             tsb=sta.size()-1;
  60.             while(tsa<tsb)
  61.             {
  62.                 tss=(tsa+tsb)>>1;
  63.                 if (1*x[sta[tss]]-rev[i]*y[sta[tss]]<1*x[sta[tss+1]]-rev[i]*y[sta[tss+1]])
  64.                 tsb=tss;
  65.                 else
  66.                 tsa=tss+1;
  67.             }
  68.             dpn[i]+=1*x[sta[tsa]]-rev[i]*y[sta[tsa]];
  69.         }
  70.     }
  71.     printf("%.10lf\n", dpn[n]);
  72.     return 0;
  73. }
  74.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement