比赛 20241128 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 猴猴的比赛 最终得分 100
用户昵称 黄天宇 运行时间 3.127 s
代码语言 C++ 内存使用 20.72 MiB
提交时间 2024-11-28 11:18:33
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e5+5;
int n;
int num1,num2,head1[MAXN],head2[MAXN];
int d1[MAXN],d2[MAXN];
int fa1[MAXN],fa2[MAXN];
bool vis[MAXN];
int cnt;
int p1,p2;
vector<int> c1[MAXN],c2[MAXN];
priority_queue<pair<int,int> > q1,q2;
int find(int root,int x,int flag){
    if(flag==1){
    	if(x==fa1[x]){
    		return x;
    	}else{
    		q1.push(make_pair(root,fa1[x]));
    		return find(root,fa1[x],1);
    	}
    }else{
    	if(x==fa2[x]){
    		return x;
    	}else{
    		q2.push(make_pair(root,fa2[x]));
    		return find(root,fa2[x],2);
    	}
    }
}
int main(){
	freopen("monkeyclim.in","r",stdin);
    freopen("monkeyclim.out","w",stdout);
    cin>>n;
    for(int i=1;i<=n;i++){
    	fa1[i]=i;
    	fa2[i]=i;
    }
    for(int i=1;i<=n-1;i++){
    	int x,y;
    	cin>>x>>y;
    	if(x>y) swap(x,y);
    	fa1[y]=x;
    }
    for(int i=1;i<=n;i++){
    	int x=find(i,i,1);
    }
    for(int i=1;i<=n-1;i++){
    	int x,y;
    	cin>>x>>y;
    	if(x>y) swap(x,y);
    	fa2[y]=x;
    }
    for(int i=1;i<=n;i++){
    	int x=find(i,i,2);
    }
    while(!q1.empty()||!q2.empty()){
    	while(q1.top().first>q2.top().first){
    		q1.pop();
    	}
    	while(q1.top().first<q2.top().first){
    		q2.pop();
    	}
    	if(q1.top().second==q2.top().second){
    		cnt++;
    		q1.pop();
    		q2.pop();
    	}else
    	if(q1.top().second>q2.top().second){
    		q1.pop();
    	}else q2.pop();
    }
    cout<<cnt<<endl;
    return 0;
}