Submission #235325

#TimeUsernameProblemLanguageResultExecution timeMemory
235325giorgikobUntitled (POI11_dyn)C++14
100 / 100
1826 ms51480 KiB
#include<bits/stdc++.h> #define ll long long #define ff first #define ss second #define pb push_back using namespace std; const int N = 1e6 + 6; bool is_dynamite[N]; int closest_explosion[N]; int furthest_dynamite[N]; int P[N],depth[N]; vector<int>gr[N]; int n,m; void dfs(int x, int p){ depth[x] = depth[p] + 1; P[x] = p; for(int to : gr[x]){ if(to == p) continue; dfs(to,x); } } bool check(int k){ //cout << k << endl; priority_queue<pair<int,int>>q; int cnt_dynamites = 0; for(int i = 1; i <= n; i++){ q.push({depth[i],i}); closest_explosion[i] = 1e9; furthest_dynamite[i] = is_dynamite[i] ? 0 : -1; } while(q.size()){ auto pa = q.top(); q.pop(); int x = pa.second; int p = P[x]; //cout << x << " " << furthest_dynamite[x] << " " << closest_explosion[x] << endl; if(furthest_dynamite[x] == k){ cnt_dynamites++; if(cnt_dynamites > m) return false; closest_explosion[p] = 1; } else { closest_explosion[p] = min(closest_explosion[p],closest_explosion[x]+1); if(closest_explosion[x] + furthest_dynamite[x] <= k && furthest_dynamite[x] != -1){ continue; } if(furthest_dynamite[x] != -1)furthest_dynamite[p] = max(furthest_dynamite[p],furthest_dynamite[x]+1); } } if(closest_explosion[1] + furthest_dynamite[1] > k && furthest_dynamite[1] != -1 && furthest_dynamite[1] != k){ cnt_dynamites++; if(cnt_dynamites > m) return false; } return true; } int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> m; for(int i = 1; i <= n; i++){ cin >> is_dynamite[i]; } for(int i = 1; i < n; i++){ int x,y; cin >> x >> y; gr[x].pb(y); gr[y].pb(x); } dfs(1,0); int l = 0, r = n; int answer = -1; while(l <= r){ int mid = l+r; mid >>= 1; if(check(mid)){ r = mid-1; answer = mid; } else { l = mid+1; } } cout << answer << endl; }
#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...