답안 #404062

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
404062 2021-05-13T18:03:31 Z errorgorn 족보 (KOI18_family) C++17
0 / 100
23 ms 30796 KB
//雪花飄飄北風嘯嘯
//天地一片蒼茫

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/rope>
using namespace std;
using namespace __gnu_pbds;
using namespace __gnu_cxx;
#define ll long long
#define ii pair<ll,ll>
#define iii pair<ii,ll>
#define fi first
#define se second
#define endl '\n'
#define debug(x) cout << #x << " is " << x << endl

#define pub push_back
#define pob pop_back
#define puf push_front
#define pof pop_front
#define lb lower_bound
#define ub upper_bound

#define rep(x,start,end) for(auto x=(start)-((start)>(end));x!=(end)-((start)>(end));((start)<(end)?x++:x--))
#define all(x) (x).begin(),(x).end()
#define sz(x) (int)(x).size()

#define indexed_set tree<ll,null_type,less<ll>,rb_tree_tag,tree_order_statistics_node_update>
//change less to less_equal for non distinct pbds, but erase will bug

mt19937 rng(chrono::system_clock::now().time_since_epoch().count());

int n1,n2,k;
vector<int> al[600010];
int root1,root2;

vector<int> cc[600010];
int ss[600010];

vector<int> proc;

int dfs(int i){
	if (i<=k || (300005<i && i<=k+300005)){
		ss[i]=1;
		return i%300005;
	}
	else{
		for (auto &it:al[i]){
			cc[i].pub(dfs(it));
			ss[i]+=ss[it];
		}
		
		proc.pub(i);
		return cc[i][0];
	}
}

struct DSU{
	int p[300005];
	int s[300005];
	
	DSU(){
		rep(x,0,300005) p[x]=x,s[x]=1;
	}
	
	int par(int i){
		if (p[i]==i) return i;
		else return p[i]=par(p[i]);
	}
	
	void unions(int i,int j){
		i=par(i),j=par(j);
		if (i==j) return;
		
		if (s[i]>s[j]) swap(i,j);
		p[i]=j;
		s[j]+=s[i];
	}
} dsu=DSU();

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin.exceptions(ios::badbit | ios::failbit);
	
	cin>>n1>>n2>>k;
	
	int t;
	rep(x,1,n1+1){
		cin>>t;
		if (t==0) root1=x;
		else al[t].pub(x);
	}
	
	rep(x,1,n2+1){
		cin>>t;
		if (t==0) root2=x+300005;
		else al[t+300005].pub(x+300005);
	}
	
	dfs(root1);
	dfs(root2);
	
	sort(all(proc),[](int i,int j){
		return ss[i]<ss[j];
	});
	
	for (auto &it:proc){
		//cout<<it<<endl;
		
		rep(x,0,sz(cc[it])-1){
			dsu.unions(cc[it][x],cc[it][x+1]);
		}
		
		if (dsu.s[dsu.par(cc[it][0])]!=ss[it]){
			cout<<"NO"<<endl;
			return 0;
		}
	}
	
	cout<<"YES"<<endl;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 20 ms 30796 KB Output is correct
2 Incorrect 23 ms 30796 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 20 ms 30796 KB Output is correct
2 Incorrect 23 ms 30796 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 20 ms 30796 KB Output is correct
2 Incorrect 23 ms 30796 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 20 ms 30796 KB Output is correct
2 Incorrect 23 ms 30796 KB Output isn't correct
3 Halted 0 ms 0 KB -