bingxuan9112

三維最近點對?

Mar 21st, 2020
293
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.55 KB | None | 0 0
  1. //   __________________
  2. //  | ________________ |
  3. //  ||          ____  ||
  4. //  ||   /\    |      ||
  5. //  ||  /__\   |      ||
  6. //  || /    \  |____  ||
  7. //  ||________________||
  8. //  |__________________|
  9. //  \###################\
  10. //   \###################\
  11. //    \        ____       \
  12. //     \_______\___\_______\
  13. // An AC a day keeps the doctor away.
  14.  
  15. #pragma g++ optimize("Ofast")
  16. #pragma loop_opt(on)
  17. #include <bits/extc++.h>
  18. #ifdef local
  19. #define debug(x) (cerr<<#x<<" = "<<(x)<<'\n')
  20. #else
  21. #include <bits/stdc++.h>
  22. #define debug(x) ((void)0)
  23. #endif // local
  24. #define all(v) begin(v),end(v)
  25. #define siz(v) (ll(v.size()))
  26. #define get_pos(v,x) (lower_bound(all(v),x)-begin(v))
  27. #define sort_uni(v) sort(begin(v),end(v)),v.erase(unique(begin(v),end(v)),end(v))
  28. #define pb emplace_back
  29. #define ff first
  30. #define ss second
  31. #define mem(v,x) memset(v,x,sizeof v)
  32.  
  33. using namespace std;
  34. using namespace __gnu_pbds;
  35. typedef int64_t ll;
  36. typedef long double ld;
  37. typedef pair<ll,ll> pll;
  38. typedef pair<ld,ld> pld;
  39. template <typename T> using max_heap = std::priority_queue<T,vector<T>,less<T> >;
  40. template <typename T> using min_heap = std::priority_queue<T,vector<T>,greater<T> >;
  41. template <typename T> using rbt = tree<T,null_type,less<T>,rb_tree_tag,tree_order_statistics_node_update>;
  42. constexpr ld PI = acos(-1), eps = 1e-5;
  43. constexpr ll N = 125, INF = 1e18, MOD = 1000000007, K = 26, inf = 1e9;
  44. constexpr inline ll cdiv(ll x, ll m) { return x/m + ((x<0 ^ m>0) && (x%m)); } // ceiling divide
  45. constexpr inline ll modpow(ll e,ll p,ll m=MOD) {ll r=1; for(e%=m;p;p>>=1,e=e*e%m) if(p&1) r=r*e%m; return r;}
  46.  
  47. struct pt {
  48.     int x,y,z,i;
  49.     friend bool operator<(const pt &a, const pt &b) {
  50.         return a.z!=b.z ? a.z<b.z : a.i<b.i;
  51.     }
  52. };
  53. signed main() {
  54.     ios_base::sync_with_stdio(0), cin.tie(0);
  55.     int n;
  56.     cin >> n;
  57.     vector<pt> p(n);
  58.     int cnt=0;
  59.     for(auto &[x, y, z, i]: p) cin >> x >> y >> z, i=++cnt;
  60.     sort(p.begin(), p.end(), [](pt &a, pt &b){
  61.         return a.x!=b.x ? a.x<b.x : a.i < b.i;
  62.     });
  63.     auto mag2 = [](pt a, pt b) -> long long {
  64.         auto [xa, ya, za, ia] = a;
  65.         auto [xb, yb, zb, ib] = b;
  66.         return 1LL*(xa-xb)*(xa-xb) + 1LL*(ya-yb)*(ya-yb) + 1LL*(za-zb)*(za-zb);
  67.     };
  68.     pt x=p[0], y=p[1];
  69.     function<void(int,int)> solve = [&](int l, int r) {
  70.         if(l+1 == r) return;
  71.         int m = l+(r-l)/2;
  72.         solve(l, m), solve(m, r);
  73.         vector<pt> tmp(r-l);
  74.         merge(p.begin()+l, p.begin()+m, p.begin()+m, p.begin()+r, tmp.begin(),
  75.             [](pt &a, pt &b){
  76.                 return a.y!=b.y ? a.y<b.y : a.i<b.i;
  77.             });
  78.         set<pt> s;
  79.         long double best = sqrt(mag2(x,y));
  80.         for(int i = 0, j = 0; i < r-l; i++) {
  81.             //if(tmp[i].z)
  82.             auto [it, succ] = s.insert(tmp[i]);
  83.             while(tmp[j].y < tmp[i].y - best) s.erase(tmp[j++]);
  84.             for(auto lit = it; ++lit != s.end(); ) {
  85.                 if(lit->z > tmp[i].z + best) break;
  86.                 if(mag2(*lit, tmp[i]) < mag2(x,y))
  87.                     x=*lit, y=tmp[i];
  88.             }
  89.             for(auto rit = it; rit-- != s.begin(); ) {
  90.                 if(rit->z < tmp[i].z - best) break;
  91.                 if(mag2(*rit, tmp[i]) < mag2(x,y))
  92.                     x=*rit, y=tmp[i];
  93.             }
  94.         }
  95.         for(int i = l; i < r; i++) p[i] = tmp[i-l];
  96.     };
  97.     solve(0, n);
  98.     int a = x.i, b = y.i;
  99.     if(a > b) swap(a,b);
  100.     cout << "WARNING: galaxy" << a << " and galaxy" << b << " in ";
  101.     cout << fixed << setprecision(10) << sqrt(mag2(x,y)) << " Uu\n";
  102. }
Advertisement
Add Comment
Please, Sign In to add comment