Submission #4463037


Source Code Expand

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define rep(i,n) for(int (i)=0;(i)<(int)(n);++(i))
#define all(x) (x).begin(),(x).end()
#define pb push_back
#define fi first
#define se second
#define dbg(x) cout<<#x" = "<<((x))<<endl
template<class T,class U> ostream& operator<<(ostream& o, const pair<T,U> &p){o<<"("<<p.fi<<","<<p.se<<")";return o;}
template<class T> ostream& operator<<(ostream& o, const vector<T> &v){o<<"[";for(T t:v){o<<t<<",";}o<<"]";return o;}

struct UF{
    int n;
    //正だったらその頂点の親,負だったら根で連結成分の個数
    vector<int> d;
    UF() {}
    UF(int N):n(N), d(N,-1){}
    int root(int v){
        if(d[v]<0) return v;
        return d[v]=root(d[v]);
    }
    bool unite(int X,int Y){
        X=root(X); Y=root(Y);
        if(X==Y) return false;
        if(size(X) < size(Y)) swap(X,Y);
        d[X]+=d[Y];
        d[Y]=X;
        return true;
    }
    int size(int v){ return -d[root(v)]; }
    bool same(int X,int Y){ return root(X)==root(Y); }
};

using P = pair<int,int>;
using E = pair<P,P>;

const int dx[4]={1,-1,0,0};
const int dy[4]={0,0,1,-1};

int main(){
    int n;
    cin >>n;

    set<P> points;
    set<E> edges;

    int v = 0;
    map<P,int> p2id;

    UF uf(4*n);

    rep(pp,n){
        int x,y;
        cin >>x >>y;
        vector<P> z;
        for(P d:vector<P>({{0,0},{1,0},{1,1},{0,1}})){
            z.pb({x+d.fi, y+d.se});
        }

        // dbg(v);
        rep(i,4){
            points.insert(z[i]);
            if(!p2id.count(z[i])){
                p2id[z[i]] = v;
                ++v;
            }
        }
        rep(i,4){
            P p = z[i], q = z[(i+1)%4];
            edges.insert({min(p,q),max(p,q)});
            uf.unite(p2id[p], p2id[q]);
        }
    }

    set<int> cc_idx;
    rep(i,v) cc_idx.insert(uf.root(i));
    int cc = cc_idx.size();

    int e = edges.size();
    int f = n+1;
    // v-e+(f+g) = 2
    int g = 2-v+e-f;
    cout << g + cc-1 << "\n";
    return 0;
}

Submission Info

Submission Time
Task I - Topology
User imulan
Language C++14 (GCC 5.4.1)
Score 100
Code Size 2100 Byte
Status AC
Exec Time 688 ms
Memory 75264 KB

Judge Result

Set Name All
Score / Max Score 100 / 100
Status
AC × 50
Set Name Test Cases
All 1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 2, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 3, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 4, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 5, 50, 6, 7, 8, 9
Case Name Status Exec Time Memory
1 AC 1 ms 256 KB
10 AC 2 ms 384 KB
11 AC 1 ms 256 KB
12 AC 1 ms 256 KB
13 AC 1 ms 256 KB
14 AC 632 ms 54144 KB
15 AC 675 ms 65536 KB
16 AC 688 ms 75264 KB
17 AC 621 ms 50048 KB
18 AC 410 ms 34048 KB
19 AC 412 ms 34048 KB
2 AC 1 ms 256 KB
20 AC 446 ms 35712 KB
21 AC 446 ms 35712 KB
22 AC 465 ms 39168 KB
23 AC 461 ms 37376 KB
24 AC 504 ms 39040 KB
25 AC 489 ms 39040 KB
26 AC 509 ms 40704 KB
27 AC 521 ms 40704 KB
28 AC 556 ms 42368 KB
29 AC 549 ms 42368 KB
3 AC 1 ms 256 KB
30 AC 525 ms 42496 KB
31 AC 530 ms 42368 KB
32 AC 523 ms 42368 KB
33 AC 13 ms 2176 KB
34 AC 26 ms 4352 KB
35 AC 55 ms 8448 KB
36 AC 114 ms 16512 KB
37 AC 71 ms 8832 KB
38 AC 1 ms 256 KB
39 AC 32 ms 4224 KB
4 AC 2 ms 256 KB
40 AC 95 ms 11264 KB
41 AC 23 ms 2816 KB
42 AC 29 ms 3456 KB
43 AC 37 ms 4352 KB
44 AC 10 ms 1408 KB
45 AC 69 ms 7552 KB
46 AC 14 ms 1664 KB
47 AC 94 ms 9984 KB
48 AC 95 ms 10240 KB
49 AC 14 ms 1792 KB
5 AC 3 ms 512 KB
50 AC 7 ms 1024 KB
6 AC 3 ms 512 KB
7 AC 1 ms 256 KB
8 AC 1 ms 256 KB
9 AC 2 ms 384 KB