今晚ABC D WA*4求调
  • 板块学术版
  • 楼主SegmentTree_
  • 当前回复4
  • 已保存回复4
  • 发布时间2023/11/4 22:01
  • 上次更新2023/11/5 08:20:59
查看原帖
今晚ABC D WA*4求调
716260
SegmentTree_楼主2023/11/4 22:01
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+5;
const int inf = INT_MAX;
int head[N], to[N], nxt[N], a[N], b[N], cnt, cnt1[N];
int n, m;
int vis[N];
bool vis1[N], flag;
void add(int a, int b){
	to[++cnt] = b;
	nxt[cnt] = head[a];
	head[a] = cnt;
}
void dfs(int u, int fa){
	if (fa == 0) ;
	else if (vis[fa] == 1) vis[u] = 2;
	else if (vis[fa] == 2) vis[u] = 1;
	//cout << u << ' ' << fa << ' ' << vis[u] << '\n';
	for (int i = head[u];i;i = nxt[i]){
		int v = to[i];
		if (v == fa) continue;
		if (vis[v]){
			if (fa == 0 && !cnt1[u]){
				if (vis[v] == 1) vis[u] = 2;
				else if (vis[v] == 2) vis[u] = 1;
			}
			if (vis[u] == vis[v]){
				//cout << u << ' ' << v << "Wrong\n";
				flag = 1;
				return;
			}
			continue;
		}
		//cout << u << ' ' << v << '\n';
		++cnt1[u];
		dfs(v, u);
	}
}
int main(){ 
	cin >> n >> m;
	for (int i = 1;i <= m;i++){
		cin >> a[i];
	}
	for (int i = 1;i <= m;i++){
		cin >> b[i];
		add(a[i], b[i]);
		//add(b[i], a[i]);
		if (a[i] == b[i]){
			cout << "No";
			return 0;
		}
	}
	for (int i = 1;i <= n;i++){
		if (vis[i]) continue;
		vis[i] = 1;
		//cout << i << "111" << '\n';
		dfs(i, 0);
	}
	//for (int i = 1;i <= n;i++) cout << vis[i] - 1 << ' ';
	//cout << '\n';
	if (!flag) cout << "Yes";
	else cout << "No";
	return 0;
}
2023/11/4 22:01
加载中...