Submission #603679

#TimeUsernameProblemLanguageResultExecution timeMemory
603679SifferFountain Parks (IOI21_parks)C++17
45 / 100
429 ms54640 KiB
#include "parks.h"
#include<bits/stdc++.h>
using namespace std;

typedef pair<int,int> ii;
typedef pair<ii,int> iii;

#define F first
#define S second

int xx[] = {0,0,1,-1};
int yy[] = {1,-1,0,0};

vector<vector<int>> g;
vector<bool> vis;
int c = 0;

void search(int i) {
    vis[i] = 1; c++;
    for(auto x: g[i]) if(!vis[x]) search(x);
}

int construct_roads(std::vector<int> x, std::vector<int> y) {
    int n = x.size();
    vis.resize(n,0);
    g.resize(n);
    vector<iii> p;
    for(int i = 0; i < n; i++) p.push_back({{x[i],y[i]},i});
    sort(p.begin(),p.end());
    vector<ii> roads;
    map<ii,int> rr;
    for(int i = 0; i < n-1; i++) {
        if(p[i].F.F == p[i+1].F.F && p[i+1].F.S-p[i].F.S == 2) {
            ii a = {p[i].F.F, p[i].F.S+1};
            rr[a] = roads.size();
            roads.emplace_back(p[i].S, p[i+1].S);
            g[p[i].S].push_back(p[i+1].S);
            g[p[i+1].S].push_back(p[i].S);
        }
    }
    for(int i = 0; i < n; i++) swap(p[i].F.F,p[i].F.S);
    sort(p.begin(),p.end());
    for(int i = 0; i < n; i++) swap(p[i].F.F,p[i].F.S);
    for(int i = 0; i < n-1; i++) {
        if(p[i].F.S == p[i+1].F.S && p[i+1].F.F-p[i].F.F == 2) {
            ii a = {p[i].F.F+1,p[i].F.S};
            rr[a] = roads.size();
            roads.emplace_back(p[i].S, p[i+1].S);
            g[p[i].S].push_back(p[i+1].S);
            g[p[i+1].S].push_back(p[i].S);
        }
    }
    int m = roads.size();
    search(0);
    if(c < n) return 0;
    vector<ii> b;
    vector<int> rb(m,-1);
    for(auto x: rr) {
        if(rb[x.S] == -1) {
            rb[x.S] = b.size();
            int f = x.S;
            ii a;
            if(x.F.F%2) a = {x.F.F, x.F.S+1};
            else a = {x.F.F+1, x.F.S};
            b.push_back(a);
            //cout << a.F << " " << a.S << endl;
            bool bb = true;
            while(bb) {
                bb = false;
                for(int i = 0; i < 4; i++) {
                    ii po = {a.F+xx[i], a.S+yy[i]};
                    if(rr.count(po) && rr[po] != f) {
                        f = rr[po];
                        if(rb[f] >= 0) break;
                        bb = true;
                        a = {po.F+xx[i], po.S+yy[i]};
                        //cout << a.F << " " << a.S << endl;
                        rb[f] = b.size();
                        b.push_back(a);
                        break;
                    }
                }
            }
        }
    }
    vector<int> u(m), v(m), ba(m), bb(m);
    for(int i = 0; i < m; i++) {
        u[i] = roads[i].F; v[i] = roads[i].S;
        ba[i] = b[rb[i]].F; bb[i] = b[rb[i]].S;
    }
    build(u, v, ba, bb);
    //for(auto x: rr) cout << x.F.F << " " << x.F.S << endl;
    return 1;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...