Submission #1317042

#TimeUsernameProblemLanguageResultExecution timeMemory
1317042ghammazhassanRailway (BOI17_railway)C++20
0 / 100
132 ms48348 KiB
// #include <bits/stdc++.h> #include <iostream> #include <cmath> #include <algorithm> #include <map> #include <unordered_map> #include <vector> #include <iomanip> #include <string> #include <queue> #include <set> #include <deque> using namespace std; #define int long long #define endl "\n" #define fi first #define se second const int M=1e9+7; const int inf = 1e18; const int LOG=17; const int N=2e5+5; int n , m , c , w , k , t=1 , q=1 , x , y , z , l , r; vector<int>a[N]; int p[LOG][N]; int di[N]; int vl[N]; int ch[N]; map<pair<int,int>,int>d; int in[N],out[N]; vector<int> lis; void dfs(int x,int y){ in[x]=lis.size(); lis.push_back(x); for (int i:a[x]){ if (i==y)continue; ch[x]++; di[i]=di[x]+1; p[0][i]=x; dfs(i,x); } out[x]=lis.size(); lis.push_back(x); } void makest(){ for (int j=1;j<LOG;j++){ for (int i=1;i<=n;i++){ p[j][i]=p[j-1][p[j-1][i]]; } } } int bl(int x,int d){ int k=LOG-1; while(k>=0){ if (d>=(1<<k)){ x=p[k][x]; d-=(1<<k); } k--; } return x; } int lca(int x,int y){ if (di[x]>di[y]){ swap(x,y); } x=bl(x,di[y]-di[x]); if (x==y)return x; int k=LOG-1; while (k>=0){ if (p[k][x]!=p[k][y]){ x=p[k][x]; y=p[k][y]; } k--; } return p[0][x]; } bool comp(pair<int,int>x,pair<int,int>y){ return x.se-x.fi>y.se-y.fi; } void solve(){ cin >> n >> m >> k; for (int i=1;i<=n-1;i++){ cin >> x >> y; a[x].push_back(y); a[y].push_back(x); d[{x,y}]=d[{y,x}]=i; } dfs(1,0); makest(); for (int i=0;i<m;i++){ cin >> k; vector<pair<int,int>>op(k); for (int j=0;j<k;j++){ cin >> x; op[j]={in[x],out[x]}; } map<int,vector<int>>ai; sort(op.rbegin(),op.rend(),comp); set<pair<int,int>>s; map<int,int>pi; for (auto [x,y]:op){ int u=lis[x]; auto it=s.lower_bound({x,y}); while (it!=s.end()){ ai[u].push_back(lis[(*it).fi]); s.erase(*it); it=s.lower_bound({x,y}); } s.insert({x,y}); } int z=lis[(*s.begin()).fi]; queue<int>o; for (auto i:s){ z=lca(z,lis[i.fi]); o.push(lis[i.fi]); pi[lis[i.fi]]=z; } while (o.size()){ int h=o.front(); o.pop(); vl[h]++; vl[pi[h]]--; for (int i:ai[h]){ o.push(i); pi[i]=h; } } } queue<int>o; vector<int>vi(n+1); for (int i=1;i<=n;i++){ if (!ch[i]){ o.push(i); vi[i]=1; } } vector<int>jk; while (o.size()){ int h=o.front(); o.pop(); for (int i:a[h]){ if (vi[i])continue; ch[i]--; if (vl[h]>=k){ jk.push_back(d[{i,h}]); } vl[i]+=vl[h]; if (!ch[i]){ o.push(i); vi[i]=1; } } } // for (int i=1;i<=n;i++){ // cout << vl[i] << " "; // } // cout << endl; sort(jk.begin(),jk.end()); cout << jk.size() << endl; for (int i:jk){ cout << i << " "; } cout << endl; } signed main() { ios::sync_with_stdio(0);//DO NOT USE IN INTERACTIVE cin.tie(0), cout.tie(0);//DO NOT USE IN INTERACTIVE cout << fixed << setprecision(9); srand(time(0)); // int t=1; // cin >> t; for (int _=1;_<=t;_++){ solve(); q++; } }
#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...