Submission #1139120

#TimeUsernameProblemLanguageResultExecution timeMemory
1139120OtalpUnique Cities (JOI19_ho_t5)C++20
0 / 100
431 ms14260 KiB
#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 #define unm unordered_map const ll mod = 1e9 + 7; const int MAXN = 2e5 + 5; const int MAXA = 2e5 + 5; int a[200100], o[200100]; vector<int> q[200100]; struct node{ unm<int, int> cnt; int res=0; node(){ cnt.clear(); } }; node *d[200100]; // void un(node &a, node &b){ // for(pii g: b.cnt){ // int x = g.ff + 1; // if(a.cnt[x] == 1) a.dp -= 1; // a.cnt[x] += g.ss; // if(a.cnt[x] == 1) a.dp += 1; // } // } // void dv(node &a, node &b){ // for(pii g: b.cnt){ // int x = g.ff + 1; // if(a.cnt[x] == 1) a.dp -= 1; // a.cnt[x] -= g.ss; // if(a.cnt[x] == 1) a.dp += 1; // } // } int pos[200100], sz[200100], pc[200100]; // void ddfs0(int v, int p, int k){ // sz[v] = 1; // for(int to: q[v]){ // if(pos[to] or to == p) continue; // ddfs0(to, v, k + 1); // sz[v] += sz[to]; // } // } void dfs0(int v, int p, int k){ sz[v] = 1; o[v] = k; for(int to: q[v]){ if(pos[to] or to == p) continue; dfs0(to, v, k + 1); sz[v] += sz[to]; } } int findc(int v, int p, int k){ pc[v] = 1; for(int to: q[v]){ if(to == p or pos[to]) continue; if(sz[to] > k/2) return findc(to, v, k); } pc[v] = 0; return v; } void add(int v, int p, int k, node *t, int u){ if(t -> cnt[k-u] == 1) t -> res --; t -> cnt[k-u] ++; if(t -> cnt[k-u] == 1) t -> res ++; for(int to: q[v]){ if(to == p or pos[to]) continue; add(to, v, k + 1, t, u); } } void sub(int v, int p, int k, node *t, int u){ if(t -> cnt[k-u] == 1) t -> res --; t -> cnt[k-u] --; if(t -> cnt[k-u] == 1) t -> res ++; for(int to: q[v]){ if(to == p or pos[to]) continue; sub(to, v, k + 1, t, u); } } int res[200100]; void dfs2(int v, int p, node *t, int k){ pos[v] = 1; int dto = -1; for(int to: q[v]){ if(to == p or pos[to]) continue; add(to, 0, 1, t, k); if(pc[to]) dto = to; } if(t -> cnt[-k] == 1) t -> res --; res[v] = t -> res; // cout<<"################"; // cout<<v<<' '<<k<<' '<<dto<<'\n'; // for(pii g: t -> cnt){ // cout<<g.ff + k<<' '<<g.ss<<'\n'; // } t -> cnt[-k] ++; if(t -> cnt[-k] == 1) t -> res ++; for(int to: q[v]){ if(to == p or pos[to] or to == dto) continue; sub(to, 0, 1, t, k); dfs0(to, 0, 1); int c = findc(to, 0, sz[to]); dfs2(c, v, t, k+o[c]); add(to, 0, 1, t, k); } if(t -> cnt[-k] == 1) t -> res --; t -> cnt[-k] --; if(t -> cnt[-k] == 1) t -> res ++; for(int to: q[v]){ if(to == p or pos[to]) continue; sub(to, 0, 1, t, k); } if(dto != -1){ dfs0(dto, 0, 1); int to = dto; int c = findc(to, 0, sz[to]); if(t -> cnt[-k+2*o[c]] == 1) t -> res --; t -> cnt[-k+2*o[c]] ++; if(t -> cnt[-k+2*o[c]] == 1) t -> res ++; for(int to: q[v]){ if(to == p or pos[to] or to == dto) continue; add(to, 0, 1, t, k-2*o[c]); } dfs2(c, v, t, k-o[c]); for(int to: q[v]){ if(to == p or pos[to] or to == dto) continue; sub(to, 0, 1, t, k-2*o[c]); } if(t -> cnt[-k+2*o[c]] == 1) t -> res --; t -> cnt[-k+2*o[c]] --; if(t -> cnt[-k+2*o[c]] == 1) t -> res ++; } pos[v] = 0; } void solve(){ int n, m; cin>>n>>m; for(int i=1; i<n; i++){ int l, r; cin>>l>>r; q[l].pb(r); q[r].pb(l); } for(int i=1; i<=n; i++){ cin>>a[i]; } dfs0(1, 0, 0); int c = findc(1, 0, sz[1]); for(int i=1; i<=n; i++) pc[i] = 0; // dfs1(c, 0); // ddfs0(c, 0, 0); node *t = new node(); dfs2(c, 0, t, 0); // cout<<d[c] -> res; for(int i=1; i<=n; i++){ cout<<(res[i] >= 1)<<'\n'; } // for(pii g: t -> cnt) cout<<g.ff<<' '<<g.ss<<'\n'; } int main(){ ios_base::sync_with_stdio(NULL);cin.tie(NULL);cout.tie(NULL); int t=1; //cin>>t; while(t--){ solve(); cout<<'\n'; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...