社区讨论

WA 20pts

P4700[CEOI 2011] Traffic参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mj6onvxj
此快照首次捕获于
2025/12/15 12:58
2 个月前
此快照最后确认于
2025/12/18 17:10
2 个月前
查看原帖
RT
CPP
// 参考 https://www.luogu.com.cn/article/wf64jzrh
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
int testNo = 0;
// variables & definitions
const int N = 3e5 + 5;
struct Point {
	int x,y;
} p[N];
bool decy(int x,int y) {
	return p[x].y > p[y].y;
}
bool incy(int x,int y) {
	return p[x].y < p[y].y;
}
vector<int> w,e;
vector<int> c[N];
vector<int> inv[N];
bool vis[N];
int ansl[N];
int ansr[N];
void bfs(int x) {
	queue<int> q;
	q.emplace(x);
	vis[x] = true;
	while (!q.empty()) {
		int f = q.front();
		q.pop();
		for (int i:c[f]) {
			if (vis[i]) continue;
			vis[i] = true;
			q.emplace(i);
		}
	}
}
void solve(int x,bool cas,int n) {
	queue<int> q;
	q.emplace(x);
	if (cas) ansr[x] = n;
	else ansl[x] = n;
	while (!q.empty()) {
		int f = q.front();
		q.pop();
		for (int i:inv[f]) {
			if (cas) {
				if (!ansr[i]) ansr[i] = n,q.emplace(i);
			} else {
				if (!ansl[i]) ansl[i] = n,q.emplace(i);
			}
		}
	}
}
void doTestcase() {
	int n,m,A,B;
	cin >> n >> m >> A >> B;
	for (int i = 1; i <= n; ++i) {
		cin >> p[i].x >> p[i].y;
		if (p[i].x == 0) w.emplace_back(i);
		if (p[i].x == A) e.emplace_back(i);
	}
	sort(w.begin(),w.end(),decy);
	for (int i = 1; i <= m; ++i) {
		int u,v,t;
		cin >> u >> v >> t;
		c[u].emplace_back(v);
		inv[v].emplace_back(u);
		if (!t) {
			c[v].emplace_back(u);
			inv[u].emplace_back(v);
		}
	}
	for (int i:w) bfs(i);
	int cnt = 0;
	sort(e.begin(),e.end(),incy);
	for (int i:e) {
		if (!vis[i]) continue;
		solve(i,false,++cnt);
	}
	sort(e.begin(),e.end(),decy);
	for (int i:e) {
		if (!vis[i]) continue;
		solve(i,true,cnt--);
	}
	for (int i:w) {
		if (!ansl[i]) cout << "0\n";
		else cout << ansr[i] - ansl[i] + 1 << endl;
	}
}
signed main() {
	int t;
//	cin >> t;
	t = 1;
	while (t--) ++testNo,doTestcase();
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...