제출 #1126742

#제출 시각아이디문제언어결과실행 시간메모리
1126742doducanhRailway (BOI17_railway)C++20
100 / 100
73 ms23268 KiB
///roadtoVOI2025 ///enjoythejourney #include<bits/stdc++.h> using namespace std; #define ll long long #define fi first #define se second #define ii pair<int,int> #define mp make_pair #define in(x) freopen(x,"r",stdin) #define out(x) freopen(x,"w",stdout) #define bit(x,i) ((x>>i)&1) #define lc (id<<1) #define rc ((id<<1)^1) const int maxn=1e5+7; vector<ii>adj[maxn]; int p[25][maxn]; int in[maxn],out[maxn]; int h[maxn]; int cnt=0; int n,m,k; int t[maxn]; int dinh[maxn]; void dfs(int u,int par) { in[u]=++cnt; for(auto [v,id]:adj[u])if(v!=par){ p[0][v]=u; dinh[v]=id; h[v]=h[u]+1; dfs(v,u); } out[u]=cnt; } int lca(int u,int v) { if(h[u]<h[v])swap(u,v); int diff=h[u]-h[v]; for(int i=20;i>=0;i--)if(bit(diff,i))u=p[i][u]; if(u==v)return u; for(int i=20;i>=0;i--)if(p[i][u]!=p[i][v]){ u=p[i][u]; v=p[i][v]; } return p[0][u]; } void up(int x,int val) { for(;x<maxn;x+=(x&(-x)))t[x]+=val; } int get(int x) { int res=0; if(x<=0)return 0; for(;x;x-=(x&(-x)))res+=t[x]; return res; } void sol() { cin>>n>>m>>k; for(int i=1;i<n;i++){ int u,v; cin>>u>>v; adj[u].push_back({v,i}); adj[v].push_back({u,i}); } dfs(1,0); for(int i=1;i<=20;i++){ for(int j=1;j<=n;j++){ p[i][j]=p[i-1][p[i-1][j]]; } } for(int i=1;i<=m;i++){ int s; cin>>s; vector<int>v; for(int j=1;j<=s;j++){ int x; cin>>x; v.push_back(x); } sort(v.begin(),v.end(),[&](const int &a,const int &b){ return in[a]<in[b]; }); v.push_back(v[0]); for(int i=0;i<v.size()-1;i++){ int l=lca(v[i],v[i+1]); up(in[v[i]],1); up(in[v[i+1]],1); up(in[l],-2); } } vector<int>ans; for(int i=1;i<=n;i++){ if(get(out[i])-get(in[i]-1)>=2*k)ans.push_back(dinh[i]); } sort(ans.begin(),ans.end()); cout<<ans.size()<<"\n"; for(int x:ans){ cout<<x<<" "; } } signed main(void) { ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); int t=1; while(t--){ sol(); } // you should actually read the stuff at the bottom return 0; } /* stuff you should look for * int overflow, array bounds * special cases (n=1?) * do smth instead of nothing and stay organized * WRITE STUFF DOWN * DON'T GET STUCK ON ONE APPROACH */
#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...