51pts 求调

P3377 【模板】左偏树/可并堆

应该不是可并堆的问题吧
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


| 下一页