제출 #1157451

#제출 시각아이디문제언어결과실행 시간메모리
1157451jerzykAmusement Park (JOI17_amusement_park)C++20
68 / 100
16 ms2640 KiB
#include "Joi.h" #include <bits/stdc++.h> using namespace std; #define pb push_back #define st first #define nd second typedef long long ll; typedef long double ld; namespace A { const ll I = 1000'000'000'000'000'000LL; const int II = 2'000'000'000; const ll M = 1000'000'007LL; const int N = 10'007; const int K = 60; bool vis[N], czy[N]; int sum[N]; int il[N]; vector<int> ed[N]; int wzo[K + 10]; int ans[N]; bool Cp(int a, int b) { return (il[a] > il[b]); } void DFSB(int v, int dd) { vis[v] = 1; dd %= K; if(dd == 0) czy[v] = 1; sum[v] = 1; il[v] = 1; vector<int> nw; sort(ed[v].begin(), ed[v].end()); for(int i = 0; i < (int)ed[v].size(); ++i) { if(vis[ed[v][i]]) continue; DFSB(ed[v][i], dd + 1); il[v] = max(il[v], ed[v][i] + 1); sum[v] += sum[ed[v][i]]; if(!czy[ed[v][i]]) nw.pb(ed[v][i]); } sort(nw.begin(), nw.end(), Cp); ed[v] = nw; //cerr << "DFS1 " << v << " " << sum[v] << " " << K << "\n"; if(sum[v] < K && czy[v]) czy[v] = 0; if(czy[v]) { il[v] = 0; sum[v] = 0; } } void DFSS(int v, int &cnt) { //cerr << "DFS Set " << v << " " << cnt << "\n"; ans[v] = wzo[cnt]; ++cnt; int beg = cnt; if(cnt >= K) return; for(int i = 0; i < (int)ed[v].size(); ++i) { if(cnt < K) DFSS(ed[v][i], cnt); else if(il[ed[v][i]] >= K - beg) { int a = beg; DFSS(ed[v][i], a); } } } } void Joi(int _N, int _M, int A[], int B[], long long _X, int _T) { using namespace A; int n = _N, m = _M; for(int i = 0; i < m; ++i) { ed[A[i]].pb(B[i]); ed[B[i]].pb(A[i]); } for(int i = 0; i < K; ++i) wzo[i] = (bool)((1LL<<(ll)i) & _X); DFSB(0, 0); int cnt; for(int i = 0; i < n; ++i) { if(!czy[i]) continue; cnt = 0; DFSS(i, cnt); } for(int i = 0; i < n; ++i) MessageBoard(i, ans[i]); }
#include "Ioi.h" #include <bits/stdc++.h> using namespace std; #define pb push_back #define st first #define nd second typedef long long ll; typedef long double ld; namespace B { const ll I = 1000'000'000'000'000'000LL; const int II = 2'000'000'000; const ll M = 1000'000'007LL; const int N = 10'007; const int K = 60; bool vis[N], czy[N]; int sum[N], oj[N]; int il[N]; vector<int> ed[N]; int val[N]; int pos[N]; ll answer = 0LL; bool Cp(int a, int b) { return (il[a] > il[b]); } void DFSB(int v, int dd) { vis[v] = 1; dd %= K; if(dd == 0) czy[v] = 1; sum[v] = 1; il[v] = 1; vector<int> nw; sort(ed[v].begin(), ed[v].end()); for(int i = 0; i < (int)ed[v].size(); ++i) { if(vis[ed[v][i]]) continue; oj[ed[v][i]] = v; DFSB(ed[v][i], dd + 1); il[v] = max(il[v], ed[v][i] + 1); sum[v] += sum[ed[v][i]]; if(!czy[ed[v][i]]) nw.pb(ed[v][i]); } sort(nw.begin(), nw.end(), Cp); ed[v] = nw; if(sum[v] < K && czy[v]) czy[v] = 0; if(czy[v]) { il[v] = 0; sum[v] = 0; } } void DFS2(int v, int &cnt) { //cerr << "DFS2 Pos: " << v << " " << cnt << "\n"; pos[v] = cnt + 1; if(cnt >= K) return; ++cnt; for(int i = 0; i < (int)ed[v].size(); ++i) { DFS2(ed[v][i], cnt); if(cnt >= K) return; } } void DFSA(int v, int a, bool r) { answer += (1LL<<((ll)pos[v] - 1LL)) * (ll)a; for(int i = (int)ed[v].size() - 1; i >= 0; --i) { if(pos[ed[v][i]] > 0) { int dd = Move(ed[v][i]); DFSA(ed[v][i], dd, ((i != 0) | r)); } } if(r) { Move(oj[v]); } } } long long Ioi(int _N, int _M, int A[], int B[], int P, int V, int T) { using namespace B; //int n = _N; int m = _M; for(int i = 0; i < m; ++i) { ed[A[i]].pb(B[i]); ed[B[i]].pb(A[i]); } DFSB(0, 0); vector<int> pth; val[P] = V; while(!czy[P]) { pth.pb(P); val[oj[P]] = Move(oj[P]); P = oj[P]; } pth.pb(P); reverse(pth.begin(), pth.end()); if((int)pth.size() >= K) { ll ans = 0LL; for(int i = 0; i < K; ++i) ans += (1LL<<(ll)i) * val[pth[i]]; return ans; } int cnt = 0; DFS2(P, cnt); DFSA(P, val[P], 0); return answer; }
#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...