hdu 5486 Difference of Clustering

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstring>
#include<vector>
#include<map>

using namespace std;
const int mx=1000000+1000;
typedef long long ll;
int T,n,deg[mx*2];
map<int,int> mp1,mp2;
vector<int> g[mx*2];
void init()
{
    mp1.clear();
    mp2.clear();
    for(int i=0;i<=n*2+1000;i++) g[i].clear();
}
int main()
{
    cin>>T;int kase=0;
    while(T--)
    {
        cin>>n;
        int nk=0,ok=0,od,nw;
        init();
        for(int i=0;i<n;i++)
        {
            scanf("%d%d",&od,&nw);
            if(mp1.count(od)==0) mp1[od]=ok++;
            if(mp2.count(nw)==0) mp2[nw]=nk++;
            od=mp1[od];nw=mp2[nw]+n+100;
            g[od].push_back(nw);
            g[nw].push_back(od);
        }
        for(int i=0;i<ok;i++)
        {
            sort(g[i].begin(),g[i].end());
            g[i].erase( unique(g[i].begin(), g[i].end() ), g[i].end()  ) ;
        }
         for(int ii=0;ii<nk;ii++)
        {
            int i=ii+n+100;
            sort(g[i].begin(),g[i].end());
            g[i].erase( unique(g[i].begin(), g[i].end() ), g[i].end()  ) ;
        }
        int ans1=0,ans2=0,ans3=0;
        for(int i=0;i<ok;i++)
        {
            if(g[i].size()==1)
            {
                int v=g[i][0];
                if(g[v].size()==1) ans3++;
            }
            else if(g[i].size()>1)
            {
                int cnt=0;
                for(int j=0;j<g[i].size();j++)
                {
                    int v=g[i][j];
                    if(g[v].size()==1) continue;
                    cnt++;
                }
                if(cnt==0)
                ans1++;
            }
        }
        for(int i=0;i<nk;i++)
        {
            int ii=i+n+100;
            if(g[ii].size()>1)
            {
                int cnt=0;
                for(int j=0;j<g[ii].size();j++)
                {
                    int v=g[ii][j];
                    if(g[v].size()==1) continue;
                    cnt++;
                }
                if(cnt==0)
                ans2++;
            }
        }
        printf("Case #%d: %d %d %d\n",++kase,ans1,ans2,ans3);
    }
    return 0;
}

此题本是水题,不过题意有些深奥,我到现在都不是很明白,看了别人的博客自己写了一下。

首先是离散然后建一个图,用个STL里的unique'去掉重边,最后统计一下便OK。

比赛的时候读了半天题完全没有搞懂,一群人问admin,啥也不hui,好坑,就差这一题就可以晋级了......

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值