hdu 5486 Difference of Clustering

来源:互联网 发布:java关键字 false 编辑:程序博客网 时间:2024/06/04 20:18
题意:

思路:
这题杭电的oj卡内存有点恶心,在杭电oj,vector不能乱用。。
看完题解这题感觉好简单的说。。。

首先把输入的值进行离散化,离散化完之后大概有1e5个左右。
然后用vector分l,r保存集合之间的连线。
split:左边的度数>1,对应左边的任意一个集合度数 = 1;
merge:换过来做,就变成了split了;
1:1:左右两边的度数都是1;

code:(sort、unique用的灰起)
#include <bits/stdc++.h>using namespace std;const int N = 1e6+5;const int M = 1e5+50;typedef long long LL;vector <int> l[M], r[M];int n;int h[N<<1];int x[N], y[N];void solve() {    sort(h, h+2*n);    int m = unique(h, h+2*n)-h;    for(int i = 0;i < m; i++)        l[i].clear(), r[i].clear();    for(int i = 0;i < n; i++) {        x[i] = lower_bound(h, h+m, x[i])-h;        y[i] = lower_bound(h, h+m, y[i])-h;        l[x[i]].push_back(y[i]);        r[y[i]].push_back(x[i]);    }    for(int i = 0;i < m; i++) {        sort(l[i].begin(), l[i].end());        l[i].erase(unique(l[i].begin(), l[i].end()), l[i].end());        sort(r[i].begin(), r[i].end());        r[i].erase(unique(r[i].begin(), r[i].end()), r[i].end());    }    int a, b, c;    a = b = c = 0;    for(int i = 0;i < m; i++) {        if(l[i].size() == 0) continue;        bool flag = true;        for(auto &it:l[i]) {            if(r[it].size() == 1 && r[it][0] == i) continue;            flag = false;            break;        }        if(flag) {            if(l[i].size() == 1) c++;            else a++;        }    }    for(int i = 0;i < m; i++) {        if(r[i].size() == 0) continue;        bool flag = true;        for(auto &it:r[i]) {            if(l[it].size() == 1 && l[it][0] == i) continue;            flag = false;            break;        }        if(flag) {            if(r[i].size() == 1) c++;            else b++;        }    }    printf("%d %d %d\n", a, b, c/2);}    int main() {    int T, cas = 0;    scanf("%d", &T);    while(T--) {        scanf("%d", &n);        for(int i = 0;i < n; i++) {            scanf("%d%d", &x[i], &y[i]);            h[i<<1] = x[i];            h[i<<1|1] = y[i];        }        printf("Case #%d: ", ++cas);        solve();    }    return 0;}


0 0