Submission #591562

#TimeUsernameProblemLanguageResultExecution timeMemory
591562LucppFountain Parks (IOI21_parks)C++17
70 / 100
732 ms99432 KiB
#include "parks.h"
#include <bits/stdc++.h>
using namespace std;

map<pair<int, int>, int> mp;
vector<bool> vis;
vector<int> dx = {-2, 2, 0, 0};
vector<int> dy = {0, 0, -2, 2};
vector<pair<int, int>> roads;

void dfs(int x, int y){
    int u = mp[make_pair(x, y)];
    for(int i = 0; i < 4; i++){
        int x2 = x+dx[i], y2 = y+dy[i];
        if(mp.count(make_pair(x2, y2))){
            int v = mp[make_pair(x2, y2)];
            if(!vis[v]){
                vis[v] = true;
                dfs(x2, y2);
                roads.emplace_back(u, v);
            }
        }
    }
}

pair<pair<int, int>, pair<int, int>> getBench(int x1, int y1, int x2, int y2){
    if(x1 == x2) return {{x1+1, (y1+y2)/2}, {x1-1, (y1+y2)/2}};
    else return {{(x1+x2)/2, y1+1}, {(x1+x2)/2, y1-1}};
}

vector<vector<int>> g;
vector<int> match;

bool find_path(int u){
    for(int v : g[u]){
        if(!vis[v]){
            vis[v] = true;
            if(match[v] == -1 || find_path(match[v])){
                match[v] = u;
                match[u] = v;
                return true;
            }
        }
    }
    return false;
}

int construct_roads(vector<int> x, vector<int> y) {
    if (x.size() == 1) {
	build({}, {}, {}, {});
        return 1;
    }
    int n = (int)x.size();
    for(int i = 0; i < n; i++){
        mp.emplace(make_pair(x[i], y[i]), i);
    }
    vis.resize(n);
    vis[0] = true;
    dfs(x[0], y[0]);
    for(int i = 0; i < n; i++){
        if(!vis[i]) return 0;
    }
    g.resize(n-1);
    vector<pair<int, int>> benches;
    map<pair<int, int>, int> ind;
    for(int i = 0; i < n-1; i++){
        int u = roads[i].first, v = roads[i].second;
        auto [a, b] = getBench(x[u], y[u], x[v], y[v]);
        if(!ind.count(a)){
            ind[a] = (int)benches.size();
            benches.push_back(a);
        }
        if(!ind.count(b)){
            ind[b] = (int)benches.size();
            benches.push_back(b);
        }
        g[i].push_back(ind[a]+n-1);
        g[i].push_back(ind[b]+n-1);
    }
    int m = n+(int)ind.size();
    match.assign(m, -1);
    int sz = 0;
    while(true){
        int old = sz;
        vis.assign(m, false);
        for(int u = 0; u < n-1; u++){
            if(match[u] == -1) sz += find_path(u);
        }
        if(sz == old) break;
    }
    assert(sz == n-1);

    vector<int> u, v, a, b;
    for(int i = 0; i < n-1; i++){
        u.push_back(roads[i].first);
        v.push_back(roads[i].second);
        a.push_back(benches[match[i]-n+1].first);
        b.push_back(benches[match[i]-n+1].second);
    }
    build(u, v, a, b);
    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...