제출 #1144856

#제출 시각아이디문제언어결과실행 시간메모리
1144856thelegendary08Railway (BOI17_railway)C++17
36 / 100
126 ms45752 KiB
#include<bits/stdc++.h> #define pb push_back #define mp make_pair #define int long long #define vi vector<int> #define vvi vector<vector<int>> #define pii pair<int, int> #define vpii vector<pair<int, int>> #define vc vector<char> #define vb vector<bool> #define mii map<int,int> #define f0r(i,n) for(int i=0;i<n;i++) #define FOR(i,k,n) for(int i=k;i<n;i++) #define all(v) (v).begin(),(v).end() #define rall(v) (v).rbegin(),(v).rend() #define in(a) int a; cin>>a #define in2(a,b) int a,b; cin>>a>>b #define in3(a,b,c) int a,b,c; cin>>a>>b>>c #define in4(a,b,c,d) int a,b,c,d; cin>>a>>b>>c>>d #define vin(v,n); vi v(n); f0r(i,n){cin>>v[i];} #define out(a) cout<<a<<'\n' #define out2(a,b) cout<<a<<' '<<b<<'\n' #define out3(a,b,c) cout<<a<<' '<<b<<' '<<c<<'\n' #define out4(a,b,c,d) cout<<a<<' '<<b<<' '<<c<<' '<<d<<'\n' #define vout(v) for(auto u : v){cout<<u<<' ';} cout<<'\n' #define dout(a) cout<<a<<' '<<#a<<'\n' #define dout2(a,b) cout<<a<<' '<<#a<<' '<<b<<' '<<#b<<'\n' #define yn(x); if(x){cout<<"YES"<<'\n';}else{cout<<"NO"<<'\n';} const int leg = 1e9 + 7; const int mod = 998244353; using namespace std; const int mxn = 2e5 + 5; vi adj[mxn]; vi tree(mxn * 4); int v[mxn]; vi dep(mxn); vi par(mxn); vi head(mxn); vi pos(mxn); vi sz(mxn); vi heavy(mxn); int timer = 0; vi et; vi unet(mxn); int dfs(int node, int p){ int sts = 1; par[node] = p; int mx = 0; int mxd = -1; et.pb(node); for(auto u : adj[node]){ if(u != p){ dep[u] = dep[node] + 1; int s = dfs(u, node); sts += s; if(s > mx){ mx = s; mxd = u; } } } heavy[node] = mxd; sz[node] = sts; return sts; } void construct(int node, int h){ head[node] = h; pos[node] = timer++; if(heavy[node] != -1)construct(heavy[node], h); for(auto u : adj[node]){ if(u != par[node] && u != heavy[node]){ construct(u, u); } } } int n,m,k; void update(int k, int x){ k += n; tree[k] += x; for(k/=2; k>=1; k/=2){ tree[k] = tree[k*2] + tree[k*2+1]; } } int quer(int l, int r){ //dout2(l,r); l += n; r += n; int ret = 0; while(l <= r){ if(l % 2 == 1)ret += tree[l++]; if(r % 2 == 0)ret += tree[r--]; l /= 2; r /= 2; } return ret; } void rangeupdate(int l, int r){ update(l, 1); if(r != n-1){ update(r+1, -1); } } void rangeunupdate(int l, int r){ update(l, -1); if(r != n-1){ update(r+1, 1); } } int pointquer(int x){ return quer(0, x); } void pathadd(int a, int b){ //out2(a,b); a--; b--; for(; head[a] != head[b]; b = par[head[b]]){ if(dep[head[a]] > dep[head[b]]){ swap(a,b); } rangeupdate(pos[head[b]], pos[b]); } if(dep[a] > dep[b]){ swap(a,b); } rangeupdate(pos[a]+1, pos[b]); //rangeunupdate(pos[a], pos[a]); } signed main(){ ios::sync_with_stdio(false); cin.tie(NULL); //ifstream cin(".in"); //ofstream cout(".out"); cin>>n>>m>>k; vpii edges; f0r(i,n-1){ in2(a,b); a--; b--; adj[a].pb(b); adj[b].pb(a); edges.pb(mp(a,b)); } dfs(0,-1); f0r(i,n){ unet[et[i]] = i; } //vout(et); construct(0,0); //f0r(i,n)cout<<pos[i]<<' '; //cout<<'\n'; mii ma; f0r(i,n-1){ if(dep[edges[i].first] > dep[edges[i].second]){ ma[edges[i].first] = i+1; } else ma[edges[i].second] = i+1; } f0r(i,m){ in(s); vi w(s); f0r(j,s)cin>>w[j]; vpii x; f0r(j,s){ x.pb(mp(unet[w[j]-1], w[j])); } sort(all(x)); x.pb(x[0]); f0r(j,s){ pathadd(x[j].second, x[j+1].second); } } vi ans; FOR(i, 1, n){ if(pointquer(pos[i]) >= 2*k){ ans.pb(ma[i]); } } out(ans.size()); for(auto u : ans)cout<<u<<' '; }
#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...