C - CodeCoder vs TopForces Gym - 101142C (连通块+思维)

题目链接:

C - CodeCoder vs TopForces

 Gym - 101142C 

题目大意:给你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 }

 

posted @ 2019-04-04 09:58  Let_Life_Stop  阅读(264)  评论(0编辑  收藏  举报