Advertisement
Guest User

Untitled

a guest
Nov 12th, 2019
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.22 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define asp ""
  4. #define aps ''
  5. #define one 1
  6. #define two 2
  7. #define dif !=
  8. using namespace std;
  9. const int maxn = 1e5 + 5;
  10. typedef long long ll;
  11. struct Node{
  12.  
  13. int cover = 0;
  14. int score = 0;
  15. };
  16.  
  17. struct line{
  18.  
  19. ll xa,ya;
  20. ll xb,yb;
  21. };
  22.  
  23. struct event{
  24.  
  25. ll x;
  26. int ya,yb;
  27. bool inp;
  28. };
  29.  
  30. vector<Node> tree(4*maxn);
  31.  
  32. // build o*(n*log n)
  33. void build(int pos,int i,int j){
  34.  
  35. int esq = two*pos;
  36. int dir = two*pos + one;
  37. int mid = (i+j)/two;
  38.  
  39. tree[pos].cover = 0;
  40. tree[pos].score = 0;
  41.  
  42. if(i == j) return ;
  43. build(esq,i,mid);
  44. build(dir,mid+one,j);
  45. }
  46.  
  47. int update(int pos,int i,int j,int l,int r,int op){
  48.  
  49. int esq = two*pos;
  50. int dir = two*pos + one;
  51. int mid = (i+j)/two;
  52. int score = 0;
  53.  
  54. if(i > r || j < l) return tree[pos].score;
  55. else if(i >= l && j <= r){
  56.  
  57. tree[pos].cover += op;
  58. if(tree[pos].cover == 0 && i dif j){
  59. tree[pos].score = tree[esq].score + tree[dir].score;
  60. }
  61. else if(tree[pos].cover == 0){
  62. tree[pos].score = 0;
  63. }
  64. else tree[pos].score = (j-i +one);
  65. }
  66. else{
  67. tree[pos].score = update(esq,i,mid,l,r,op);
  68. tree[pos].score += update(dir,mid+one,j,l,r,op);
  69.  
  70. if(tree[pos].cover > 0) tree[pos].score = (j-i + one);
  71. }
  72.  
  73. return tree[pos].score;
  74. }
  75.  
  76. vector<line> g;
  77. vector<event> lista;
  78. ll minx,miny,maxx,maxy;
  79.  
  80. bool comp(event a,event b){
  81.  
  82. return (a.x < b.x);
  83. }
  84.  
  85. void preProcess(int p){
  86. lista.clear();
  87. event aux;
  88.  
  89. for(int i=0;i<g.size();i++){
  90. if(g[i].xa == g[i].xb){
  91. // open event
  92. aux.x = max(minx,g[i].xa-p);
  93. aux.ya = max(g[i].ya-p,miny);
  94. aux.yb = min(g[i].yb+p,maxy);
  95. aux.inp = true;
  96. lista.push_back(aux);
  97. // close event
  98. aux.x = min(maxx,g[i].xa+p);
  99. aux.ya = max(g[i].ya-p,miny);
  100. aux.yb = min(g[i].yb+p,maxy);
  101. aux.inp = false;
  102. lista.push_back(aux);
  103. }
  104. else{
  105. // open event
  106. aux.x = max(g[i].xa-p,minx);
  107. aux.ya = max(miny,g[i].ya-p);
  108. aux.yb = min(maxy,g[i].yb+p);
  109. aux.inp = true;
  110. lista.push_back(aux);
  111. // close event
  112. aux.x = min(g[i].xb+p,maxx);
  113. aux.ya = max(miny,g[i].ya-p);
  114. aux.yb = min(maxy,g[i].yb+p);
  115. aux.inp = false;
  116. lista.push_back(aux);
  117. }
  118. }
  119.  
  120. sort(lista.begin(),lista.end(),comp);
  121. }
  122.  
  123. ll unionrect(int p){
  124.  
  125. preProcess(p);
  126. build(one,0,1e5);
  127.  
  128. ll last = minx;
  129. ll len = 0;
  130. ll ans = 0;
  131.  
  132. for(int i=0;i<lista.size();i++){
  133. ans += len * (lista[i].x - last);
  134. last = lista[i].x;
  135. if(lista[i].inp){
  136. len = update(one,0,1e5,lista[i].ya,lista[i].yb,one);
  137. }
  138. else{
  139. len = update(one,0,1e5,lista[i].ya,lista[i].yb,-one);
  140. }
  141. }
  142.  
  143. return ans;
  144. }
  145.  
  146. int solve(int n,ll area){
  147.  
  148. int s = 0;
  149. int e = 1e5;
  150. int p = (s+e)/two;
  151. ll at;
  152.  
  153. while(s < e){
  154.  
  155. at = unionrect(p);
  156. if(at >= area){
  157. e = p;
  158. p = (s+e)/two;
  159. }
  160. else{
  161. s = p+one;
  162. p = (s+e)/two;
  163. }
  164. }
  165.  
  166. return s;
  167. }
  168.  
  169. int main(){
  170.  
  171. ios::sync_with_stdio(0);
  172. cin.tie(0);
  173.  
  174. int n;
  175.  
  176. cin >> n;
  177.  
  178. line aux;
  179.  
  180. for(int i=0;i<n;i++){
  181. cin >> aux.xa >> aux.ya >> aux.xb >> aux.yb;
  182. g.push_back(aux);
  183. }
  184.  
  185. int Perc;
  186. cin >> Perc;
  187.  
  188. cin >> minx >> miny >> maxx >> maxy;
  189. ll area = (abs(minx - maxx)) * (abs(maxy - miny));
  190. area = (area * Perc + 99)/100;
  191. cout << solve(n,area) << endl;
  192. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement