Submission #617548

#TimeUsernameProblemLanguageResultExecution timeMemory
617548happypotatoFountain Parks (IOI21_parks)C++17
15 / 100
497 ms37000 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 cmp(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; } void st12() { vector<pii> edge; vis[pts[0].ss] = true; for (int i = 0; i < n; i++) { if (allpts.find({pts[i].ff.ff, pts[i].ff.ss + 2}) != allpts.end()) { int v = allpts[{pts[i].ff.ff, pts[i].ff.ss + 2}]; if (!vis[v]) { edge.pb({pts[i].ss, v}); vis[v] = true; } } if (pts[i].ff.ff == 4 && allpts.find({2, pts[i].ff.ss}) != allpts.end()) { int v = allpts[{2, pts[i].ff.ss}]; if (!vis[pts[i].ss] || !vis[v]) { edge.pb({pts[i].ss, v}); vis[pts[i].ss] = true; vis[v] = true; } } } int m = edge.size(); vector<int> u(m), v(m), a(m), b(m); for (int i = 0; i < m; i++) { u[i] = edge[i].ff; v[i] = edge[i].ss; if (opts[u[i]].ff == opts[v[i]].ff) { a[i] = (opts[u[i]].ff == 2 ? 1 : 5); b[i] = ((opts[u[i]].ss + opts[v[i]].ss) >> 1); } else { a[i] = 3; b[i] = opts[u[i]].ss - 1; } } build(u, v, a, b); return; } void st3() { } int construct_roads(vector<int> ox, vector<int> oy) { n = ox.size(); int minx = 1e9; for (int i = 0; i < n; i++) { pts[i] = {{ox[i], oy[i]}, i}; opts[i] = pts[i].ff; allpts[pts[i].ff] = i; minx = min(minx, pts[i].ff.ff); } sort(pts, pts + n, cmp); // 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 (minx == 2 || minx == 4) st12(); else if (minx == 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...