Submission #617644

#TimeUsernameProblemLanguageResultExecution timeMemory
617644happypotatoFountain Parks (IOI21_parks)C++17
15 / 100
481 ms41564 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; 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] >= 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 = true; } 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...