Submission #294165

#TimeUsernameProblemLanguageResultExecution timeMemory
294165patrikpavic2Amusement Park (JOI17_amusement_park)C++17
100 / 100
37 ms10756 KiB
#include "Joi.h" #include <vector> #include <algorithm> #include <cstdio> #define X first #define Y second #define PB push_back using namespace std; const int N = 1e5 + 500; int dep[N], ppar[N], tr[N], mks[N], par[N]; int tko[N], bit[N], cur = 0; vector < int > v[N]; int pr(int x){ if(x == ppar[x]) return x; return ppar[x] = pr(ppar[x]); } bool cmp(int x, int y){ return mks[x] > mks[y]; } int dfs(int x, int lst){ mks[x] = dep[x]; par[x] = lst; vector < int > vv; for(int y : v[x]){ if(y == lst) continue; vv.PB(y); dep[y] = dep[x] + 1; dfs(y, x); mks[x] = max(mks[x], mks[y]); } sort(vv.begin(), vv.end(), cmp); v[x] = vv; return mks[x]; } void dfs2(int x){ if(cur == 60) return; tko[x] = cur++; bit[x] = 1; //printf("tko[ %d ] = %d bit[ %d ] = %d\n", x, tko[x], x, bit[x]); for(int y : v[x]) dfs2(y); } void Joi(int n, int m, int A[], int B[], long long X, int T) { for(int i = 0;i < n;i++) ppar[i] = i; for(int i = 0;i < m;i++){ if(pr(A[i]) == pr(B[i])) continue; ppar[pr(A[i])] = pr(B[i]); v[A[i]].PB(B[i]); v[B[i]].PB(A[i]); tr[i] = 1; } dfs(0, 0); if(mks[0] >= 59){ //printf("Slucaj 1\n"); for(int i = 0;i < n;i++) MessageBoard(i, !!(X & (1LL << (dep[i] % 60)))); return; } //printf("Slucaj 2\n"); dfs2(0); for(int i = 0;i < n;i++) MessageBoard(i, !!(X & (1LL << tko[i]))); }
#include "Ioi.h" #include <vector> #include <algorithm> #include <cstdio> #define X first #define Y second #define PB push_back using namespace std; typedef long long ll; const int N = 1e5 + 500; int dep2[N], ppar22[N], tr2[N], mks2[N], par2[N]; int tko2[N], bit2[N], cur2 = 0; ll ans = 0; vector < int > v2[N]; int pr2(int x){ if(x == ppar22[x]) return x; return ppar22[x] = pr2(ppar22[x]); } bool cmp2(int x, int y){ return mks2[x] > mks2[y]; } int dfs2(int x, int lst){ mks2[x] = dep2[x]; par2[x] = lst; vector < int > v2v2; for(int y : v2[x]){ if(y == lst) continue; v2v2.PB(y); dep2[y] = dep2[x] + 1; dfs2(y, x); mks2[x] = max(mks2[x], mks2[y]); } sort(v2v2.begin(), v2v2.end(), cmp2); v2[x] = v2v2; return mks2[x]; } void dfs22(int x){ if(cur2 == 60) return; tko2[x] = cur2++; bit2[x] = 1; for(int y : v2[x]) dfs22(y); } int odg2 = -1; void odg2ov2or(int x, bool nazad){ ans += (1LL << tko2[x]) * odg2; reverse(v2[x].begin(), v2[x].end()); for(int y : v2[x]){ if(bit2[y]){ odg2 = Move(y); odg2ov2or(y, nazad || (y != v2[x].back())); if(y != v2[x].back() || nazad){ odg2 = Move(x); } } } reverse(v2[x].begin(), v2[x].end()); } long long Ioi(int n, int m, int A[], int B[], int P, int V, int T) { for(int i = 0;i < n;i++) ppar22[i] = i; for(int i = 0;i < m;i++){ if(pr2(A[i]) == pr2(B[i])) continue; ppar22[pr2(A[i])] = pr2(B[i]); v2[A[i]].PB(B[i]); v2[B[i]].PB(A[i]); tr2[i] = 1; } dfs2(0, 0); if(mks2[0] >= 59){ int lst = V; //printf("P = %d mks2[ %d ] = %d\n", P, P, mks2[P]); while(mks2[P] - dep2[P] < 59){ lst = Move(par2[P]); P = par2[P]; } for(int i = 0;i < 60;i++){ ans += (1LL << (dep2[P] % 60)) * lst; if(i < 59){ lst = Move(v2[P][0]); P = v2[P][0]; } } return ans; } dfs22(0); odg2 = V; while(P != 0){ odg2 = Move(par2[P]); P = par2[P]; } odg2ov2or(0, 0); return ans; }
#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...