Submission #718191

#TimeUsernameProblemLanguageResultExecution timeMemory
718191starplatRailway (BOI17_railway)C++14
100 / 100
259 ms26136 KiB
#include <bits/stdc++.h> using namespace std; int n,m,k,u,v,tin,diff[100005],s[100005]; int in[100005],out[100005],lift[25][100005]; vector<pair<int,int> > grh[100005]; bool is(int x,int y){ return in[x]<=in[y] && out[x]>=out[y]; } int lca(int x,int y){ if (is(x,y)) return x; if (is(y,x)) return y; for (int i=20;i>=0;i--){ if (lift[i][x] && !is(lift[i][x],y)){ x=lift[i][x]; } } return lift[0][x]; } void euler(int x,int p){ in[x]=++tin; lift[0][x]=p; for (int i=1;i<=20;i++) { lift[i][x]=lift[i-1][lift[i-1][x]]; } for (auto i:grh[x]) { if (i.first!=p) euler(i.first,x); } out[x]=++tin; } bool cp(int x,int y){ return in[x]<in[y]; } vector<int> ans; void dfs(int x,int p){ for (auto i:grh[x]){ if (i.first!=p){ dfs(i.first,x); diff[x]+=diff[i.first]; if (diff[i.first]>=k) ans.push_back(i.second); } } } int main(){ cin>>n>>m>>k; for (int i=1;i<n;i++){ cin>>u>>v; grh[u].push_back({v,i}); grh[v].push_back({u,i}); } euler(1,0); in[n+1]=out[n+1]=INT_MAX; while (m--){ int k; cin>>k; int anc=0; for (int i=1;i<=k;i++) { cin>>s[i]; if (i==1) anc=s[i]; else anc=lca(anc,s[i]); } s[k+1]=n+1; sort(s+1,s+1+k,cp); vector<int> imp,vt; set<pair<int,int> > implca; for (int i=1;i<=k;i++){ if (out[s[i]]<in[s[i+1]]) { imp.push_back(s[i]); implca.insert({in[s[i]],s[i]}); diff[s[i]]++; } } for (int i=1;i<imp.size();i++){ int nde=lca(imp[i-1],imp[i]); if (nde!=anc) { implca.insert({in[nde],nde}); } } for (auto it=implca.begin();it!=implca.end();it++) vt.push_back(it->second); sort(vt.begin(),vt.end(),cp); vt.push_back(n+1); for (int i=vt.size()-2;i>=0;i--){ auto lt=implca.lower_bound({in[vt[i]]+1,-1}); auto rt=implca.upper_bound({out[vt[i]],-1}); vector<set<pair<int,int>>::iterator> tr; for (auto it=lt;it!=implca.end();it++){ if (is(vt[i],it->second)) tr.push_back(it); } if (tr.empty()) continue; diff[vt[i]]=diff[vt[i]]-(int)tr.size()+1; //cout<<vt[i]<<" "<<tr.size()<<"\n"; for (auto it:tr) implca.erase(it); } int cnt=implca.size(); // cout<<cnt<<"\n"; diff[anc]-=cnt; } dfs(1,0); // for (int i=1;i<=n;i++) cout<<diff[i]<<" ";cout<<"\n"; sort(ans.begin(),ans.end()); cout<<ans.size()<<"\n"; if (ans.empty()) return 0; cout<<ans[0]; for (int i=1;i<ans.size();i++) cout<<" "<<ans[i]; cout<<"\n"; } /* 13 1 1 1 2 2 3 3 4 3 5 3 6 6 7 7 8 7 9 6 10 3 11 11 12 11 13 8 2 4 5 8 9 10 12 13 */

Compilation message (stderr)

railway.cpp: In function 'int main()':
railway.cpp:72:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   72 |   for (int i=1;i<imp.size();i++){
      |                ~^~~~~~~~~~~
railway.cpp:82:9: warning: variable 'rt' set but not used [-Wunused-but-set-variable]
   82 |    auto rt=implca.upper_bound({out[vt[i]],-1});
      |         ^~
railway.cpp:102:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  102 |  for (int i=1;i<ans.size();i++) cout<<" "<<ans[i];
      |               ~^~~~~~~~~~~
#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...