제출 #1175038

#제출 시각아이디문제언어결과실행 시간메모리
1175038Dan4LifeChase (CEOI17_chase)C++20
0 / 100
146 ms11420 KiB
#include <bits/stdc++.h> using namespace std; #define pb push_back #define sz(a) (int)a.size() #define all(a) begin(a),end(a) using ll = long long; using vi = vector<int>; const int mxN = (int)1e5+10; const ll LINF = (ll)1e18; ll n, v, cen, ans; bitset<mxN> vis; vi adj[mxN]; ll a[mxN], b[mxN], sub[mxN]; template<class T, int SZ> struct Fenwick{ T fen[SZ]; void init(){ for(int i = 0; i < SZ; i++) fen[i]=-LINF; } void upd(int x, T v){ for(++x; x<SZ; x+=x&-x) fen[x]=max(fen[x],v); } T query(int x){ T s = -LINF; for(++x; x>0; x-=x&-x) s=max(s,fen[x]); return s; } }; Fenwick<ll, 105> fen; int dfsSz(int s, int p){ sub[s] = 1; for(auto u : adj[s]){ if(u==p or vis[u]) continue; sub[s]+=dfsSz(u,s); } return sub[s]; } int fcen(int s, int p, int n){ for(auto u : adj[s]){ if(u==p or vis[u]) continue; if(sub[u]>n/2) return fcen(u,s,n); } return s; } void dfs(int s, int p, int dep, ll sum, int ok){ if(dep>v) return; if(ok==0) fen.upd(dep,sum+a[s]); else if(ok==1) ans=max(ans, sum+b[cen]+fen.query(v-dep-1)); else if(dep<v) ans=max(ans, max(a[cen],a[s])+sum); for(auto u : adj[s]){ if(u==p or vis[u]) continue; dfs(u,s,dep+1,sum+b[u],ok); } } void cen_dec(int s, int p){ int sz = dfsSz(s,p); cen = fcen(s,p,sz); fen.init(); for(auto u : adj[cen]){ if(u==p or vis[u]) continue; dfs(u,cen,1,b[u],0); dfs(u,cen,1,b[u],1); } dfs(cen,p,0,b[cen],2); fen.init(); for(int j = sz(adj[cen])-1; j>=0; j--){ int u = adj[cen][j]; if(u==p or vis[u]) continue; dfs(u,cen,1,b[u],0); dfs(u,cen,1,b[u],1); } vis[cen] = 1; for(auto u : adj[cen]){ if(u==p or vis[u]) continue; cen_dec(u,cen); } } int main(){ cin >> n >> v; for(int i = 1; i <= n; i++) cin >> a[i], b[i]=-a[i]; for(int i = 1; i < n; i++){ int a, b; cin >> a >> b; adj[a].pb(b), adj[b].pb(a); } for(int i = 1; i <= n; i++) for(auto u : adj[i]) b[i]+=a[u]; cen_dec(1,0); cout << ans << "\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...