Advertisement
Guest User

Untitled

a guest
Jun 20th, 2019
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.12 KB | None | 0 0
  1. #include "aliens.h"
  2. #include <vector>
  3. #include <algorithm>
  4. #include <stack>
  5. #include <cstdio>
  6. #include <cstring>
  7.  
  8. #define X first
  9. #define Y second
  10. #define PB push_back
  11.  
  12. using namespace std;
  13.  
  14. typedef long long ll;
  15. typedef pair < int , int > pii;
  16. typedef vector < int > vi;
  17. typedef pair < ll, ll > pt;
  18.  
  19. const int N = 1e5 + 500;
  20.  
  21. const ll INF = 1e13;
  22.  
  23. bool cmp(pii A, pii B){
  24.     if(A.Y == B.Y) return A.X > B.X;
  25.     return A.Y < B.Y;
  26. }
  27.  
  28. int x[N], y[N], cnt[N], n, k, cur = 0;
  29. vector < pii > v;
  30. ll pref[N], dp[N], mst = -1;
  31. pt toc[N];
  32. vector < int > hl;
  33.  
  34. ll cost(int l,int r){
  35.     return (ll)(x[l] - y[r]) * (x[l] - y[r]) - (pref[r] - pref[l] + (ll)(y[l] - x[l]) * (y[l] - x[l]));
  36. }
  37.  
  38. ll ccw(pt A, pt B, pt C){
  39.     return (A.X) * (B.Y - C.Y) + B.X * (C.Y - A.Y) + C.X * (A.Y - B.Y);
  40. }
  41.  
  42. void add(int X){
  43.     for(;hl.size() >= 2 && ccw(toc[hl[hl.size() - 1]], toc[hl[hl.size() - 2]], toc[X]) <= 0;)
  44.         hl.pop_back();
  45.     hl.PB(X);
  46.     cur = min(cur, (int)hl.size() - 1);
  47. }
  48.  
  49. ll get(int i, ll x){
  50.     return toc[hl[i]].X * x + toc[hl[i]].Y;
  51. }
  52.  
  53. /**
  54.  
  55. ll f(int i,int c){
  56.     if(i == n) return (c > k) * INF;
  57.     if(dp[i][c] != -1) return dp[i][c];
  58.     ll ret = INF;
  59.     for(int j = i;j < n;j++){
  60.         ret = min(ret, f(j + 1, c + 1) + cost(i, j));
  61.     }
  62.     return dp[i][c] = ret;
  63. }
  64.  
  65. **/
  66.  
  67. ll f(ll cst,int fl = 0){
  68.     hl.clear(); cur = 0;
  69.     toc[n] = {-2 * x[0], -(ll)y[0] * y[0] + 2LL * x[0] * y[0]}; cnt[n] = 0;
  70.     add(n);
  71.     for(int i = 0;i < n;i++){
  72.         while(cur + 1 < hl.size() && get(cur, y[i]) > get(cur + 1, y[i]))
  73.             cur++;
  74.         dp[i] = get(cur, y[i]) + (ll)y[i] * y[i] - pref[i] + cst;
  75.         cnt[i] = cnt[hl[cur]] + 1;
  76.         toc[i] = {-2 * x[i + 1], dp[i] - (ll)y[i + 1] * y[i + 1] + 2LL * x[i + 1] * y[i + 1] + pref[i + 1]};
  77.         add(i);
  78.     }
  79.     if(fl) {
  80.         //printf("%lld %lld CNT %d K %d\n", dp[n - 1] - (ll)k * cst, cst, cnt[n - 1], k);
  81.         //return max(dp[n - 1] - (ll)k * cst, 0LL);
  82.         return dp[n - 1] - (ll)k * cst;
  83.     }
  84.     if(cnt[n - 1] == k) mst = cst;
  85.     return cnt[n - 1] < k;
  86. }
  87.  
  88. ll take_photos(int nn, int m, int kk, vi r, vi cc) {
  89.     k = kk; n = nn;
  90.     for(int i = 0;i < n;i++){
  91.         if(r[i] > cc[i]) swap(r[i], cc[i]);
  92.         v.PB({r[i], cc[i] + 1});
  93.     }  
  94.     sort(v.begin(), v.end(), cmp);
  95.     stack < int > st;
  96.     for(int i = 0;i < n;i++){
  97.         //printf("{%d %d}\n", v[i].X, v[i].Y);
  98.         for(;!st.empty() && v[st.top()].X >= v[i].X; st.pop());
  99.         st.push(i);
  100.         //printf("PUSH %d SZ %d\n", i, (int)st.size());
  101.     }
  102.     n = st.size();int c = st.size() - 1;
  103.     k = min(k, n);
  104.     //printf("NEW N %d\n", n);
  105.     for(; c >= 0; c--, st.pop())
  106.         x[c] = v[st.top()].X, y[c] = v[st.top()].Y;
  107.     for(int i = 1;i < n;i++){
  108.         pref[i] = pref[i - 1];
  109.         if(y[i - 1] > x[i])
  110.             pref[i] -= (ll)(x[i] - y[i - 1]) * (x[i] - y[i - 1]);
  111.         pref[i] += (ll)(x[i] - y[i]) * (x[i] - y[i]);
  112.     }
  113.     ll bs = pref[n - 1] + (ll)(x[0] - y[0]) * (x[0] - y[0]);
  114.     ll sol = INF;
  115.     ll lo_cst = 0, hi_cst = INF;
  116.     //printf("%lld\n:", bs);
  117.     for(int i = 0;i < 65;i++){
  118.         //break;
  119.         ll mid = (lo_cst + hi_cst) / 2;
  120.         if(!f(mid))
  121.             lo_cst = mid + 1;
  122.         else
  123.             hi_cst = mid;
  124.     }
  125.     if(mst != -1)
  126.         return f(mst , 1) + bs;
  127.     return f(lo_cst  , 1) + bs;
  128. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement