제출 #169950

#제출 시각아이디문제언어결과실행 시간메모리
169950moonrabbit2Railway (BOI17_railway)C++17
100 / 100
322 ms24048 KiB
#include <bits/stdc++.h>
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef double db;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef pair<db,db> pdb;
typedef tuple<int,int,int> tii;
typedef tuple<ll,ll,ll> tll;
typedef vector<vector<ll>> mat;
const ll mod=1e9+7;
const int N=1e5+5;
int n,q,k;
int in[N],out[N],rev[N],cur,h[N],p[18][N],ep[N],s[N];
int tree[4*N];
vector<pii> g[N];
vector<int> ans;
void upd(int nd,int l,int r,int x,int v){
	if(l==r){
		tree[nd]=v;
		return;
	}
	int m=(l+r)>>1;
	if(x<=m) upd(nd<<1,l,m,x,v);
	else upd(nd<<1|1,m+1,r,x,v);
	tree[nd]=min(tree[nd<<1],tree[nd<<1|1]);
}
int qry(int nd,int l,int r,int s,int e){
	if(r<s||e<l) return 1e9;
	if(s<=l&&r<=e) return tree[nd];
	int m=(l+r)>>1;
	return min(qry(nd<<1,l,m,s,e),qry(nd<<1|1,m+1,r,s,e));
}
void dfs(int u){
	in[u]=++cur; rev[in[u]]=u;
	for(auto &it : g[u]) if(it.fi!=p[0][u]){
		p[0][it.fi]=u;
		ep[it.fi]=it.se;
		h[it.fi]=h[u]+1;
		dfs(it.fi);
	}
	out[u]=cur;
}
int lca(int u,int v){
	if(h[u]>h[v]) swap(u,v);
	int d=h[v]-h[u];
	for(int bit=17;bit>=0;bit--) if(d&(1<<bit)) v=p[bit][v];
	if(u==v) return u;
	for(int bit=17;bit>=0;bit--) if(p[bit][u]!=p[bit][v]){
		u=p[bit][u]; v=p[bit][v];
	}
	return p[0][u];
}
void dfs2(int u){
	upd(1,1,n,in[u],1e9);
	while(qry(1,1,n,in[u],out[u])!=1e9){
		int v=rev[qry(1,1,n,in[u],out[u])];
		s[v]++; s[u]--;
		dfs2(v);
	}
}
void dfs3(int u){
	for(auto &it : g[u]) if(it.fi!=p[0][u]){
		dfs3(it.fi);
		s[u]+=s[it.fi];
	}
	if(s[u]>=k) ans.emplace_back(ep[u]);
}
int main(){
    ios::sync_with_stdio(false); cin.tie(0);
    cin>>n>>q>>k;
	for(int u,v,i=1;i<n;i++){
		cin>>u>>v;
		g[u].emplace_back(v,i);
		g[v].emplace_back(u,i);
	}
	dfs(1);
	for(int bit=1;bit<18;bit++) for(int i=1;i<=n;i++) p[bit][i]=p[bit-1][p[bit-1][i]];
	for(int i=1;i<=n;i++) upd(1,1,n,i,1e9);
	for(int s,i=1;i<=q;i++){
		vector<int> vec;
		cin>>s;
		int u=-1;
		for(int v,j=1;j<=s;j++){
			cin>>v;
			vec.emplace_back(in[v]);
			if(u==-1) u=v;
			u=lca(u,v);
		}
		sort(vec.begin(),vec.end());
		for(auto &it : vec) upd(1,1,n,it,it);
		for(int j=1;j<vec.size();j++){
			int uv=lca(rev[vec[j-1]],rev[vec[j]]);
			upd(1,1,n,in[uv],in[uv]);
		}
		dfs2(u);
	}
	dfs3(1);
	sort(ans.begin(),ans.end());
	cout<<ans.size()<<"\n";
	for(auto &it : ans) cout<<it<<" ";
    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

railway.cpp: In function 'int main()':
railway.cpp:94:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int j=1;j<vec.size();j++){
               ~^~~~~~~~~~~
#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...