답안 #519829

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
519829 2022-01-27T11:29:39 Z new_acc 수도 (JOI20_capital_city) C++14
11 / 100
3000 ms 408600 KB
#include<bits/stdc++.h>
#define fi first
#define se second
#define rep(a, b) for(int a = 0; a < (b); a++)
#pragma GCC optimize("O2")
using namespace std;
typedef long long ll;
typedef vector<ll> vi;
typedef vector<ll> vl;
const int N=2e5+10;
const int L=19;
const int M=4e6+5e5;
vi graf[N],r[N],graf2[M];
int t[N],gl[N],spojna[M],ile[M],pre[N],post[M],kon[M];
pair<int,int> jump[N][L+1];
int l=0,l2=0,n,k;
bitset<M>kan;
bitset<M>vis;
void add(int a,int b){
	graf2[a].push_back(b);
}
void dfs(int v,int o,int g){
	pre[v]=++l2;
	gl[v]=g;
	jump[v][0]={o,++l};
	add(l,t[o-1]);
	for(int j=1;j<=L;j++) jump[v][j].fi=jump[jump[v][j-1].fi][j-1].fi,jump[v][j].se=++l,add(l,jump[v][j-1].se),add(l,jump[jump[v][j-1].fi][j-1].se);
	for(auto u:graf[v]){
		if(u==o) continue;
		dfs(u,v,g+1);
	}
}
int lca(int a,int b){
	if(gl[a]<gl[b]) swap(a,b);
	for(int i=L;i>=0;i--) if(gl[jump[a][i].fi]>=gl[b]) a=jump[a][i].fi;
	if(a==b) return a;
	int res=0;
	for(int i=L;i>=0;i--){
		if(jump[a][i].fi==jump[b][i].fi) res=jump[a][i].fi;
		else a=jump[a][i].fi,b=jump[b][i].fi;
	}
	return res;
}
void dod(int a,int l,int x){
	for(int i=L;i>=0;i--) if(gl[jump[a][i].fi]>=gl[l]) add(x,jump[a][i].se),a=jump[a][i].fi;
}
void dfs2(int v){
	if(vis[v]) return;
	vis[v]=1;
	for(auto u:graf2[v]) dfs2(u);
	post[l2++]=v;
}
void dfs3(int v,int s){
	vis[v]=1;
	spojna[v]=s;
	if(v<=k-1) ile[s]++;
	for(auto u:graf2[v])
	{
		if(!vis[u]) dfs3(u,s);
		else if(spojna[u]!=s) kan[spojna[u]]=1;
	}
}
void odw(){
	rep(i,l+1) kon[i]=graf2[i].size();
	rep(i,l+1) {
		for(int j=kon[i]-1;j>=0;j--) graf2[graf2[i][j]].push_back(i),swap(graf2[i][j],graf2[i][graf2[i].size()-1]),graf2[i].pop_back();
		graf2[i].shrink_to_fit();
	}
}
void solve(){
	cin>>n>>k;
	rep(i,n-1){
		int a,b;
		cin>>a>>b;
		graf[a].push_back(b),graf[b].push_back(a);
	}
	l=k-1;
	rep(i,n){
		cin>>t[i];
		t[i]--;
		r[t[i]].push_back(i+1);
	}
	dfs(1,1,1);
	vector<pair<int,int> >vv;
	rep(i,k){	
		vv.clear();
		for(auto u:r[i]) vv.push_back({pre[u],u});
		sort(vv.begin(),vv.end());
		for(int j=1;j<vv.size();j++){
			int l=lca(vv[j].se,vv[j-1].se);
			dod(vv[j].se,l,i),dod(vv[j-1].se,l,i);
		}
	}
	l2=0;
	rep(i,l+1) dfs2(i);
	rep(i,l+1) vis[i]=0;
	odw();
	int curr=0;
	for(int i=l;i>=0;i--) if(!vis[post[i]]) dfs3(post[i],++curr);
	int res=INT_MAX;
	rep(i,l+1) if(!kan[spojna[i]]) res=min(res,ile[spojna[i]]);
	cout<<res-1<<"\n";
}
int main(){
	ios_base::sync_with_stdio(0),cin.tie(0);
	solve();
}

Compilation message

capital_city.cpp: In function 'void solve()':
capital_city.cpp:89:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   89 |   for(int j=1;j<vv.size();j++){
      |               ~^~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 62 ms 115348 KB Output is correct
2 Correct 66 ms 115416 KB Output is correct
3 Correct 57 ms 115436 KB Output is correct
4 Correct 53 ms 115552 KB Output is correct
5 Correct 58 ms 115464 KB Output is correct
6 Correct 62 ms 115380 KB Output is correct
7 Correct 60 ms 115468 KB Output is correct
8 Correct 55 ms 115400 KB Output is correct
9 Correct 55 ms 115468 KB Output is correct
10 Correct 58 ms 115400 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 62 ms 115348 KB Output is correct
2 Correct 66 ms 115416 KB Output is correct
3 Correct 57 ms 115436 KB Output is correct
4 Correct 53 ms 115552 KB Output is correct
5 Correct 58 ms 115464 KB Output is correct
6 Correct 62 ms 115380 KB Output is correct
7 Correct 60 ms 115468 KB Output is correct
8 Correct 55 ms 115400 KB Output is correct
9 Correct 55 ms 115468 KB Output is correct
10 Correct 58 ms 115400 KB Output is correct
11 Correct 66 ms 118464 KB Output is correct
12 Correct 66 ms 118584 KB Output is correct
13 Correct 67 ms 118520 KB Output is correct
14 Correct 78 ms 118552 KB Output is correct
15 Correct 65 ms 118128 KB Output is correct
16 Correct 66 ms 118120 KB Output is correct
17 Correct 62 ms 118216 KB Output is correct
18 Correct 62 ms 118048 KB Output is correct
19 Correct 61 ms 118288 KB Output is correct
20 Correct 63 ms 118084 KB Output is correct
21 Correct 64 ms 118124 KB Output is correct
22 Correct 65 ms 118272 KB Output is correct
23 Correct 67 ms 119236 KB Output is correct
24 Correct 63 ms 118080 KB Output is correct
25 Correct 76 ms 118192 KB Output is correct
26 Correct 80 ms 118012 KB Output is correct
27 Correct 68 ms 118148 KB Output is correct
28 Correct 67 ms 118044 KB Output is correct
29 Correct 66 ms 118148 KB Output is correct
30 Correct 67 ms 118192 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 3073 ms 408600 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 62 ms 115348 KB Output is correct
2 Correct 66 ms 115416 KB Output is correct
3 Correct 57 ms 115436 KB Output is correct
4 Correct 53 ms 115552 KB Output is correct
5 Correct 58 ms 115464 KB Output is correct
6 Correct 62 ms 115380 KB Output is correct
7 Correct 60 ms 115468 KB Output is correct
8 Correct 55 ms 115400 KB Output is correct
9 Correct 55 ms 115468 KB Output is correct
10 Correct 58 ms 115400 KB Output is correct
11 Correct 66 ms 118464 KB Output is correct
12 Correct 66 ms 118584 KB Output is correct
13 Correct 67 ms 118520 KB Output is correct
14 Correct 78 ms 118552 KB Output is correct
15 Correct 65 ms 118128 KB Output is correct
16 Correct 66 ms 118120 KB Output is correct
17 Correct 62 ms 118216 KB Output is correct
18 Correct 62 ms 118048 KB Output is correct
19 Correct 61 ms 118288 KB Output is correct
20 Correct 63 ms 118084 KB Output is correct
21 Correct 64 ms 118124 KB Output is correct
22 Correct 65 ms 118272 KB Output is correct
23 Correct 67 ms 119236 KB Output is correct
24 Correct 63 ms 118080 KB Output is correct
25 Correct 76 ms 118192 KB Output is correct
26 Correct 80 ms 118012 KB Output is correct
27 Correct 68 ms 118148 KB Output is correct
28 Correct 67 ms 118044 KB Output is correct
29 Correct 66 ms 118148 KB Output is correct
30 Correct 67 ms 118192 KB Output is correct
31 Execution timed out 3073 ms 408600 KB Time limit exceeded
32 Halted 0 ms 0 KB -