Advertisement
Guest User

Untitled

a guest
Apr 5th, 2020
206
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.12 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define f first
  5. #define s second
  6. #define pb push_back
  7. #define FILL(a, b) memset(a, b, sizeof(a))
  8.  
  9. typedef long long int ll;
  10. typedef pair<int, int> pii;
  11. typedef pair<int, pii> piii;
  12. typedef vector<int> vi;
  13. typedef vector<pii> vii;
  14.  
  15. const int INF = 0x3f3f3f3f;
  16. const ll INFL = 0x3f3f3f3f3f3f3f3fLL;
  17. const int MOD = 1e9 + 7;
  18. const int MAX = 1e5 + 5;
  19.  
  20. ll gcd(ll a, ll b){return b == 0 ? a : gcd(b, a % b);}
  21. ll lcm(ll a, ll b){return a*b/gcd(a,b);}
  22. ll mul(ll a,ll b, ll M){if(b==0)return 0;ll t=mul(a,b/2,M);if(b&1)return (t+t+a)%M;return (t+t)%M;}
  23. ll fpow(ll a, ll b, ll M){if(b==0)return 1;ll t=fpow(a,b/2,M);if(b&1)return mul(mul(t,t,M),a,M)%M;return mul(t,t,M)%M;}
  24. ll divmod(ll i, ll j, ll mod){i%=mod,j%=mod;return i*fpow(j,mod-2,mod)%mod;}
  25.  
  26. vii p;
  27. int L[MAX], R[MAX];
  28. ll dp[MAX][2];
  29.  
  30. void go(int l, int r, int optl, int optr, int lvl) {
  31.     if(l > r) {
  32.         return;
  33.     }
  34.     int mid = (l+r)/2;
  35.     int opt = -1;
  36.     int cur = lvl&1, prev = !cur;
  37.     for(int i = optl; i <= min(optr, mid); i++) {
  38.         ll cst = dp[i-1][prev] + 1LL * (R[mid] - L[i]+1) * (R[mid]-L[i]+1) - (R[i-1]-L[i]+1 > 0 ? 1LL * (R[i-1]-L[i]+1) * (R[i-1] - L[i]+1) : 0LL);
  39.         if(cst < dp[mid][cur]) {
  40.             dp[mid][cur] = cst;
  41.             opt = i;
  42.         }
  43.     }
  44.     go(l, mid-1, optl, opt, lvl);
  45.     go(mid+1, r, opt, optr, lvl);
  46.     return;
  47. }
  48.  
  49. ll take_photos(int n, int m, int k, int* r, int* c) {
  50.     for(int i = 0; i < n; i++) {
  51.         p.pb({min(r[i], c[i]), -max(r[i], c[i])});
  52.     }
  53.     sort(p.begin(), p.end());
  54.     int idx = 1, max_val = -9999;
  55.     for(int i = 0; i < n; i++) {
  56.         if(-p[i].s > max_val) {
  57.             L[idx] = p[i].f;
  58.             R[idx] = -p[i].s;
  59.             max_val = -p[i].s;
  60.             idx++;
  61.         }
  62.     }
  63.     idx--;
  64.     R[0] = -1e9;
  65.     for(int i = 1; i <= idx; i++) {
  66.         dp[i][0] = 1e18;
  67.     }
  68.     for(int i = 1; i <= min(idx, k); i++) {
  69.         int cur = i&1;
  70.         for(int j = 1; j <= idx; j++) {
  71.             dp[j][cur] = 1e18;
  72.         }
  73.         go(1, idx, 1, idx, i);
  74.     }
  75.     return dp[idx][min(idx, k)&1];
  76. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement