社区讨论
90pts #10MLE求调
P1955[NOI2015] 程序自动分析参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mit07934
- 此快照首次捕获于
- 2025/12/05 23:12 3 个月前
- 此快照最后确认于
- 2025/12/07 17:35 3 个月前
分,第 个测试点 MLE。以下是代码。
CPP#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
// 离散化 + 并查集
int n, id[N*2], bid[N*2];
struct Question{
int x, y; bool e;
bool operator < (const Question& other) const{
return e > other.e;
}
}q[N];
// 离散化 函数
void Disc(){
for(int i=1; i<=n*2; i++)
bid[i] = id[i];
sort(bid + 1, bid + n + 1);
int m = unique(bid + 1, bid + n*2 + 1) - (bid + 1);
for(int i=1; i<=n*2; i++){
int p = lower_bound(bid + 1, bid + m + 1, id[i]) - bid;
id[i] = p;
}
}
// 并查集模板 好好背!
int f[N];
int find(int x){
if(x == f[x]) return x;
return f[x] = find(f[x]);
}
void merge(int x, int y){
int fx = find(x), fy = find(y);
if(fx != fy) f[fx] = fy;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int T; cin >> T;
while(T--){
cin >> n;
// 并查集初始化
for(int i=1; i<=1e5; i++)
f[i] = i;
for(int i=1; i<=n; i++){
int x, y, e; cin >> x >> y >> e;
id[2*i-1] = x, id[2*i] = y;
q[i].e = e;
}
for(int i=1; i<=n; i++)
q[i].x = id[i*2-1], q[i].y = id[i*2];
// 先处理 e=1.
sort(q + 1, q + n + 1);
bool flag = 1;
for(int i=1; i<=n; i++){
int x = q[i].x, y = q[i].y;
// e=1, 合并.
if(q[i].e)
// 合并 x, y.
merge(x, y);
// e=0, 在同一个集时存在矛盾.
else if(find(x) == find(y)){
cout << "NO\n";
flag = 0; break;
}
}
if(flag) cout << "YES\n";
}
}
好笑的是,我发现自己写了一顿的 Disc 离散化函数没有调用 qwq,于是加上了。以下是代码。
CPP#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
// 离散化 + 并查集
int n, id[N*2], bid[N*2];
struct Question{
int x, y; bool e;
bool operator < (const Question& other) const{
return e > other.e;
}
}q[N];
// 离散化 函数
void Disc(){
for(int i=1; i<=n*2; i++)
bid[i] = id[i];
sort(bid + 1, bid + n + 1);
int m = unique(bid + 1, bid + n*2 + 1) - (bid + 1);
for(int i=1; i<=n*2; i++){
int p = lower_bound(bid + 1, bid + m + 1, id[i]) - bid;
id[i] = p;
}
}
// 并查集模板 好好背!
int f[N];
int find(int x){
if(x == f[x]) return x;
return f[x] = find(f[x]);
}
void merge(int x, int y){
int fx = find(x), fy = find(y);
if(fx != fy) f[fx] = fy;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int T; cin >> T;
while(T--){
cin >> n;
// 并查集初始化
for(int i=1; i<=1e5; i++)
f[i] = i;
for(int i=1; i<=n; i++){
int x, y, e; cin >> x >> y >> e;
id[2*i-1] = x, id[2*i] = y;
q[i].e = e;
}
// 离散化...?
Disc();
for(int i=1; i<=n; i++)
q[i].x = id[i*2-1], q[i].y = id[i*2];
// 先处理 e=1.
sort(q + 1, q + n + 1);
bool flag = 1;
for(int i=1; i<=n; i++){
int x = q[i].x, y = q[i].y;
// e=1, 合并.
if(q[i].e)
// 合并 x, y.
merge(x, y);
// e=0, 在同一个集时存在矛盾.
else if(find(x) == find(y)){
cout << "NO\n";
flag = 0; break;
}
}
if(flag) cout << "YES\n";
}
}
更好笑的是,改完之后只得 分……
有 WA,# 依旧 MLE。
有 WA,# 依旧 MLE。
回复
共 0 条回复,欢迎继续交流。
正在加载回复...