• C


    题目链接:

    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
    ",ans[i]);
    71     }
    72     return 0;
    73 }
  • 相关阅读:
    从程序员到主编顺利转型
    DAS、NAS、SAN区别
    网线知识全接触
    浅议DAS、NAS、SAN区别
    写辞职信要注意的五个要点
    劳动合同签订中的法律问题
    辞职了,离职手续怎么办?
    系统集成工程师知识储备
    还是关于 标记当前
    一个JSON 实例 jQuery 解析JSON数据
  • 原文地址:https://www.cnblogs.com/letlifestop/p/10653242.html
Copyright © 2020-2023  润新知