C - CodeCoder vs TopForces Gym - 101142C (连通块+思维)
题目链接:
C - CodeCoder vs TopForces
题目大意:给你n个人的信息,每一个人的信息包括两个。t1和t2.A>B的前提是A的t1和t2至少有一个是大于B的t1和t2的。还要注意有一种情况当A>B,B>C的时候,A也是大于C的(虽然有可能A和C直接比,有可能A是小于C的)。
打个比方:
A 4 10
B 3 13
C 5 12
这个时候A是大于B的,但是A是小于C的,但是B是大于C的,所以就可以认为A是大于C的。
具体思路:首先按照x进行排序,建图,保证当前的点连向的边是比他大的。然后按照y来排序,同样建图的时候保证当前的点连向的边是比他大的。然后从第一个点开始,看一下当前的点能连向哪些边,那么这些点肯定是比他大的。当前的点找完之后,下一个点可以直接累加上上一个点找到的答案,因为下一个点肯定大于第一个点。
AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 # define ll long long 4 # define inf 0x3f3f3f3f 5 const int maxn = 2e5+100; 6 struct node 7 { 8 int x,y; 9 int id; 10 node() 11 { 12 x=0,y=0,id=0; 13 } 14 } q[maxn]; 15 vector<int>edge[maxn]; 16 int vis[maxn]; 17 bool cmp1(node t1,node t2) 18 { 19 return t1.x<t2.x; 20 } 21 bool cmp2(node t1,node t2) 22 { 23 return t1.y<t2.y; 24 } 25 int cnt=0; 26 int ans[maxn]; 27 void dfs(int u) 28 { 29 cnt++; 30 vis[u]=1; 31 for(int i=0; i<edge[u].size(); i++) 32 { 33 if(vis[edge[u][i]]) 34 continue; 35 dfs(edge[u][i]); 36 } 37 } 38 int main() 39 { 40 freopen("codecoder.in","r",stdin); 41 freopen("codecoder.out","w",stdout); 42 int n; 43 scanf("%d",&n); 44 int l,r; 45 for(int i=1; i<=n; i++) 46 { 47 scanf("%d %d",&q[i].x,&q[i].y); 48 q[i].id=i; 49 } 50 sort(q+1,q+n+1,cmp1); 51 for(int i=2; i<=n; i++) 52 { 53 edge[q[i].id].push_back(q[i-1].id); 54 } 55 sort(q+1,q+n+1,cmp2); 56 for(int i=2; i<=n; i++) 57 { 58 edge[q[i].id].push_back(q[i-1].id); 59 } 60 for(int i=1; i<=n; i++) 61 { 62 if(!vis[q[i].id]) 63 { 64 dfs(q[i].id); 65 } 66 ans[q[i].id]=cnt-1; 67 } 68 for(int i=1; i<=n; i++) 69 { 70 printf("%d\n",ans[i]); 71 } 72 return 0; 73 }