제출 #504036

#제출 시각아이디문제언어결과실행 시간메모리
504036tgbegimx무제 (POI11_dyn)C++17
100 / 100
1350 ms37892 KiB
#include <bits/stdc++.h> #define fast ios_base::sync_with_stdio(0) ; cin.tie(0);cout.tie(0) #define ll long long #define foru(i,l,r) for(int i=l;i<=r;i++) #define ford(i,l,r) for(int i=l;i>=r;i--) #define pb push_back using namespace std; const int N=3e5+10; vector<int> d; vector<vector<int>> ke; int dp[N],dem,kt[N]; int n,m; void dfs(int k,int u,int fa) { int mx1=-1e9,mx2=-1e9; if(d[u]) mx1=0; for(auto v:ke[u]) { if(v==fa) continue; //cout<<v<<' '; dfs(k,v,u); if(kt[v]==1) mx1=max(mx1,dp[v]+1); if(kt[v]==2) mx2=max(mx2,dp[v]-1); } if(mx1>mx2) { if(mx1>=k) { dem++; kt[u]=2; dp[u]=k; if(dem>m) kt[u]=-1; } else kt[u]=1,dp[u]=mx1; } else kt[u]=2,dp[u]=mx2; } bool check(int k) { dem=0; dfs(k,1,-1); if(kt[1]==-1) return 0; if(kt[1]==1&&dp[1]>=0) dem++; if(dem<=m) return 1; return 0; } void solve() { cin>>n>>m; d.resize(n+1); ke.resize(n+1); foru(i,1,n) cin>>d[i]; foru(i,1,n-1) { int u,v; cin>>u>>v; ke[u].pb(v); ke[v].pb(u); } //for(auto v:ke[5]) cout<<v<<' '; int l=0,r=n,ans=0; while(l<=r) { int mid=(l+r)>>1; //cout<<check(mid)<<' '; if(check(mid)) ans=mid,r=mid-1; else l=mid+1; } cout<<ans; } int main() { //freopen("main.inp","r",stdin); //freopen("main.out","w",stdout); fast; int t=1; //cin>>t; while(t--) solve(); }
#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...
#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...