2016-2017 ACM-ICPC, NEERC, Northern Subregional Contest
题意:每个人有2种排名, 对于A只要有一种排名高于B, 那么A就能赢B, 再如果B能赢C, 那么A也能赢C, 问每个人分别能赢多少个人
tags: 按一种排序后搜索。
#include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b; i>=a; --i) #define mes(a,b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f #define MP make_pair #define PB push_back #define fi first #define se second typedef long long ll; const int N = 200005; struct Node { int id, cc, tf; } p[N]; bool cmp_cc(Node a, Node b) { return a.cc < b.cc; } bool cmp_tf(Node a, Node b) { return a.tf < b.tf; } int n, ans[N], sum; vector< int > G[N]; bool vis[N]; void dfs(int u) { vis[u] = true; ++sum; for(auto to : G[u]) if(!vis[to]) { dfs(to); } } int main() { freopen("codecoder.in","r",stdin); freopen("codecoder.out","w",stdout); scanf("%d", &n); rep(i,1,n) { scanf("%d%d", &p[i].cc, &p[i].tf); p[i].id = i; } sort(p+1, p+1+n, cmp_cc); rep(i,2,n) G[p[i].id].PB(p[i-1].id); sort(p+1, p+1+n, cmp_tf); rep(i,2,n) G[p[i].id].PB(p[i-1].id); rep(i,1,n) { if(!vis[p[i].id]) dfs(p[i].id); ans[p[i].id] = sum-1; } rep(i,1,n) printf("%d ", ans[i]); return 0; }