二维偏序关系 单个值传递
#include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) #define TS printf("!!!\n") #define pb push_back //std::ios::sync_with_stdio(false); using namespace std; //priority_queue<int,vector<int>,greater<int>> que; const double EPS = 1.0e-8; typedef pair<int, int> pairint; typedef long long ll; typedef unsigned long long ull; const int maxn = 1e5 + 100; const int maxm = 300; //next_permutation //priority_queue<int, vector<int>, greater<int>> que; int visit[maxn]; int anser[maxn]; int ans=0; //int counter[10000005]; vector<int> f[maxn]; struct node { int cf, num, tp; } person[maxn]; bool cmpcf(node a,node b) { return a.cf<b.cf; } bool cmptp(node a,node b) { return a.tp<b.tp; } bool cmpnum(node a,node b) { return a.num<b.num; } void dfs(int cur) { if(!visit[cur]) ans++,visit[cur]=1; int len=f[cur].size(); for(int i=0;i<len;i++) { int to=f[cur][i]; if(visit[to]) continue; dfs(to); } } int main() { int n; cin >> n ; for (int i = 1; i <= n; i++) { scanf("%d %d", &person[i].cf, &person[i].tp); //counter[person[i].cf]++; person[i].num = i; } person[n+1].num=n; sort(person+1,person+1+n,cmpcf); for(int i=1;i<=n-1;i++) { f[person[i+1].num].pb(person[i].num); } sort(person+1,person+1+n,cmptp); for(int i=1;i<=n-1;i++) { f[person[i+1].num].pb(person[i].num); } int now,to; for(int i=1;i<=n;i++) { now=person[i].num; //to=person[i+1].num; dfs(now); anser[now]=ans-1; } //sort(person+1,person+1+n,cmpnum) for(int i=1;i<=n;i++) cout<<anser[i]<<endl; // cin>>n>>m; // for(i=1;i<=n;i++) // { // cin>>num[i]; // update(i,num[i]); // } // for(i=1;i<=m;i++) // { // cin>>l>>r; // cout<<ask(l,r)<<endl; // } return 0; }