Submission #659540

#TimeUsernameProblemLanguageResultExecution timeMemory
659540jiahngMechanical Doll (IOI18_doll)C++14
2 / 100
62 ms23084 KiB
#include "doll.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pi; typedef vector <int> vi; typedef vector <pi> vpi; typedef pair<pi, ll> pii; typedef set <ll> si; typedef long double ld; #define f first #define s second #define mp make_pair #define FOR(i,s,e) for(int i=s;i<=int(e);++i) #define DEC(i,s,e) for(int i=s;i>=int(e);--i) #define pb push_back #define all(x) (x).begin(), (x).end() #define lbd(x, y) lower_bound(all(x), y) #define ubd(x, y) upper_bound(all(x), y) #define aFOR(i,x) for (auto i: x) #define mem(x,i) memset(x,i,sizeof x) #define fast ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0) #define maxn 300010 #define INF (ll)1e9 #define MOD 1000000007 typedef pair <vi, int> pvi; typedef pair <int,pi> ipi; typedef vector <pii> vpii; int N; vi adj[maxn]; vi X,Y; vi build_idx[19], rev_build_idx[19]; int lg2[maxn]; int solve(int x){ if (adj[x].size() == 1) return adj[x][0]; int sz = adj[x].size(), build_sz = sz & (-sz); int offset = (int)X.size() - 1; FOR(i,1,build_sz-1){ X.pb(0); Y.pb(0); } FOR(i,2,build_sz-1){ if (i&1) Y[i/2+offset] = i; else X[i/2+offset] = i; } FOR(i,0,build_sz-1){ int idx = rev_build_idx[lg2[build_sz]][i] + build_sz; if (idx & 1) Y[idx/2+offset] = adj[x].back(); else X[idx/2+offset] = adj[x].back(); adj[x].pop_back(); } adj[x].pb(-(offset+1+1)); return solve(x); } void create_circuit(int M, std::vector<int> A) { N = A.size(); std::vector<int> C(M + 1); FOR(i,0,N-2){ adj[A[i]].pb(A[i+1]); } FOR(i,1,M) reverse(all(adj[i])); adj[A[N-1]].pb(0); int x = 1; FOR(i,0,18){ lg2[x] = i; x <<= 1; } build_idx[1].pb(0); build_idx[1].pb(1); FOR(i,2,18){ aFOR(j, build_idx[i-1]) build_idx[i].pb(j), build_idx[i].pb(j+(1<<(i-1))); } FOR(i,1,18){ rev_build_idx[i] = vi(build_idx[i].size()); FOR(j,0,build_idx[i].size()-1) rev_build_idx[i][build_idx[i][j]] = j; } C[0] = A[0]; for (int i = 1; i <= M; ++i) if (!adj[i].empty()){ C[i] = solve(i); } answer(C, X, Y); }
#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...