# | Submission time | Handle | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
417573 | 2021-06-04T01:15:35 Z | flappybird | Simurgh (IOI17_simurgh) | C++14 | 1048 ms | 4704 KB |
#include "simurgh.h" #include <bits/stdc++.h> using namespace std; typedef int ll; #define MAX 1010 #define MAXS 10 ll N, M; ll sp[MAX][MAXS]; ll depth[MAX]; vector<ll> adj[MAX], tree[MAX], back[MAX], ans[MAX]; vector<ll> query; vector<ll> U, V; ll vis[MAX]; bool ck[MAX]; ll isroyal[MAX]; ll treeres; ll leaf[MAX]; ll adj2[MAX][MAX]; vector<ll> leafv; void dfs(ll x = 0, ll p = -1, ll d = 0) { sp[x][0] = p; depth[x] = d; ll i; vis[x] = 1; for (i = 1; i < MAXS; i++) sp[x][i] = sp[sp[x][i - 1]][i - 1]; for (auto v : adj[x]) if (!vis[v]) dfs(v, x, d + 1); } //{a, b}={c, d}인지 체크 bool chk(ll a, ll b, ll c, ll d) { if (a > b) swap(a, b); if (c > d) swap(c, d); return a == c && b == d; } ll getline(ll u, ll v) { ll i; for (i = 0; i < M; i++) if (chk(u, v, U[i], V[i])) return i; return -1; } ll getline(ll i) { return getline(U[i], V[i]); } ll lca(ll u, ll v) { if (depth[u] != depth[v]) { if (depth[u] < depth[v]) swap(u, v); ll i; for (i = MAXS - 1; i >= 0; i--) if (depth[sp[u][i]] >= depth[v]) u = sp[u][i]; } if (u == v) return u; ll i; for (i = MAXS - 1; i >= 0; i--) if (sp[u][i] != sp[v][i]) u = sp[u][i], v = sp[v][i]; return sp[v][0]; } ll dis(ll u, ll v) { return depth[u] + depth[v] - 2 * depth[lca(u, v)]; } void erase(vector<ll>& v, ll a) { ll i; for (i = 0; i < v.size(); i++) if (v[i] == a) break; v.erase((v.begin() + i)); } void getleaf(ll x = 0, ll p = -1) { ll c = 0; for (auto v : tree[x]) { if (v == p) continue; c = 1; getleaf(v, x); } if (!c) leaf[x] = 1, leafv.push_back(x); } ll p(ll r, ll x) { if (lca(r, x) == x) { for (auto v : adj[x]) { if (lca(v, r) == v && lca(x, v) == x) return v; } } else return sp[x][0]; } ll a(ll i) { if (sp[U[i]][0] == V[i]) return U[i]; else return V[i]; } //v is parent std::vector<int> find_roads(int n, std::vector<int> u, std::vector<int> v) { N = n, M = u.size(); ll i; for (i = 0; i < M; i++) adj[u[i]].push_back(v[i]), adj[v[i]].push_back(u[i]); dfs(); for (i = 0; i < M; i++) { if (lca(u[i], v[i]) == u[i]) swap(u[i], v[i]); if (sp[u[i]][0] == v[i]) tree[u[i]].push_back(v[i]), tree[v[i]].push_back(u[i]); else back[u[i]].push_back(v[i]), back[v[i]].push_back(u[i]); } U = u, V = v; for (i = 0; i < N; i++) { for (auto v : tree[i]) { if (i < v) query.push_back(getline(i, v)); } } treeres = count_common_roads(query); getleaf(); ll k, m; for (k = 0; k < N; k++) isroyal[k] = -1; for (k = 0; k < N; k++) { for (m = 0; m < back[k].size(); k++) { ll v1 = k, v2 = back[k][m]; ll l = lca(v1, v2); ll x = -1; for (i = v1; i != l; i = sp[i][0]) { if (isroyal[i] != -1) { x = i; break; } } for (i = v2; i != l; i = sp[i][0]) { if (isroyal[i] != -1) { x = i; break; } } if (x != -1) { query.push_back(getline(v1, v2)); erase(query, getline(x, sp[x][0])); ll r0 = treeres - count_common_roads(query) - isroyal[x]; query.push_back(getline(x, sp[x][0])); for (i = v1; i != l; i = sp[i][0]) { erase(query, getline(i, sp[i][0])); ll res = treeres - count_common_roads(query); if (res != r0) isroyal[i] = 1; else isroyal[i] = 0; query.push_back(getline(i, sp[i][0])); } for (i = v2; i != l; i = sp[i][0]) { erase(query, getline(i, sp[i][0])); ll res = treeres - count_common_roads(query); if (res != r0) isroyal[i] = 1; else isroyal[i] = 0; query.push_back(getline(i, sp[i][0])); } erase(query, getline(v1, v2)); } else { query.push_back(getline(v1, v2)); map<ll, ll> mp; for (ll j = v1; (j != l); j = sp[j][0]) { ll e = getline(j, sp[j][0]); erase(query, e); ll res = count_common_roads(query) - treeres; mp[j] = res; query.push_back(e); } for (ll j = v2; (j != l); j = sp[j][0]) { ll e = getline(j, sp[j][0]); erase(query, e); ll res = count_common_roads(query) - treeres; mp[j] = res; query.push_back(e); } erase(query, getline(v1, v2)); set<ll> st; for (ll j = v1; (j != l); j = sp[j][0]) st.insert(mp[j]); for (ll j = v2; (j != l); j = sp[j][0]) st.insert(mp[j]); if (st.size() == 1) { if (*st.begin() >= 0) { for (ll j = v1; (j != l); j = sp[j][0]) isroyal[j] = 0; for (ll j = v2; (j != l); j = sp[j][0]) isroyal[j] = 0; } else { for (ll j = v1; (j != l); j = sp[j][0]) isroyal[j] = 1; for (ll j = v2; (j != l); j = sp[j][0]) isroyal[j] = 1; } } else { if (*st.begin() == -1) { for (ll j = v1; (j != l); j = sp[j][0]) isroyal[j] = -mp[j]; for (ll j = v2; (j != l); j = sp[j][0]) isroyal[j] = -mp[j]; } else { for (ll j = v1; (j != l); j = sp[j][0]) isroyal[j] = 1 - mp[j]; for (ll j = v2; (j != l); j = sp[j][0]) isroyal[j] = 1 - mp[j]; } } } } } vector<ll> ans; for (i = 0; i < N; i++) { for (auto x : adj[i]) { if (p(i, x) == i) continue; if (adj2[x][i]) continue; erase(query, getline(x, p(i, x))); ll e = getline(i, x); query.push_back(e); ll res = count_common_roads(query) + isroyal[a(getline(x, p(i, x)))] - treeres; query.push_back(getline(x, p(i, x))); erase(query, e); adj2[i][x] = adj2[x][i] = 1; if (res == 1) ans.push_back(e); } } for (i = 1; i < N; i++) if (isroyal[i]) ans.push_back(getline(i, sp[i][0])); return ans; }
Compilation message
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
1 | Correct | 1 ms | 332 KB | correct |
2 | Correct | 1 ms | 332 KB | correct |
3 | Correct | 1 ms | 332 KB | correct |
4 | Correct | 1 ms | 332 KB | correct |
5 | Correct | 1 ms | 332 KB | correct |
6 | Correct | 1 ms | 332 KB | correct |
7 | Correct | 1 ms | 332 KB | correct |
8 | Correct | 1 ms | 332 KB | correct |
9 | Correct | 1 ms | 332 KB | correct |
10 | Correct | 1 ms | 332 KB | correct |
11 | Correct | 1 ms | 332 KB | correct |
12 | Correct | 1 ms | 332 KB | correct |
13 | Correct | 1 ms | 332 KB | correct |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
1 | Correct | 1 ms | 332 KB | correct |
2 | Correct | 1 ms | 332 KB | correct |
3 | Correct | 1 ms | 332 KB | correct |
4 | Correct | 1 ms | 332 KB | correct |
5 | Correct | 1 ms | 332 KB | correct |
6 | Correct | 1 ms | 332 KB | correct |
7 | Correct | 1 ms | 332 KB | correct |
8 | Correct | 1 ms | 332 KB | correct |
9 | Correct | 1 ms | 332 KB | correct |
10 | Correct | 1 ms | 332 KB | correct |
11 | Correct | 1 ms | 332 KB | correct |
12 | Correct | 1 ms | 332 KB | correct |
13 | Correct | 1 ms | 332 KB | correct |
14 | Correct | 10 ms | 684 KB | correct |
15 | Correct | 9 ms | 680 KB | correct |
16 | Correct | 11 ms | 680 KB | correct |
17 | Correct | 8 ms | 588 KB | correct |
18 | Correct | 3 ms | 588 KB | correct |
19 | Correct | 8 ms | 672 KB | correct |
20 | Correct | 7 ms | 676 KB | correct |
21 | Correct | 7 ms | 672 KB | correct |
22 | Correct | 5 ms | 588 KB | correct |
23 | Correct | 4 ms | 588 KB | correct |
24 | Correct | 4 ms | 528 KB | correct |
25 | Correct | 1 ms | 588 KB | correct |
26 | Correct | 4 ms | 588 KB | correct |
27 | Correct | 4 ms | 524 KB | correct |
28 | Correct | 2 ms | 588 KB | correct |
29 | Correct | 1 ms | 588 KB | correct |
30 | Correct | 5 ms | 588 KB | correct |
31 | Correct | 5 ms | 588 KB | correct |
32 | Correct | 5 ms | 588 KB | correct |
33 | Correct | 5 ms | 588 KB | correct |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
1 | Correct | 1 ms | 332 KB | correct |
2 | Correct | 1 ms | 332 KB | correct |
3 | Correct | 1 ms | 332 KB | correct |
4 | Correct | 1 ms | 332 KB | correct |
5 | Correct | 1 ms | 332 KB | correct |
6 | Correct | 1 ms | 332 KB | correct |
7 | Correct | 1 ms | 332 KB | correct |
8 | Correct | 1 ms | 332 KB | correct |
9 | Correct | 1 ms | 332 KB | correct |
10 | Correct | 1 ms | 332 KB | correct |
11 | Correct | 1 ms | 332 KB | correct |
12 | Correct | 1 ms | 332 KB | correct |
13 | Correct | 1 ms | 332 KB | correct |
14 | Correct | 10 ms | 684 KB | correct |
15 | Correct | 9 ms | 680 KB | correct |
16 | Correct | 11 ms | 680 KB | correct |
17 | Correct | 8 ms | 588 KB | correct |
18 | Correct | 3 ms | 588 KB | correct |
19 | Correct | 8 ms | 672 KB | correct |
20 | Correct | 7 ms | 676 KB | correct |
21 | Correct | 7 ms | 672 KB | correct |
22 | Correct | 5 ms | 588 KB | correct |
23 | Correct | 4 ms | 588 KB | correct |
24 | Correct | 4 ms | 528 KB | correct |
25 | Correct | 1 ms | 588 KB | correct |
26 | Correct | 4 ms | 588 KB | correct |
27 | Correct | 4 ms | 524 KB | correct |
28 | Correct | 2 ms | 588 KB | correct |
29 | Correct | 1 ms | 588 KB | correct |
30 | Correct | 5 ms | 588 KB | correct |
31 | Correct | 5 ms | 588 KB | correct |
32 | Correct | 5 ms | 588 KB | correct |
33 | Correct | 5 ms | 588 KB | correct |
34 | Incorrect | 1048 ms | 2800 KB | WA in grader: NO |
35 | Halted | 0 ms | 0 KB | - |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
1 | Correct | 1 ms | 400 KB | correct |
2 | Correct | 1 ms | 460 KB | correct |
3 | Incorrect | 199 ms | 4704 KB | WA in grader: NO |
4 | Halted | 0 ms | 0 KB | - |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
1 | Correct | 1 ms | 332 KB | correct |
2 | Correct | 1 ms | 332 KB | correct |
3 | Correct | 1 ms | 332 KB | correct |
4 | Correct | 1 ms | 332 KB | correct |
5 | Correct | 1 ms | 332 KB | correct |
6 | Correct | 1 ms | 332 KB | correct |
7 | Correct | 1 ms | 332 KB | correct |
8 | Correct | 1 ms | 332 KB | correct |
9 | Correct | 1 ms | 332 KB | correct |
10 | Correct | 1 ms | 332 KB | correct |
11 | Correct | 1 ms | 332 KB | correct |
12 | Correct | 1 ms | 332 KB | correct |
13 | Correct | 1 ms | 332 KB | correct |
14 | Correct | 10 ms | 684 KB | correct |
15 | Correct | 9 ms | 680 KB | correct |
16 | Correct | 11 ms | 680 KB | correct |
17 | Correct | 8 ms | 588 KB | correct |
18 | Correct | 3 ms | 588 KB | correct |
19 | Correct | 8 ms | 672 KB | correct |
20 | Correct | 7 ms | 676 KB | correct |
21 | Correct | 7 ms | 672 KB | correct |
22 | Correct | 5 ms | 588 KB | correct |
23 | Correct | 4 ms | 588 KB | correct |
24 | Correct | 4 ms | 528 KB | correct |
25 | Correct | 1 ms | 588 KB | correct |
26 | Correct | 4 ms | 588 KB | correct |
27 | Correct | 4 ms | 524 KB | correct |
28 | Correct | 2 ms | 588 KB | correct |
29 | Correct | 1 ms | 588 KB | correct |
30 | Correct | 5 ms | 588 KB | correct |
31 | Correct | 5 ms | 588 KB | correct |
32 | Correct | 5 ms | 588 KB | correct |
33 | Correct | 5 ms | 588 KB | correct |
34 | Incorrect | 1048 ms | 2800 KB | WA in grader: NO |
35 | Halted | 0 ms | 0 KB | - |