Advertisement
Guest User

Untitled

a guest
May 22nd, 2017
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.21 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define pub push_back
  4. #define ll long long
  5. #define mp make_pair
  6. #define x first
  7. #define y second
  8. #define all(a) a.begin(), a.end()
  9.  
  10. using namespace std;
  11.  
  12. #include "aliens.h"
  13.  
  14. const ll LINF = (ll)1e18 + 7;
  15. const int INF = (int)1e9 + 7;
  16.  
  17. int h[1000007];
  18. double dp[100007];
  19. int p[100007];
  20. vector<int> q, ss;
  21. int n, m, k;
  22.  
  23. double getCross(double k1, double b1, double k2, double b2){
  24.     return (double)(b2 - b1) / (double)(k1 - k2);
  25. }
  26.  
  27. ll getDP(double cost){
  28.     for (int i = 0; i < 100007; i++) dp[i] = LINF, p[i] = -1;
  29.  
  30.     vector<pair<pair<double, int>, pair<double, double> > > w;
  31.  
  32.     int uk = 0;
  33.  
  34.     w.pub(mp(mp(0, -1), mp(-2 * (ll)h[q[0]], (ll)h[q[0]] * (ll)h[q[0]])));
  35.  
  36.     for (int j = 0; j < q.size(); j++){
  37.         while(uk + 1 < w.size() && w[uk + 1].x.x <= (q[j] + 1)) uk++;
  38.         dp[j] = (double)(q[j] + 1) * w[uk].y.x + w[uk].y.y + (double)(q[j] + 1) * (double)(q[j] + 1) + cost;
  39.         p[j] = w[uk].x.y;
  40.  
  41.         if (j == (int)q.size() - 1) continue;
  42.         double kk = -2 * (double)h[q[j + 1]];
  43.         double bb = dp[j] - max(0, q[j] - h[q[j + 1]] + 1) * (double)max(0, q[j] - h[q[j + 1]] + 1) + h[q[j + 1]] * (double)h[q[j + 1]];
  44.         while(w.size()){
  45.             double xx = getCross(kk, bb, w.back().y.x, w.back().y.y);
  46.             if (xx > w.back().x.x){
  47.                 w.pub(mp(mp(xx, j), mp(kk, bb)));
  48.                 break;
  49.             } else w.pop_back();
  50.         }
  51.         if (w.size() == 0) w.pub(mp(mp(0, j), mp(kk, bb)));
  52.     }
  53.     int ans = 0;
  54.     int v = (int)q.size() - 1;
  55.     while(1){
  56.         if (v == -1) break;
  57.         v = p[v];
  58.         ans++;
  59.     }
  60.     return ans;
  61. }
  62.  
  63. long long take_photos(int N, int M, int K, vector<int> x, vector<int> y) {
  64.     n = N, m = M, k = K;
  65.     for (int i = 0; i < n; i++){
  66.         x[i]++, y[i]++;
  67.     }
  68.     for (int i = 0; i <= m; i++) h[i] = INF;
  69.     for (int i = 0; i < n; i++){
  70.         h[max(x[i], y[i])] = min(h[max(x[i], y[i])], min(x[i], y[i]));
  71.         ss.pub(max(x[i], y[i]));
  72.     }
  73.     sort(all(ss));
  74.     ss.resize(unique(ss.begin(), ss.end()) - ss.begin());
  75.     for (int x : ss){
  76.         while(q.size() && h[q.back()] >= h[x]) q.pop_back();
  77.         q.pub(x);
  78.     }
  79.  
  80.     double l = 0, r = (double)1e18;
  81.     for (int i = 0; i < 100; i++){
  82.         ll mm = (l + r) / (ll)2;
  83.         if (getDP(mm) > k)
  84.             l = mm;
  85.         else
  86.             r = mm;
  87.     }
  88.     getDP(r);
  89.  
  90.     return dp[(int)q.size() - 1] - (double)getDP(r) * r;
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement