应该不是可并堆的问题吧
by DELA @ 2023-09-18 13:52:27
怎么没人回答问题
![](https://cdn.luogu.com.cn/upload/image_hosting/vmio63t7.png)
by DELA @ 2023-09-18 14:05:22
或许可以翻一下讨论区的[警示后人](https://www.luogu.com.cn/discuss/448547)+[51分求助帖](https://www.luogu.com.cn/discuss/595749)?
by Yun_Mengxi @ 2023-09-18 15:39:50
@[Yun_Mengxi](/user/758416) 看过了。。
现在改成这样了但是还是 51pts:
```
#include <iostream>
using namespace std;
int v[100005], TLE[100005], WA[100005], f[100005], rt[100005];
bool del[100005];
int merge(int x, int y) {
if (!x || !y) return x+y;
if (v[x] < v[y]) return WA[y] = TLE[x], TLE[x] = y, x; else return WA[x] = TLE[y], TLE[y] = x, y;
}
int merges(int x) {
if (!x && !WA[x]) return x;
int t = WA[WA[x]];
WA[x] = WA[WA[x]] = 0;
return merge(merge(x, WA[x]), merges(t));
}
int find(int x) {
return f[x] == x? x: f[x] = find(f[x]);
}
int main() {
int n, m, op, x, y, t;
cin >> n>> m;
for (int i=1; i<=n; i++) cin >> v[i], f[i] = i, rt[i] = i;
for (int i=1; i<=m; i++) {
cin >> op>> x;
if (op == 1) cin >> y, t = merge(rt[find(x)], rt[find(y)]), f[find(x)] = find(y), rt[find(x)] = t; else cout << (del[x] ? -1 : v[rt[find(x)]]) << endl, del[x] || (del[rt[find(x)]] = true, rt[find(x)] = merges(TLE[rt[find(x)]]));
}
}
```
by DELA @ 2023-09-18 16:04:47
@[DELA](/user/822718) 合并时要判一下是不是已经在一个堆里了。
比如这组数据:
in
5 5
1 5 4 2 3
1 1 5
1 1 5
2 1
2 5
2 5
out
1
3
-1
但是您的代码输出了三个1。。
阿巴
by Wunsch @ 2023-09-18 17:06:32
@[Wunsch](/user/889845) 谢谢,但是改过了之后还是 51pts/dk/dk 能再看看吗
```
#include <iostream>
using namespace std;
int v[100005], TLE[100005], WA[100005], f[100005], rt[100005];
bool del[100005];
int merge(int x, int y) {
if (!x || !y) return x+y;
if (v[x] < v[y]) return WA[y] = TLE[x], TLE[x] = y, x; else return WA[x] = TLE[y], TLE[y] = x, y;
}
int merges(int x) {
if (!x && !WA[x]) return x;
int t = WA[WA[x]];
WA[x] = WA[WA[x]] = 0;
return merge(merge(x, WA[x]), merges(t));
}
int find(int x) {
return f[x] == x? x: f[x] = find(f[x]);
}
int main() {
int n, m, op, x, y, t;
cin >> n>> m;
for (int i=1; i<=n; i++) cin >> v[i], f[i] = i, rt[i] = i;
for (int i=1; i<=m; i++) {
cin >> op>> x;
if (op == 1) cin >> y, find(x) != find(y) && (t = merge(rt[find(x)], rt[find(y)]), f[find(x)] = find(y), rt[find(x)] = t); else cout << (del[x] ? -1 : v[rt[find(x)]]) << endl, del[x] || (del[rt[find(x)]] = true, rt[find(x)] = merges(TLE[rt[find(x)]]));
}
}
```
by DELA @ 2023-09-18 18:45:17
还是错的,,
```
#include <iostream>
using namespace std;
int v[100005], TLE[100005], WA[100005], f[100005], rt[100005]; bool del[100005];
int merge(int x, int y) {
if (!x || !y) return x+y;
if (v[x] < v[y]) return WA[y] = TLE[x], TLE[x] = y, x; else return WA[x] = TLE[y], TLE[y] = x, y;
}
int merges(int x) {
if (!x && !WA[x]) return x;
int t = WA[WA[x]], sc84bbs = WA[x]; WA[x] = WA[WA[x]] = 0; return merge(merge(x, sc84bbs), merges(t));
}
int find(int x) {return f[x] == x? x: f[x] = find(f[x]);}
int main() {
int n, m, op, x, y, t; cin >> n>> m; for (int i=1; i<=n; i++) cin >> v[i], f[i] = i, rt[i] = i; for (int i=1; i<=m; i++) {cin >> op>> x; if (op == 1) cin >> y, find(x) != find(y) && (t = merge(rt[find(x)], rt[find(y)]), f[find(x)] = find(y), rt[find(x)] = t); else cout << (del[x] ? -1 : v[rt[find(x)]]) << endl, del[x] || (del[rt[find(x)]] = true, rt[find(x)] = merges(TLE[rt[find(x)]]));}
}
```
by DELA @ 2023-09-18 22:29:53
对不起,上面的代码是
```
#include <iostream>
using namespace std;
int v[100005], TLE[100005], WA[100005], f[100005], rt[100005];
bool del[100005];
int merge(int x, int y) {
if (!x || !y) return x+y;
if (v[x] < v[y]) return WA[y] = TLE[x], TLE[x] = y, x; else return WA[x] = TLE[y], TLE[y] = x, y;
}
int merges(int x) {
if (!x && !WA[x]) return x;
int t = WA[WA[x]], sc84bbs = WA[x];
WA[x] = WA[WA[x]] = 0;
return merge(merge(x, sc84bbs), merges(t));
}
int find(int x) {
return f[x] == x? x: f[x] = find(f[x]);
}
int main() {
int n, m, op, x, y, t;
cin >> n>> m;
for (int i=1; i<=n; i++) cin >> v[i], f[i] = i, rt[i] = i;
for (int i=1; i<=m; i++) {
cin >> op>> x;
if (op == 1) cin >> y, find(x) != find(y) && (t = merge(rt[find(x)], rt[find(y)]), f[find(x)] = find(y), rt[find(x)] = t); else cout << (del[x] ? -1 : v[rt[find(x)]]) << endl, del[x] || (del[rt[find(x)]] = true, rt[find(x)] = merges(TLE[rt[find(x)]]));
}
}
```
by DELA @ 2023-09-19 07:10:22
呃,找到一組hack,因爲沒做過,不太清楚數據是否合法
.in
~~~
5 5
2 8 9 3 1
1 4 1
2 4
1 1 3
2 3
2 4
~~~
.out
~~~
2
3
-1
~~~
.ans
~~~
2
9
3
~~~
by FatOldEight @ 2023-09-19 08:26:59
![](https://img1.imgtp.com/2023/09/19/da8u4PDE.png)
by MrPython @ 2023-09-19 09:56:28