1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
| --- title: 1850G-The-Morning-Star categories: - codeforces题解 tags: - null date: 2025-03-05 11:48:05 --- 我们都知道,想要找到同x或者同y的点的数量易如反掌。
那么,同对角线的那?
其实也很简单,找x+y || x-y的值是相同的点的数量就行 ```cpp // Problem: G. The Morning Star // Contest: Codeforces - Codeforces Round 886 (Div. 4) // URL: https://codeforces.com/problemset/problem/1850/G // Memory Limit: 256 MB // Time Limit: 2000 ms // by znzryb // // Powered by CP Editor (https://cpeditor.org)
#include <bits/stdc++.h> #define FOR(i, a, b) for (long long i = (a); i <= (b); ++i) #define ROF(i, a, b) for (long long i = (a); i >= (b); --i) #define all(x) x.begin(),x.end() #define CLR(i,a) memset(i,a,sizeof(i)) #define fi first #define se second #define pb push_back #define SZ(a) ((int) a.size())
using namespace std;
typedef long long ll; typedef unsigned long long ull; typedef pair<ll,ll> pll; typedef array<ll,3> arr; typedef double DB; typedef pair<DB,DB> pdd; constexpr ll MAXN=static_cast<ll>(2e5)+10,INF=static_cast<ll>(1e18)+3;
ll N,M,T; pll xy[MAXN]; bool cmpy(const pll &a,const pll &b){ if(a.se!=b.se) return a.se<b.se; return a.fi<b.fi; } bool cmpxPy(const pll &a,const pll &b){ if(a.fi+a.se!=b.fi+b.se) return a.fi+a.se<b.fi+b.se; return a.fi<b.fi; } bool cmpxMy(const pll &a,const pll &b){ if(a.fi-a.se!=b.fi-b.se) return a.fi-a.se<b.fi-b.se; return a.fi<b.fi; } inline void solve(){ cin>>N; for(int i=1;i<=N;++i){ cin>>xy[i].fi>>xy[i].se; } sort(xy+1,xy+1+N); ll ans=0; for(int i=1;i<=N;++i){ pll uppConst={xy[i].fi,INF},lowConst={xy[i].fi,-INF}; ans+=upper_bound(xy+1,xy+1+N,uppConst)-lower_bound(xy+1,xy+1+N,lowConst)-1; } // #ifdef LOCAL // cerr << ans << '\n'; // #endif sort(xy+1,xy+1+N,cmpy); for(int i=1;i<=N;++i){ pll uppConst={INF,xy[i].se},lowConst={-INF,xy[i].se}; ans+=upper_bound(xy+1,xy+1+N,uppConst,cmpy)-lower_bound(xy+1,xy+1+N,lowConst,cmpy)-1; } // #ifdef LOCAL // cerr << ans << '\n'; // #endif // 同y和同x的匹配完了,同对角线的怎么统计? // 哈哈,其实和上面的一样的思路,同一对角线,x-y||x+y的值是一样的 sort(xy+1,xy+1+N,cmpxPy); for(int i=1;i<=N;++i){ ll aPb=xy[i].fi+xy[i].se; pll uppConst={INF,aPb-INF},lowConst={-INF,aPb+INF}; ans+=upper_bound(xy+1,xy+1+N,uppConst,cmpxPy)-lower_bound(xy+1,xy+1+N,lowConst,cmpxPy)-1; } // #ifdef LOCAL // cerr << ans << '\n'; // #endif sort(xy+1,xy+1+N,cmpxMy); for(int i=1;i<=N;++i){ ll aMb=xy[i].fi-xy[i].se; pll uppConst={INF,-aMb+INF},lowConst={-INF,-aMb-INF}; ans+=upper_bound(xy+1,xy+1+N,uppConst,cmpxMy)-lower_bound(xy+1,xy+1+N,lowConst,cmpxMy)-1; } cout<<ans<<"\n"; }
int main() { ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); cin>>T; while(T--){ solve(); } return 0; } /* AC https://codeforces.com/problemset/submission/1850/309011870 */
|