社区讨论
TLE 80pts 求调,码风良好
P3402【模板】可持久化并查集参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mjierlwn
- 此快照首次捕获于
- 2025/12/23 17:54 2 个月前
- 此快照最后确认于
- 2025/12/26 08:00 2 个月前
CPP
#include <bits/stdc++.h>
#pragma GCC optimize(2)
#pragma GCC optimize(3)
namespace FastIO {
static char buf[1000005], *p1 = buf, *p2 = buf, obuf[1000005], *p3 = obuf;
inline char nc() {
return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1000005, stdin), p1 == p2) ? EOF : *p1 ++;
}
inline void pc(char x) {
p3 - obuf < 1000000 ? (*p3 ++ = x) : (fwrite(obuf, p3 - obuf, 1, stdout), p3 = obuf, *p3 ++ = x);
}
int rd() {
int res = 0, f = 0;
char ch = nc();
while(ch < '0' || ch > '9') f |= ch == '-', ch = nc();
while(ch >= '0' && ch <= '9') res = (res << 1) + (res << 3) + (ch ^ 48), ch = nc();
return f ? ~res + 1 : res;
}
inline void wt(int x) {
if(x < 0) x = ~x + 1, pc('-');
if(x > 9) wt(x / 10);
pc(x % 10 + 48);
}
}
using namespace FastIO;
using namespace std;
using ll = long long;
using ld = long double;
using ull = unsigned long long;
using ai2 = array<int, 2>;
const int N = 2e5 + 10;
int n, m;
int tot, rt[N], ls[N * 111], rs[N * 111], fa[N * 111], dep[N * 111];
void build(int &u, int s = 1, int t = n) {
u = ++ tot;
if(s == t) {
fa[u] = s;
return;
}
int mid = s + t >> 1;
build(ls[u], s, mid), build(rs[u], mid + 1, t);
}
int find(int u, int x, int s = 1, int t = n) {
if(s == t) return u;
int mid = s + t >> 1;
if(x <= mid) return find(ls[u], x, s, mid);
return find(rs[u], x, mid + 1, t);
}
int fd(int k, int x) {
int idx = find(rt[k], x);
if(fa[idx] != x) return fd(k, fa[idx]);
return x;
}
void modifyfa(int q, int &p, int x, int fth, int s = 1, int t = n) {
p = ++ tot;
ls[p] = ls[q], rs[p] = rs[q];
if(s == t) {
fa[p] = fth;//, dep[p] = dep[q];
return ;
}
int mid = s + t >> 1;
if(x <= mid) modifyfa(ls[q], ls[p], x, fth, s, mid);
else modifyfa(rs[q], rs[p], x, fth, mid + 1, t);
}
void modifydep(int q, int &p, int x, int s = 1, int t = n) {
p = ++ tot;
ls[p] = ls[q], rs[p] = rs[q];
if(s == t) {
fa[p] = fa[q], dep[p] = dep[q] + 1;
return ;
}
int mid = s + t >> 1;
if(x <= mid) modifydep(ls[q], ls[p], x, s, mid);
else modifydep(rs[q], rs[p], x, mid + 1, t);
}
void merge(int k, int x, int y) {
int fx = fd(k - 1, x), fy = fd(k - 1, y);
if(fx == fy) {rt[k] = rt[k - 1]; return ;}
int idx = find(rt[k - 1], fx), idy = find(rt[k - 1], fy);
if(dep[idx] < dep[idy]) swap(fx, fy), swap(idx, idy);
modifyfa(rt[k - 1], rt[k], fx, fy);
if(dep[idx] == dep[idy]) modifydep(rt[k], rt[k], fy);
}
int main() {
ios::sync_with_stdio(false);
// cin >> n >> m;
n = rd(), m = rd();
int M = m;
build(rt[0]);
int lstans = 0;
for(int i = 1, op, x, y; m --; i ++) {
// cin >> op;
op = rd();
if(op == 1) {
// cin >> x >> y;
x = rd(), y = rd();
x = (x - 1 + lstans * 12345) % n + 1, y = (y - 1 + lstans * 23456) % n + 1;
merge(i, x, y);
}
else if(op == 2) {
// cin >> x;
x = rd();
x = (x + lstans * 34567) % i;
rt[i] = rt[x];
}
else {
// cin >> x >> y;
x = rd(), y = rd();
x = (x - 1 + lstans * 12345) % n + 1, y = (y - 1 + lstans * 23456) % n + 1;
int fx = fd(i - 1, x), fy = fd(i - 1, y);
if(fx == fy) pc('1'), pc('\n');//cout << 1 << '\n', lstans = 1;
else pc('0'), pc('\n');//cout << 0 << '\n', lstans = 0;
rt[i] = rt[i - 1];
}
}
fwrite(obuf, p3 - obuf, 1, stdout);
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...