Submission #814444

#TimeUsernameProblemLanguageResultExecution timeMemory
814444becaidoFountain Parks (IOI21_parks)C++17
0 / 100
3 ms4948 KiB
#pragma GCC optimize("O3,unroll-loops") #pragma GCC target("avx,popcnt,sse4,abm") #include <bits/stdc++.h> using namespace std; #ifndef WAIMAI #include "parks.h" #endif #ifdef WAIMAI #define debug(HEHE...) cout << "[" << #HEHE << "] : ", dout(HEHE) void dout() {cout << '\n';} template<typename T, typename...U> void dout(T t, U...u) {cout << t << (sizeof...(u) ? ", " : ""), dout(u...);} #else #define debug(...) 7122 #endif #define ll long long #define Waimai ios::sync_with_stdio(false), cin.tie(0) #define FOR(x,a,b) for (int x = a, I = b; x <= I; x++) #define pb emplace_back #define F first #define S second #ifdef WAIMAI void build(vector<int> u, vector<int> v, vector<int> a, vector<int> b); #endif const int dx[4] = {-1, 0, 0, 1}; const int dy[4] = {0, -1, 1, 0}; const int SIZE = 2e5 + 5; vector<int> adj[SIZE]; map<pair<int, int>, int> mp; int deg[SIZE], pa[SIZE]; queue<int> q; int construct_roads(vector<int> x, vector<int> y) { int n = x.size(); FOR (i, 0, n - 1) mp[{x[i], y[i]}] = i; FOR (i, 0, n - 1) FOR (j, 0, 3) { int tx = x[i] + 2 * dx[j]; int ty = y[i] + 2 * dy[j]; if (mp.count({tx, ty})) adj[i].pb(mp[{tx, ty}]); } q.push(0); fill(pa, pa + n, -1); while (q.size()) { int pos = q.front(); q.pop(); for (int np : adj[pos]) if (np != 0 && pa[np] == -1) { pa[np] = pos; deg[pos]++; q.push(np); } } FOR (i, 1, n - 1) if (pa[i] == -1) return 0; FOR (i, 0, n - 1) if (!deg[i]) q.push(i); vector<int> u, v, a, b; while (q.size()) { int pos = q.front(); q.pop(); if (pos == 0) break; u.pb(pos), v.pb(pa[pos]); if (--deg[pa[pos]] == 0) q.push(pa[pos]); } a.resize(n - 1), b.resize(n - 1); FOR (i, 0, n - 2) if (x[u[i]] == 2 && x[v[i]] == 2) { a[i] = x[u[i]] - 1; b[i] = y[u[i]]; } FOR (i, 0, n - 2) if (x[u[i]] == 6 && x[v[i]] == 6) { a[i] = x[u[i]] + 1; b[i] = y[u[i]]; } set<pair<int, int>> s; FOR (i, 0, n - 2) { int lx = min(x[u[i]], x[v[i]]), rx = max(x[u[i]], x[v[i]]); if (lx == 2 && rx == 4) { a[i] = 3, b[i] = y[u[i]] + 1; s.emplace(a[i], b[i]); } } FOR (i, 0, n - 2) if (x[u[i]] == 4 && x[v[i]] == 4) { a[i] = x[u[i]] - 1, b[i] = y[u[i]]; if (s.count({a[i], b[i]})) a[i] += 2; s.emplace(a[i], b[i]); } FOR (i, 0, n - 2) { int lx = min(x[u[i]], x[v[i]]), rx = max(x[u[i]], x[v[i]]); if (lx == 4 && rx == 6) { a[i] = 5, b[i] = y[u[i]] + 1; if (s.count({a[i], b[i]})) b[i] -= 2; s.emplace(a[i], b[i]); } } build(u, v, a, b); return 1; } /* in1 5 4 4 4 6 6 4 4 2 2 4 out1 1 4 0 2 5 5 0 1 3 5 3 0 5 3 4 0 3 3 in2 2 2 2 4 6 out2 0 */ #ifdef WAIMAI static void check(bool cond, string message) { if (!cond) { printf("%s\n", message.c_str()); fclose(stdout); exit(0); } } static int n; static bool build_called; static int m; static vector<int> _u, _v, _a, _b; void build(vector<int> u, vector<int> v, vector<int> a, vector<int> b) { check(!build_called, "build is called more than once"); build_called = true; m = u.size(); check(int(v.size()) == m, "u.size() != v.size()"); check(int(a.size()) == m, "u.size() != a.size()"); check(int(b.size()) == m, "u.size() != b.size()"); _u = u; _v = v; _a = a; _b = b; } int main() { assert(scanf("%d", &n) == 1); vector<int> x(n), y(n); for (int i = 0; i < n; i++) { assert(scanf("%d%d", &x[i], &y[i]) == 2); } fclose(stdin); build_called = false; const int possible = construct_roads(x, y); check(possible == 0 || possible == 1, "Invalid return value of construct_roads()"); if (possible == 1) { check(build_called, "construct_roads() returned 1 without calling build()"); } else { check(!build_called, "construct_roads() called build() but returned 0"); } printf("%d\n", possible); if (possible == 1) { printf("%d\n", m); for (int j = 0; j < m; j++) { printf("%d %d %d %d\n", _u[j], _v[j], _a[j], _b[j]); } } fclose(stdout); return 0; } #endif
#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...