Submission #617670

#TimeUsernameProblemLanguageResultExecution timeMemory
617670happypotatoFountain Parks (IOI21_parks)C++17
30 / 100
579 ms41592 KiB
#include "parks.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define pii pair<int, int>
#define ff first
#define ss second
const int mxN = 2e5 + 1;
const int dx[mxN] = {0, 1, 0, -1}, dy[mxN] = {1, 0, -1, 0};
bool vis[mxN];
pair<pii, int> pts[mxN];
pii opts[mxN];
map<pii, int> allpts;
int n;
bool CheckConnected() {
    queue<pii> q;
    set<pii> track;
    q.push(pts[0].ff);
    track.insert(pts[0].ff);
    while (!q.empty()) {
        pii cur = q.front();
        q.pop();
        for (int k = 0; k < 4; k++) {
            int nx = cur.ff + dx[k] * 2;
            int ny = cur.ss + dy[k] * 2;
            if (allpts.find({nx, ny}) != allpts.end() && track.find({nx, ny}) == track.end()) {
                q.push({nx, ny});
                track.insert({nx, ny});
            }
        }
    }
    return (int(track.size()) == n);
}
bool sortx(pair<pii, int> a, pair<pii, int> b) {
    if (a.ff.ss != b.ff.ss) return a.ff.ss < b.ff.ss;
    return a.ff.ff < b.ff.ff;
}
bool sorty(pair<pii, int> a, pair<pii, int> b) {
    if (a.ff.ff != b.ff.ff) return a.ff.ff < b.ff.ff;
    return a.ff.ss < b.ff.ss;
}
void st3() {
    int arr[3][mxN + 10];
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < mxN + 10; j++) {
            arr[i][j] = -1;
        }
    }
    for (int i = 0; i < n; i++) {
        arr[(pts[i].ff.ff >> 1) - 1][pts[i].ff.ss] = pts[i].ss;
    }
    bool con01 = false, con12 = false;
    bool notfix = false;
    vector<int> u, v, a, b;
    for (int i = 0; i < mxN + 6; i += 2) {
        // if (i <= 10) cout << arr[0][i] << ' ' << arr[1][i] << ' ' << arr[2][i] << endl;
        if (arr[0][i] >= 0 && arr[0][i + 2] >= 0) {
            u.pb(arr[0][i]); v.pb(arr[0][i + 2]);
            a.pb(1); b.pb(i + 1);
        }
        if (arr[2][i] >= 0 && arr[2][i + 2] >= 0) {
            u.pb(arr[2][i]); v.pb(arr[2][i + 2]);
            a.pb(7); b.pb(i + 1);
        }
        bool special = false;
        if (notfix) {
            u.pb(arr[0][i]); v.pb(arr[1][i]);
            a.pb(3); b.pb(i + 1);
            special = true;
            notfix = false;
        }
        bool usemid = false;
        if (!(arr[1][i + 2] >= 0 && arr[2][i + 2] >= 0 && !con12)) special = true;
        if (arr[1][i] >= 0 && arr[1][i + 2] >= 0) {
            u.pb(arr[1][i]); v.pb(arr[1][i + 2]);
            a.pb((special ? 5 : 3)); b.pb(i + 1);
            usemid = !special;
        }
        if (arr[0][i + 2] >= 0 && arr[1][i + 2] >= 0 && !con01) {
            if (!usemid) {
                u.pb(arr[0][i + 2]); v.pb(arr[1][i + 2]);
                a.pb(3); b.pb(i + 1);
            } else notfix = true;
            con01 = true;
        } else con01 = false;
        if (arr[1][i + 2] >= 0 && arr[2][i + 2] >= 0 && !con12) {
            u.pb(arr[1][i + 2]); v.pb(arr[2][i + 2]);
            a.pb(5); b.pb(i + 1);
            con12 = true;
        } else con12 = false;
    }
    build(u, v, a, b);
    return;
}
int construct_roads(vector<int> ox, vector<int> oy) {
    n = ox.size();
    int maxx = 0;
    for (int i = 0; i < n; i++) {
        pts[i] = {{ox[i], oy[i]}, i};
        opts[i] = pts[i].ff;
        allpts[pts[i].ff] = i;
        maxx = max(maxx, pts[i].ff.ff);
    }
    // for (int i = 0; i < n; i++) {
    //     cout << pts[i].ff.ff << ' ' << pts[i].ff.ss << ' ' << pts[i].ss << endl;
    // }
    if (!CheckConnected()) return 0;
    if (maxx <= 6) st3();
    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...