Dang_Quan_10_Tin

Untitled

Jul 14th, 2020
207
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.68 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <cstdio>
  4. #define task "CWALKWAY"
  5. using namespace std;
  6. using ll = long long;
  7. using ld = long double;
  8.  
  9. template<class T>
  10. void read(T &x){
  11.     register int c;
  12.     x = 0;
  13.     while((c = getchar()) && c < '0' || c > '9');
  14.     for(; c >= '0' && c <= '9'; c = getchar())
  15.         x = x * 10 + c - '0';
  16. }
  17.  
  18. const int N = 1e6 + 2;
  19. int n;
  20. ll c, a[N];
  21.  
  22. void Read(){
  23.     read(n); read(c);
  24.     for(int i = 1; i <= n; ++i)
  25.         read(a[i]);
  26. }
  27.  
  28. vector<int> line;
  29. vector<ld> point;
  30. ll dp[N];
  31. const ll Inf = 1e15 + 7;
  32. int last = 0;
  33.  
  34. ll bp(ll v){
  35.     return v * v;
  36. }
  37.  
  38. ld f(int i, int j){
  39.     return (ld) 1.0 * (dp[i - 1] + bp(a[i]) - dp[j - 1] - bp(a[j])) / (-2ll * a[j] + 2ll * a[i]);
  40. }
  41.  
  42. void Solve(){
  43.     line.push_back(1);
  44.     point.push_back(-Inf);
  45.     dp[1] = c;
  46.     dp[0] = 0;
  47.     for(int i = 2; i <= n; ++i){
  48.         while(last < point.size() && point[last] < a[i])
  49.             ++last;
  50.         --last;
  51.         dp[i] = c + dp[i - 1];
  52.         dp[i] = min(dp[i], c + bp(a[i]) + bp(a[line[last]]) + dp[line[last] - 1] - 2ll * (a[line[last]]) * a[i]);
  53.         while(line.size() > 1){
  54.             if( (a[i] == a[line.back()] && dp[i - 1] < dp[line.back() - 1]) ||
  55.                 (a[i] != a[line.back()] && f(i, line[line.size() - 1]) <= f(i, line[line.size() - 2])))
  56.             {
  57.                 line.pop_back();
  58.                 point.pop_back();
  59.                 continue;
  60.             }
  61.             break;
  62.         }
  63.         last = min(last, (int)point.size() - 1);
  64.         if(a[i] != a[line.back()] || dp[i - 1] < dp[line.back() - 1]){
  65.             point.push_back(f(i, line.back()));
  66.             line.push_back(i);
  67.         }
  68.     }
  69.     cout << dp[n];
  70. }
  71.  
  72. main(){
  73.     ios::sync_with_stdio(0);
  74.     cin.tie(0);
  75.     cout.tie(0); if(fopen(task".INP", "r"))
  76.     freopen(task".INP", "r", stdin),
  77.     freopen(task".OUT", "w", stdout);
  78.     Read();
  79.     Solve();
  80. }
Advertisement
Add Comment
Please, Sign In to add comment