제출 #1226155

#제출 시각아이디문제언어결과실행 시간메모리
1226155Trumling트리 (IOI24_tree)C++20
18 / 100
69 ms30868 KiB
//Trumling © //Αφόδευε υψηλά και ηγνάντει #include <bits/stdc++.h> using namespace std; typedef long long ll; #define pb push_back #define F first #define S second #define enter cout<<'\n'; #define INF 99999999999999 #define MOD 1000000007 #define all(x) x.begin(),x.end() #include "tree.h" int n; vector<ll> w; vector<vector<ll>>g; vector<ll>times; vector<ll>v; vector<ll>suf; ll leaves=0; void dfs(int start,int pre) { for(auto x:g[start]) if(x!=pre) { dfs(x,start); if(w[start]==0) { v.pb(times[x]); times[start]=1; } else times[start]+=times[x]; } if(g[start].size()==1 && start!=pre) { times[start]=1; leaves+=w[start]; } } void init(std::vector<int> p, std::vector<int> W) { for(auto x:W) w.pb(x); n = (int)p.size(); g.assign(n,vector<ll>()); times.assign(n,0); for(int i=1;i<n;i++) { // cout<<i<<' '<<p[i]<<','; g[i].pb(p[i]); g[p[i]].pb(i); } dfs(0,0); if(w[0]) v.pb(times[0]); sort(all(v)); suf.assign(v.size()+1,0); for(int i=v.size()-1;i>=0;i--) suf[i]=((i==v.size()-1)?0:suf[i+1])+v[i]; // for(auto x:v) // cout<<x<<' '; } long long query(int L, int R) { ll sz=v.size(); ll pos=upper_bound(all(v),R/L)-v.begin(); ll r=suf[pos]; //cout<<sz<<' '<<r<<' '; return leaves*L + ((r==0)?0:r*L - (sz-pos)*R); }
#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...