Submission #1153386

#TimeUsernameProblemLanguageResultExecution timeMemory
1153386OtalpAmusement Park (JOI17_amusement_park)C++20
10 / 100
20 ms12104 KiB
#include "Joi.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 namespace{ int pos[200100]; int a[200100]; vector<int> dq[200100], q[200100]; void dfs0(int v){ pos[v] = 1; for(int to: dq[v]){ if(pos[to]) continue; q[v].pb(to); q[to].pb(v); dfs0(to); } } // pii dfs1(int v, int p){ // pii h={1, v}; // for(int to: q[v]){ // if(p == to) continue; // pii g=dfs1(to, v); // h = max(h, {g.ff + 1, g.ss}); // } // return h; // } set<pii> h; int K = 0; int P[200100]; void dfs1(int v, int p){ if(K < 60){ a[v] = K ++; if(h.find({a[p], p}) != h.end() and (p != 0 or (p == 0 and q[0].size() > 1))) h.erase(h.find({a[p], p})); h.insert({a[v], v}); } P[v] = p; for(int to: q[v]){ if(p == to) continue; dfs1(to, v); } } void dfs2(int v, int p){ pii g={-1, -1}; // cout<<v<<'\n'; if(a[v] == -1){ auto it = h.begin(); if(it -> ss == p){ it++; } g = *it; // for(pii x:h) cout<<x.ff<<' '<<x.ss<<'\n'; h.erase(it); a[v] = g.ff; h.insert({a[v], v}); h.erase(h.find({a[p], p})); h.insert({a[P[g.ss]], P[g.ss]}); } int dp = -1; if(p != -1){ dp = P[p]; P[p] = v; } for(int to: q[v]){ if(to == p) continue; dfs2(to, v); } if(g.ff != -1){ h.erase(h.find({a[v], v})); h.insert({a[p], p}); h.erase(h.find({a[P[g.ss]], P[g.ss]})); h.insert(g); } if(p != -1){ P[p] = dp; } } } void Joi(int n, int m, int A[], int B[], long long X, int T){ for(int i=0; i<n; i++) a[i] = -1; for(int i=0; i<m; i++){ int l = A[i], r = B[i]; dq[l].pb(r); dq[r].pb(l); } dfs0(0); // int f = (dfs1(0, -1)).ss; // pii g = (dfs1(f, -1)); // int s = g.ss; // if(g.ff < 60){ dfs1(0, -1); dfs2(0, -1); for(int i=0; i<n; i++){ // cout<<a[i]<<' '; MessageBoard(i, bool(X & (1ll << a[i]))); } // for(int i=0; i<60; i++){ // MessageBoard(i, bool(X & (1ll << i))); // } // for(int i=60; i<n; i++){ // MessageBoard(i, 0); // } }
#include "Ioi.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 namespace{ int pos[200100]; int a[200100]; vector<int> dq[200100], q[200100]; void dfs0(int v){ pos[v] = 1; for(int to: dq[v]){ if(pos[to]) continue; q[v].pb(to); q[to].pb(v); dfs0(to); } } // pii dfs1(int v, int p){ // pii h={1, v}; // for(int to: q[v]){ // if(p == to) continue; // pii g=dfs1(to, v); // h = max(h, {g.ff + 1, g.ss}); // } // return h; // } set<pii> h; int K = 0; int P[200100]; void dfs1(int v, int p){ if(K < 60){ a[v] = K ++; if(h.find({a[p], p}) != h.end() and (p != 0 or (p == 0 and q[0].size() > 1))) h.erase(h.find({a[p], p})); h.insert({a[v], v}); } P[v] = p; for(int to: q[v]){ if(p == to) continue; dfs1(to, v); } } void dfs2(int v, int p){ pii g={-1, -1}; // cout<<v<<'\n'; if(a[v] == -1){ auto it = h.begin(); if(it -> ss == p){ it++; } g = *it; // for(pii x:h) cout<<x.ff<<' '<<x.ss<<'\n'; h.erase(it); a[v] = g.ff; h.insert({a[v], v}); h.erase(h.find({a[p], p})); h.insert({a[P[g.ss]], P[g.ss]}); } int dp = -1; if(p != -1){ dp = P[p]; P[p] = v; } for(int to: q[v]){ if(to == p) continue; dfs2(to, v); } if(g.ff != -1){ h.erase(h.find({a[v], v})); h.insert({a[p], p}); h.erase(h.find({a[P[g.ss]], P[g.ss]})); h.insert(g); } if(p != -1){ P[p] = dp; } } } ll X; int us[100]; void dfs4(int v, int p, int k){ X += (1ll << a[v]) * k; us[a[v]] = 1; for(int to: q[v]){ if(p == to) continue; if(us[a[to]] == 1) continue; dfs4(to, v, Move(to)); Move(v); } } long long Ioi(int n, int m, int A[], int B[], int P, int V, int T) { for(int i=0; i<n; i++) a[i] = -1; for(int i=0; i<m; i++){ int l = A[i], r = B[i]; dq[l].pb(r); dq[r].pb(l); } dfs0(0); for(int i=0; i<60; i++) us[i] = 0; // int f = (dfs1(0, -1)).ss; // pii g = (dfs1(f, -1)); // int s = g.ss; // if(g.ff < 60){ dfs1(0, -1); dfs2(0, -1); X = 0; dfs4(P, -1, V); return X; }
#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...