Advertisement
Manioc

i

Sep 17th, 2019
227
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.38 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define MAX 100007
  3. #define int long long
  4.  
  5. using namespace std;
  6. typedef long long ll;
  7. typedef pair<ll, ll> pii;
  8. typedef pair<pii, pii> piii;
  9. int seg[4*MAX], acum[4*MAX], menor[4*MAX];
  10.  
  11. void build(int id, int l,int r){
  12.     if(l == r) { seg[id] = 1; menor[id] = 0; }
  13.     else{
  14.         int mid = (l+r)/2;
  15.         build(2*id, l, mid);
  16.         build(2*id+1, mid+1, r);
  17.        
  18.         seg[id] = seg[2*id] + seg[2*id+1];
  19.     }
  20. }
  21. void add(int id, int l, int r, int val){
  22.     menor[id] += val;
  23.     acum[id] += val;
  24. }
  25.  
  26. void update(int id, int l, int r, int x, int y, int val){
  27.     if(l > y || r < x) return;
  28.     else if(x <= l && r <= y) add(id, l, r, val);
  29.     else {
  30.         int mid = (l+r)/2;
  31.         add(2*id, l, mid, acum[id]);
  32.         add(2*id+1, mid+1, r, acum[id]);
  33.         acum[id] = 0;
  34.  
  35.         update(2*id, l, mid, x, y, val);
  36.         update(2*id+1, mid+1, r, x, y, val);
  37.  
  38.         menor[id] = min(menor[2*id], menor[2*id+1]);
  39.         seg[id] = (menor[2*id] == menor[id])? seg[2*id]: 0;
  40.         seg[id] += (menor[2*id+1] == menor[id])? seg[2*id+1]: 0;
  41.     }
  42. }
  43.  
  44. pii query(int id, int l, int r, int x, int y){
  45.     if(l > y || r < x) return {MAX, 0};
  46.     else if(x <= l && r <= y) return {menor[id], seg[id]};
  47.     else {
  48.         int mid = (l+r)/2;
  49.         add(2*id, l, mid, acum[id]);
  50.         add(2*id+1, mid+1, r, acum[id]);
  51.         acum[id] = 0;
  52.  
  53.         pii esq = query(2*id, l, mid, x, y) ;
  54.         pii dir = query(2*id+1, mid+1, r, x, y);
  55.         if(esq.first == dir.first) return {esq.first, esq.second + dir.second};
  56.         else if(esq.first < dir.first) return esq;
  57.         else return dir;
  58.     }
  59. }
  60.  
  61. struct reta{
  62.     int x1, x2, y1, y2;
  63.     int deli;
  64.  
  65.     reta(): x1(0), y1(0), x2(0), y2(0) {}
  66. };
  67.  
  68. reta retas[MAX], cent;
  69. int n;
  70. ll area;
  71. int solve(int r){
  72.     vector<piii> q;
  73.     for(int i = 0; i < n; i++) {
  74.         reta actual = retas[i];
  75.         piii a = { {max(actual.x1-r, cent.x1), 0}, {max(actual.y1-r, cent.y1), min(actual.y2+r, cent.y2)}};
  76.         piii b = { {min(actual.x2+r, cent.x2), 1}, {max(actual.y1-r, cent.y1), min(actual.y2+r, cent.y2)}};
  77.         q.push_back(a);
  78.         q.push_back(b);
  79.     }
  80.     sort(q.begin(), q.end());
  81.  
  82.     int last = q[0].first.first;
  83.     ll ans = 0;
  84.     for(int i = 0; i < q.size(); i++){
  85.         piii actual = q[i];
  86.         pii aux = query(1, 0, MAX, cent.y1, cent.y2-1);
  87.         ll non = aux.first == 0? aux.second: 0;
  88.         ans += (actual.first.first-last)*((cent.y2-cent.y1)-non);
  89.         if(actual.first.second == 1) { update(1, 0, MAX, actual.second.first, actual.second.second-1, -1); }
  90.         else update(1, 0, MAX, actual.second.first, actual.second.second-1, 1);
  91.         last = actual.first.first;
  92.     }
  93.     return ans*100LL;
  94. }
  95.  
  96. int leftmost(int val, int l, int r){
  97.     if(l == r) return l;
  98.  
  99.     int mid = (l+r)/2;
  100.     ll actual = solve(mid);
  101.     if( actual < val) return leftmost(val, mid+1, r);
  102.     else return leftmost(val, l, mid);
  103. }
  104. int32_t main(){
  105.     build(1, 0, MAX);
  106.     scanf("%lld", &n);
  107.     for(int i = 0; i < n; i++) scanf("%lld %lld %lld %lld", &retas[i].x1, &retas[i].y1, &retas[i].x2, &retas[i].y2);
  108.     ll v; scanf("%lld", &v);
  109.     scanf("%lld %lld %lld %lld", &cent.x1, &cent.y1, &cent.x2, &cent.y2);
  110.     area = (cent.x2-cent.x1)*(cent.y2-cent.y1);
  111.     v = area*v;
  112.     ll ans = leftmost(v, 0, MAX);
  113.     printf("%lld\n", ans);
  114.     return 0;
  115. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement