社区讨论
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 条回复,欢迎继续交流。
正在加载回复...