Submission #906325

#TimeUsernameProblemLanguageResultExecution timeMemory
906325Belphegor오두막집 (GA7_cabana)C++14
19 / 100
6037 ms18040 KiB
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pi; const int sz = 111111; vector<pi>tree[sz+5]; bool v[sz+5],cabin[sz+5]; int fenwick[sz+5],sub[sz+5]; ll dist[sz+5]; ll D,paths; vector<ll>vals; vector<int>tmp; void init(int i){ while(i<=vals.size()-1){ fenwick[i] = 0; i+=(i&-i); } } void update(int i,int val){ while(i<=vals.size()-1){ fenwick[i]+=val; i+=(i&-i); } } int sum(int i){ int r = 0; while(i){ r+=fenwick[i]; i-=(i&-i); } return r; } void DFS(int cur,int par){ if(cabin[cur]) vals.emplace_back(dist[cur]); for(pi p : tree[cur]){ int nxt = p.first,w = p.second; if(nxt == par || v[nxt]) continue; dist[nxt] = dist[cur] + w; DFS(nxt,cur); } } void DFS2(int cur,int par){ if(cabin[cur]){ int id = (int)(lower_bound(vals.begin(),vals.end(),dist[cur])-vals.begin()); tmp.emplace_back(id); int lim = D - dist[cur]; if(dist[cur] <= D){ int ID = (int)(upper_bound(vals.begin(),vals.end(),D-dist[cur])-vals.begin()); paths+=sum(ID-1); } } for(pi p : tree[cur]){ int nxt = p.first,w = p.second; if(v[nxt] || nxt == par) continue; DFS2(nxt,cur); } } void dfs(int cur,int par){ sub[cur] = 1; for(pi p : tree[cur]){ int nxt = p.first,w = p.second; if(v[nxt] || nxt == par) continue; dfs(nxt,cur); sub[cur] += sub[nxt]; } } void decomposition(int cent){ dfs(cent,0); int tot = sub[cent]; while(1){ int child = -1; for(pi p : tree[cent]){ int nxt = p.first; if(v[nxt] || sub[nxt] > sub[cent]) continue; if(child == -1 || sub[child] < sub[nxt]) child = nxt; } if(child != -1 && sub[child]*2 > tot) cent = child; else break; } vals = {-1}; dist[cent] = 0; DFS(cent,0); sort(vals.begin(),vals.end()); vals.erase(unique(vals.begin(),vals.end()),vals.end()); if(cabin[cent]) update(1,1); for(pi p : tree[cent]){ int nxt = p.first,w = p.second; if(v[nxt]) continue; tmp.clear(); DFS2(nxt,cent); for(int x : tmp) update(x,1); } for(int i=1; i<=vals.size(); i++) init(i); v[cent] = 1; for(pi p : tree[cent]){ int nxt = p.first; if(v[nxt]) continue; decomposition(nxt); } } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); ll n,m,k; cin>>n>>m>>k; for(int i=2; i<=n; i++){ ll p,d; cin>>p>>d; assert(d<=1e9+7); tree[p].emplace_back(pi(i,d)); tree[i].emplace_back(pi(p,d)); } for(int i=1; i<=m; i++){ int x; cin>>x; cabin[x] = 1; } ll l = 1,r = n*(1e9); while(l<=r){ m = (l+r)>>1; for(int i=1; i<=n; i++) v[i] = fenwick[i] = 0; D = m; paths = 0; decomposition(1); if(paths < k) l = m+1; else r = m-1; } cout<<l; }

Compilation message (stderr)

cabana.cpp: In function 'void init(int)':
cabana.cpp:14:9: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   14 |  while(i<=vals.size()-1){
      |        ~^~~~~~~~~~~~~~~
cabana.cpp: In function 'void update(int, int)':
cabana.cpp:20:9: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   20 |  while(i<=vals.size()-1){
      |        ~^~~~~~~~~~~~~~~
cabana.cpp: In function 'void DFS2(int, int)':
cabana.cpp:46:7: warning: unused variable 'lim' [-Wunused-variable]
   46 |   int lim = D - dist[cur];
      |       ^~~
cabana.cpp:53:21: warning: unused variable 'w' [-Wunused-variable]
   53 |   int nxt = p.first,w = p.second;
      |                     ^
cabana.cpp: In function 'void dfs(int, int)':
cabana.cpp:61:21: warning: unused variable 'w' [-Wunused-variable]
   61 |   int nxt = p.first,w = p.second;
      |                     ^
cabana.cpp: In function 'void decomposition(int)':
cabana.cpp:87:21: warning: unused variable 'w' [-Wunused-variable]
   87 |   int nxt = p.first,w = p.second;
      |                     ^
cabana.cpp:93:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   93 |  for(int i=1; i<=vals.size(); i++) init(i);
      |               ~^~~~~~~~~~~~~
cabana.cpp: In function 'int main()':
cabana.cpp:117:45: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
  117 |   for(int i=1; i<=n; i++) v[i] = fenwick[i] = 0;
      |                                  ~~~~~~~~~~~^~~
#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...