求助:12和17TLE

P7883 平面最近点对(加强加强版)

然而改了一点莫名奇妙的又过了 ```cpp #include <iostream> #include <iomanip> #include <cstdio> #include <cstring> #include <string> #include <cstdlib> #include <cmath> #include <stack> #include <queue> #include <vector> #include <map> #include <set> #include<bitset> #include<list> #include <algorithm> #define pii pair<int,int> #define pll pair<LL,LL> #define pil pair<int,LL> #define pli pair<LL,int> #define pdd pair<db,db> #define se second #define fi first #define endl '\n' #define rep(i,a,b) for (register int i=a;i<b;++i) #define per(i,a,b) for (register int i=a;i>b;--i) #define MEM(a,x) memset(a,x,sizeof(a)) #define M(x) ((x)%MOD) #define all(x) (x).begin(),(x).end() #define db double #define eps 1e-9 typedef long long LL; typedef unsigned long long ULL; using namespace std; const int MOD=9901; const int N=4e5+10; pii p[N]; LL ans=1e18; int n; inline LL dist(int i,int j) { return 1ll*(p[i].fi-p[j].fi)*(p[i].fi-p[j].fi)+1ll*(p[i].se-p[j].se)*(p[i].se-p[j].se); } inline bool cmp(int a,int b) { return p[a].se<p[b].se; } inline void cal(int l,int r) { if(l>=r) return; int m=l+r>>1; cal(l,m),cal(m+1,r); vector<int>v; rep(i,l,r+1) if(1ll*(p[m].fi-p[i].fi)*(p[m].fi-p[i].fi)<ans) v.push_back(i); sort(all(v),cmp); rep(i,0,v.size()){ rep(j,i+1,v.size()){ if(1ll*(p[v[i]].se-p[v[j]].se)*(p[v[i]].se-p[v[j]].se)>=ans) break; ans=min(ans,dist(v[i],v[j])); } } } inline void solve() { cin>>n; rep(i,0,n) cin>>p[i].fi>>p[i].se; sort(p,p+n); cal(0,n-1); cout<<ans; } int main() { ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); int _=1; //cin>>_; while(_--){ solve(); } return 0; } ```
by wild_pointer @ 2023-01-16 01:39:12


|