Gym 101142C CodeCoder vs TopForces【思维+Dfs】

来源:互联网 发布:linux教程xwindows 编辑:程序博客网 时间:2024/05/22 15:13


题目大意:


如果A>B,并且B>C,那么有A>C,现在A>B的条件是,A的两个元素中的至少一个大于B。

问一个人可以打败多少人。


思路:

①问题其实就是在找一个联通块,我们将元素按照x从小到大排序一下,然后相邻的两个点建一条边。

②然后在将元素按照y从小到大排序一下,然后相邻的两个点再建一条边。

然后每个点Dfs一下统计即可。


Ac代码:

#include<stdio.h>#include<string.h>#include<vector>#include<algorithm>using namespace std;void fre() {    freopen("codecoder.in","r",stdin);    freopen("codecoder.out","w",stdout);}struct node{    int x,y,pos;}a[150000];int ans[150000];int vis[150000];vector<int>mp[150000];int n,cnt;int cmp(node a,node b){    return a.x<b.x;}int cmp2(node a,node b){    return a.y<b.y;}void Dfs(int u){    cnt++;    vis[u]=1;    for(int i=0;i<mp[u].size();i++)    {        int v=mp[u][i];        if(vis[v]==0)        {            Dfs(v);        }    }}int main(){    fre();    while(~scanf("%d",&n))    {        memset(vis,0,sizeof(vis));        for(int i=1;i<=n;i++)mp[i].clear();        for(int i=1;i<=n;i++)scanf("%d%d",&a[i].x,&a[i].y),a[i].pos=i;        sort(a+1,a+1+n,cmp);        for(int i=2;i<=n;i++) mp[a[i].pos].push_back(a[i-1].pos);        sort(a+1,a+1+n,cmp2);        for(int i=2;i<=n;i++) mp[a[i].pos].push_back(a[i-1].pos);        cnt=0;        for(int i=1;i<=n;i++)        {            if(vis[a[i].pos]==0)            {                Dfs(a[i].pos);            }            ans[a[i].pos]=cnt-1;        }        for(int i=1;i<=n;i++)printf("%d\n",ans[i]);    }}










原创粉丝点击