社区讨论

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 条回复,欢迎继续交流。

正在加载回复...