YEZAELP

TOI14: plantation (Line Sweep)

Jul 30th, 2021 (edited)
245
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.85 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. using db = double;
  5. using pi = pair <int, int>;
  6. const db INF = (db) 2e9;
  7.  
  8. db Distance(int x1, int y1, int x2, int y2){
  9.     db dx = abs(x1 - x2) * 1.0;
  10.     db dy = abs(y1 - y2) * 1.0;
  11.     return (db) sqrt( dx * dx + dy * dy );
  12. }
  13.  
  14. int Index(int x, int l, int r, vector <int> &coor, int mn = INF){
  15.     while(l <= r){
  16.         int mid = (l + r) / 2;
  17.         if(coor[mid] >= x)
  18.             r = mid - 1, mn = min(mn, mid);
  19.         else
  20.             l = mid + 1;
  21.     }
  22.     return mn;
  23. }
  24.  
  25. void Solve(){
  26.  
  27.     int n; scanf("%d", &n);
  28.     db r, d; scanf("%lf%lf", &r, &d);
  29.  
  30.     pi XY[n + 10];
  31.     vector <int> coor;
  32.     for(int i=1;i<=n;i++){
  33.         int x, y;
  34.         scanf("%d%d", &x, &y);
  35.         XY[i] = {x, y};
  36.         coor.push_back(x);
  37.     }
  38.  
  39.     sort(XY + 1, XY + n + 1);
  40.     sort(coor.begin(), coor.end());
  41.     coor.resize( unique(coor.begin(), coor.end()) - coor.begin() );
  42.     int sz_coor = coor.size();
  43.  
  44.     vector <int> event[sz_coor + 10];
  45.     for(int i=1;i<=n;i++){
  46.         int x = XY[i].first, y = XY[i].second;
  47.         int idx = Index(x, 0, sz_coor - 1, coor);
  48.         event[idx].push_back(y);
  49.     }
  50.  
  51.     db closest = INF;
  52.  
  53.     int sz_cur = 0, sz_pre = 0;
  54.     for(int i=0;i<sz_coor;i++){
  55.         sz_cur = event[i].size();
  56.         for(int j=0;j<sz_cur;j++){
  57.             if(j > 0) closest = min(closest, (db) (event[i][j] - event[i][j-1]) );
  58.             if(i == 0) continue;
  59.             int idx_pre = Index(coor[i] - closest, 0, i - 1, coor);
  60.             if(idx_pre == INF) continue;
  61.             for(int k=idx_pre;k<i;k++){
  62.                 {
  63.                     int mn = INF, l = 0, r = sz_pre - 1;
  64.                     while(l <= r){
  65.                         int mid = (l + r) / 2;
  66.                         if(event[k][mid] >= event[i][j])
  67.                             r = mid - 1, mn = min(mn, mid);
  68.                         else
  69.                             l = mid + 1;
  70.                     }
  71.                     if(mn != INF) closest = min(closest, Distance(coor[k], event[k][mn], coor[i], event[i][j]) );
  72.                 }
  73.                 {
  74.                     int mx = -INF, l = 0, r = sz_pre - 1;
  75.                     while(l <= r){
  76.                         int mid = (l + r) / 2;
  77.                         if(event[k][mid] <= event[i][j])
  78.                             l = mid + 1, mx = max(mx, mid);
  79.                         else
  80.                             r = mid - 1;
  81.                     }
  82.                     if(mx != -INF) closest = min(closest, Distance(coor[k], event[k][mx], coor[i], event[i][j]));
  83.                 }
  84.             }
  85.         }
  86.         sz_pre = sz_cur;
  87.     }
  88.  
  89.     if(closest - 2.0 * r >= d) printf("Y");
  90.     else printf("N");
  91. }
  92.  
  93. int main(){
  94.  
  95.     int Q;
  96.     scanf("%d", &Q);
  97.  
  98.     while(Q --){
  99.         Solve();
  100.         printf("\n");
  101.     }
  102.  
  103.     return 0;
  104. }
Add Comment
Please, Sign In to add comment