Submission #651776

#TimeUsernameProblemLanguageResultExecution timeMemory
651776ghostwriterTropical Garden (IOI11_garden)C++14
69 / 100
5026 ms10880 KiB
#pragma GCC optimize ("Ofast") #pragma GCC target ("avx2") #include "garden.h" #include "gardenlib.h" #include <bits/stdc++.h> using namespace std; #ifdef LOCAL #include <debug.h> #include "grader.cpp" #else #define debug(...) #endif #define ft front #define bk back #define st first #define nd second #define ins insert #define ers erase #define pb push_back #define pf push_front #define _pb pop_back #define _pf pop_front #define lb lower_bound #define ub upper_bound #define mtp make_tuple #define bg begin #define ed end #define all(x) x.bg(), x.ed() #define sz(x) (int)x.size() typedef long long ll; typedef unsigned long long ull; typedef double db; typedef long double ldb; typedef pair<int, int> pi; typedef pair<ll, ll> pll; typedef vector<int> vi; typedef vector<ll> vll; typedef vector<pi> vpi; typedef vector<pll> vpll; typedef string str; template<typename T> T gcd(T a, T b) { return (b == 0? a : gcd(b, a % b)); } template<typename T> T lcm(T a, T b) { return a / gcd(a, b) * b; } #define FOR(i, l, r) for (int i = l; i <= r; ++i) #define FOS(i, r, l) for (int i = r; i >= l; --i) #define FRN(i, n) for (int i = 0; i < n; ++i) #define FSN(i, n) for (int i = n - 1; i >= 0; --i) #define EACH(i, x) for (auto &i : x) #define WHILE while #define file "TEST" mt19937 rd(chrono::steady_clock::now().time_since_epoch().count()); ll rand(ll l, ll r) { return uniform_int_distribution<ll>(l, r)(rd); } /* ---------------------------------------------------------------- END OF TEMPLATE ---------------------------------------------------------------- Tran The Bao - ghostwriter Training for VOI23 gold medal ---------------------------------------------------------------- GOAT ---------------------------------------------------------------- */ const int MAXN = 15e4; const int MAXQ = 2000; int c[MAXN][2], s[MAXN][2], d[MAXN][2], oud[MAXN], ans[MAXQ]; pi cur[MAXQ]; bool ind[MAXN][2], c1[MAXN][2]; int adj[MAXN][2]; pi e[MAXN]; pi nxt(pi x) { int u = x.st; bool stt = x.nd; int id = (!stt? 0 : oud[u] == 1? 0 : 1); int nxtv = e[adj[u][id]].st == u? e[adj[u][id]].nd : e[adj[u][id]].st; return {nxtv, adj[u][id] == adj[nxtv][0]? 1 : 0}; } void count_routes(int N, int M, int P, int R[][2], int Q, int G[]) { FRN(i, M) { int u = R[i][0], v = R[i][1]; e[i] = {u, v}; if (oud[u] < 2) adj[u][oud[u]++] = i; if (oud[v] < 2) adj[v][oud[v]++] = i; } vpi ver; ver.resize(2 * N); ver.clear(); FRN(i, N) FRN(j, 2) { pi tmp1 = nxt({i, j}); ind[tmp1.st][tmp1.nd] = 1; if (c1[i][j]) continue; pi cur = {i, j}; ver.clear(); WHILE(1) { if (!c[cur.st][cur.nd]) ver.pb(cur); ++c[cur.st][cur.nd]; cur = nxt(cur); if (c1[cur.st][cur.nd] || c[cur.st][cur.nd] == 2) break; } reverse(all(ver)); if (c[ver.ft().st][ver.ft().nd] == 2) { int cnt = 0, h = 0; EACH(z, ver) if (c[z.st][z.nd] == 2) ++cnt; EACH(z, ver) { if (c[z.st][z.nd] == 1) ++h; s[z.st][z.nd] = cnt; d[z.st][z.nd] = h; } } else { pi tmp = nxt(ver.ft()); int cnt = s[tmp.st][tmp.nd], h = d[tmp.st][tmp.nd]; EACH(z, ver) { ++h; s[z.st][z.nd] = cnt; d[z.st][z.nd] = h; } } EACH(z, ver) c1[z.st][z.nd] = 1; } memset(c, 0, sizeof c); FRN(i, N) FRN(j, 2) { if (ind[i][j]) continue; FRN(z, Q) { int x = G[z]; int x1 = x; if (x1 > d[i][j]) { x1 -= d[i][j]; x1 %= s[i][j]; x1 += d[i][j]; } cur[z] = {i, j}; FOR(y, 1, x1) cur[z] = nxt(cur[z]); if (!j && cur[z].st == P) ++ans[z]; } c[i][j] = 1; pi cur1 = nxt({i, j}); WHILE(!c[cur1.st][cur1.nd]) { FRN(z, Q) { cur[z] = nxt(cur[z]); if (!cur1.nd && cur[z].st == P) ++ans[z]; } c[cur1.st][cur1.nd] = 1; cur1 = nxt(cur1); } } FRN(i, N) FRN(j, 2) { if (c[i][j]) continue; FRN(z, Q) { int x = G[z]; int x1 = x; x1 %= s[i][j]; cur[z] = {i, j}; FOR(y, 1, x1) cur[z] = nxt(cur[z]); if (!j && cur[z].st == P) ++ans[z]; } c[i][j] = 1; pi cur1 = nxt({i, j}); WHILE(!c[cur1.st][cur1.nd]) { FRN(z, Q) { cur[z] = nxt(cur[z]); if (!cur1.nd && cur[z].st == P) ++ans[z]; } c[cur1.st][cur1.nd] = 1; cur1 = nxt(cur1); } } FRN(q, Q) answer(ans[q]); } /* 5 5 2 1 0 1 2 3 2 1 3 4 2 2 3 1 1 2 0 0 1 1 0 1 1 1 1 0 0 1 1 1 2 1 2 0 1 0 2 1 3 1 3 0 2 0 3 1 1 0 4 0 2 0 4 1 2 0 ---------------------------------------------------------------- From Benq: stuff you should look for * int overflow, array bounds * special cases (n=1?) * do smth instead of nothing and stay organized * WRITE STUFF DOWN * DON'T GET STUCK ON ONE APPROACH ---------------------------------------------------------------- */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...