Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define MAX 100007
- #define int long long
- using namespace std;
- typedef long long ll;
- typedef pair<ll, ll> pii;
- typedef pair<pii, pii> piii;
- int seg[4*MAX], acum[4*MAX], menor[4*MAX];
- void build(int id, int l,int r){
- if(l == r) { seg[id] = 1; menor[id] = 0; }
- else{
- int mid = (l+r)/2;
- build(2*id, l, mid);
- build(2*id+1, mid+1, r);
- seg[id] = seg[2*id] + seg[2*id+1];
- }
- }
- void add(int id, int l, int r, int val){
- menor[id] += val;
- acum[id] += val;
- }
- void update(int id, int l, int r, int x, int y, int val){
- if(l > y || r < x) return;
- else if(x <= l && r <= y) add(id, l, r, val);
- else {
- int mid = (l+r)/2;
- add(2*id, l, mid, acum[id]);
- add(2*id+1, mid+1, r, acum[id]);
- acum[id] = 0;
- update(2*id, l, mid, x, y, val);
- update(2*id+1, mid+1, r, x, y, val);
- menor[id] = min(menor[2*id], menor[2*id+1]);
- seg[id] = (menor[2*id] == menor[id])? seg[2*id]: 0;
- seg[id] += (menor[2*id+1] == menor[id])? seg[2*id+1]: 0;
- }
- }
- pii query(int id, int l, int r, int x, int y){
- if(l > y || r < x) return {MAX, 0};
- else if(x <= l && r <= y) return {menor[id], seg[id]};
- else {
- int mid = (l+r)/2;
- add(2*id, l, mid, acum[id]);
- add(2*id+1, mid+1, r, acum[id]);
- acum[id] = 0;
- pii esq = query(2*id, l, mid, x, y) ;
- pii dir = query(2*id+1, mid+1, r, x, y);
- if(esq.first == dir.first) return {esq.first, esq.second + dir.second};
- else if(esq.first < dir.first) return esq;
- else return dir;
- }
- }
- struct reta{
- int x1, x2, y1, y2;
- int deli;
- reta(): x1(0), y1(0), x2(0), y2(0) {}
- };
- reta retas[MAX], cent;
- int n;
- ll area;
- int solve(int r){
- vector<piii> q;
- for(int i = 0; i < n; i++) {
- reta actual = retas[i];
- piii a = { {max(actual.x1-r, cent.x1), 0}, {max(actual.y1-r, cent.y1), min(actual.y2+r, cent.y2)}};
- piii b = { {min(actual.x2+r, cent.x2), 1}, {max(actual.y1-r, cent.y1), min(actual.y2+r, cent.y2)}};
- q.push_back(a);
- q.push_back(b);
- }
- sort(q.begin(), q.end());
- int last = q[0].first.first;
- ll ans = 0;
- for(int i = 0; i < q.size(); i++){
- piii actual = q[i];
- pii aux = query(1, 0, MAX, cent.y1, cent.y2-1);
- ll non = aux.first == 0? aux.second: 0;
- ans += (actual.first.first-last)*((cent.y2-cent.y1)-non);
- if(actual.first.second == 1) { update(1, 0, MAX, actual.second.first, actual.second.second-1, -1); }
- else update(1, 0, MAX, actual.second.first, actual.second.second-1, 1);
- last = actual.first.first;
- }
- return ans*100LL;
- }
- int leftmost(int val, int l, int r){
- if(l == r) return l;
- int mid = (l+r)/2;
- ll actual = solve(mid);
- if( actual < val) return leftmost(val, mid+1, r);
- else return leftmost(val, l, mid);
- }
- int32_t main(){
- build(1, 0, MAX);
- scanf("%lld", &n);
- for(int i = 0; i < n; i++) scanf("%lld %lld %lld %lld", &retas[i].x1, &retas[i].y1, &retas[i].x2, &retas[i].y2);
- ll v; scanf("%lld", &v);
- scanf("%lld %lld %lld %lld", ¢.x1, ¢.y1, ¢.x2, ¢.y2);
- area = (cent.x2-cent.x1)*(cent.y2-cent.y1);
- v = area*v;
- ll ans = leftmost(v, 0, MAX);
- printf("%lld\n", ans);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement