关于快读
  • 板块学术版
  • 楼主linxudong
  • 当前回复6
  • 已保存回复6
  • 发布时间2024/11/24 21:05
  • 上次更新2024/11/24 23:13:02
查看原帖
关于快读
175914
linxudong楼主2024/11/24 21:05

P3402
我用快读就几乎全WA,4tps
不用会部分TLE,但其余点都AC,76tps
有没有人知道快读有什么bug吗

不用快读

#include <bits/stdc++.h>

#define N 200005

using namespace std;

int n, m, rt[N], tot;
struct tree {
	int lp, rp, fa, dep;
} t[N << 4];

void build(int &p, int l, int r) {
	if(!p) p = ++tot;
	if(l == r) {
		t[p].fa = l, t[p].dep = 1; return ;
	}
	int mid = l + r >> 1;
	build(t[p].lp, l, mid), build(t[p].rp, mid + 1, r);
}

int clone(int p) {
	t[++tot] = t[p]; return tot;
}

void modify(int &p, int l, int r, int pos, int k, int fg) {
	if(!p) p = ++tot;
	else if(fg) p = clone(p);
	if(l == r) {
		if(fg) t[p].fa = k;
		else t[p].dep = k;
		return ;
	}
	int mid = l + r >> 1;
	if(pos <= mid) modify(t[p].lp, l, mid, pos, k, fg);
	else modify(t[p].rp, mid + 1, r, pos, k, fg);
}

pair<int, int> get(int p, int l, int r, int pos) {
	if(l == r) return make_pair(t[p].fa, t[p].dep);
	int mid = l + r >> 1;
	if(pos <= mid) return get(t[p].lp, l, mid, pos);
	return get(t[p].rp, mid + 1, r, pos);
}

int find(int t, int x) {
	pair<int, int> tmp = get(rt[t], 1, n, x);
	if(tmp.first == x) return x;
	return find(t, tmp.first);
}

bool same(int t, int a, int b) {
	return find(t, a) == find(t, b);
}

void meg(int t, int a, int b) {
	int na = find(t - 1, a), nb = find(t - 1, b);
	int dna = get(t - 1, 1, n, na).second, dnb = get(t - 1, 1, n, nb).second;
	rt[t] = rt[t - 1];
	if(na == nb) return ;
	if(dna == dnb) {
		modify(rt[t], 1, n, na, nb, 1);
		modify(rt[t], 1, n, na, dnb + 1, 0);
		return ;
	}
	if(dna > dnb) swap(na, nb), swap(dna, dnb);
	modify(rt[t], 1, n, na, nb, 1);
	modify(rt[t], 1, n, na, dnb, 0);
}

int main() {
	ios::sync_with_stdio(0); cin.tie(0);
	cin >> n >> m;
	build(rt[0], 1, n);
	for (int i = 1; i <= m; ++i) {
		int op, x, y; cin >> op;
		if(op == 1) {
			cin >> x >> y;
			meg(i, x, y);
		}
		else if(op == 2) cin >> x, rt[i] = rt[x];
		else {
			cin >> x >> y;
			cout << same(i - 1, x, y) << '\n';
			rt[i] = rt[i - 1];
		}
	}
}

用了快读

#include <bits/stdc++.h>

#define N 200005

using namespace std;

int read() {
	int x = 0, y = 1; char c = getchar();
	while(!isdigit(c)) c = getchar();
	while(isdigit(c)) x = (x << 3 | x << 1) + c - '0', c = getchar();
	return x * y;
}

int n, m, rt[N], tot;
struct tree {
	int lp, rp, fa, dep;
} t[N << 4];

void build(int &p, int l, int r) {
	if(!p) p = ++tot;
	if(l == r) {
		t[p].fa = l, t[p].dep = 1; return ;
	}
	int mid = l + r >> 1;
	build(t[p].lp, l, mid), build(t[p].rp, mid + 1, r);
}

int clone(int p) {
	t[++tot] = t[p]; return tot;
}

void modify(int &p, int l, int r, int pos, int k, int fg) {
	if(!p) p = ++tot;
	else if(fg) p = clone(p);
	if(l == r) {
		if(fg) t[p].fa = k;
		else t[p].dep = k;
		return ;
	}
	int mid = l + r >> 1;
	if(pos <= mid) modify(t[p].lp, l, mid, pos, k, fg);
	else modify(t[p].rp, mid + 1, r, pos, k, fg);
}

pair<int, int> get(int p, int l, int r, int pos) {
	if(l == r) return make_pair(t[p].fa, t[p].dep);
	int mid = l + r >> 1;
	if(pos <= mid) return get(t[p].lp, l, mid, pos);
	return get(t[p].rp, mid + 1, r, pos);
}

int find(int t, int x) {
	pair<int, int> tmp = get(rt[t], 1, n, x);
	if(tmp.first == x) return x;
	return find(t, tmp.first);
}

bool same(int t, int a, int b) {
	return find(t, a) == find(t, b);
}

void meg(int t, int a, int b) {
	int na = find(t - 1, a), nb = find(t - 1, b);
	int dna = get(t - 1, 1, n, na).second, dnb = get(t - 1, 1, n, nb).second;
	rt[t] = rt[t - 1];
	if(na == nb) return ;
	if(dna == dnb) {
		modify(rt[t], 1, n, na, nb, 1);
		modify(rt[t], 1, n, na, dnb + 1, 0);
		return ;
	}
	if(dna > dnb) swap(na, nb), swap(dna, dnb);
	modify(rt[t], 1, n, na, nb, 1);
	modify(rt[t], 1, n, na, dnb, 0);
}

int main() {
	n = read(), m = read();
	build(rt[0], 1, n);
	for (int i = 1; i <= m; ++i) {
		int op, x, y; op = read();
		if(op == 1) {
			x = read(), y = read();
			meg(i, x, y);
		}
		else if(op == 2) x = read(), rt[i] = rt[x];
		else {
			x = read(), y = read();
			if(same(i - 1, x, y)) puts("1");
			else puts("0");
			rt[i] = rt[i - 1];
		}
	}
}
2024/11/24 21:05
加载中...