RE10 求调 码风清新
查看原帖
RE10 求调 码风清新
376919
Komomo楼主2023/12/19 21:28

代码也很短!

#include <bits/stdc++.h>
#define mk make_pair
#define pb emplace_back
#define fi first
#define se second
#define pii pair<int, int>
#define fore(i, u) for (int i = h[u]; i; i = e[i].nxt)

using namespace std;
inline int read() {
	int x = 0, f = 1;
	char ch = getchar();
	while (! isdigit(ch)) { if (ch == '-') f = -1; ch = getchar(); }
	while (isdigit(ch)) { x = x * 10 + ch - 48; ch = getchar(); }
	return x * f;
}

const int maxn = 2e5 + 10, L = 31;

typedef bitset<L> bit;

int n, m, Q, en; map<int, int> mp;
struct Edge { int u, v; bit w; } e[maxn << 1];

namespace base {
	bit p[L]; int st[L], tp;
	
	void undo(int x) { while (x < tp) p[st[tp]].reset(), tp --; }
	void ins(bit x) {
		for (int i = L - 1; ~i; i --) if (x[i]) {
			if (p[i].any()) x ^= p[i]; else { p[st[++ tp] = i] = x; break; } }
	}

	bit qry() { bit x(0);
		for (int i = L - 1; ~i; i --) if (p[i].any()) x ^= p[i];
		return x;
	}
}

pii st[maxn]; int tp;

namespace union_ {
	struct Node { int fa; bit d; int rk; } f[maxn];
	void init() { for (int i = 1; i <= n; i ++) f[i] = Node {i, 0, 0}; }

	int fnd(int u) { return u == f[u].fa ? u : fnd(f[u].fa); }
	bit get(int u) { return u == f[u].fa ? 0 : (get(f[u].fa) ^ f[u].d); }
	void merg(int u, int v, bit w) {
		int fu = fnd(u), fv = fnd(v);
		if (fu == fv) base :: ins(get(u) ^ get(v) ^ w);
		else {
			if (f[fu].rk < f[fv].rk) swap(u, v), swap(fu, fv);
			if (f[fu].rk == f[fv].rk) f[fu].rk ++, st[++ tp] = {fv, fu};
			else st[++ tp] = {fv, 0};
			f[fv] = Node {fu, get(u) ^ get(v) ^ w, f[fv].rk};
		}
	}
}

using namespace union_;

void pr(bit x) { 
    string s = x.to_string();
    int p = 0; while (p < s.size() - 1 && s[p] == '0') p ++;
    for (; p < s.size(); p ++) cout << s[p]; cout << "\n";
}

namespace seg {
	vector<int> c[maxn << 2];

	void ins(int p, int l, int r, int x, int y, int id) {
		if (x > y) return ;
		if (x <= l && r <= y) return c[p].pb(id), void();

		int mi = l + r >> 1;
		if (x <= mi) ins(p << 1, l, mi, x, y, id);
		if (mi < y) ins(p << 1 | 1, mi + 1, r, x, y, id);
	}

	void dfs(int p, int l, int r) {
		int ls = tp, lb = base :: tp;
		for (auto id : c[p]) merg(e[id].u, e[id].v, e[id].w);

		if (l == r) pr(base :: qry().to_ulong());
		else { int mi = l + r >> 1; dfs(p << 1, l, mi), dfs(p << 1 | 1, mi + 1, r); }

		base :: undo(lb);
		while (ls < tp) { auto [u, v] = st[tp]; tp --;
			if (v) f[v].rk --; f[u] = Node {u, 0, f[u].rk};
		}
	}
}

int main() {

	n = read(), en = m = read(), Q = read(), init();
	for (int i = 1; i <= m; i ++) {
		int u = read(), v = read(); bit w; cin >> w, e[i] = Edge {u, v, w}, mp[i] = 1; }

    int ex = m + Q;
	for (int i = 2; i <= Q + 1; i ++) { string op; cin >> op; int x = read() + m;
		if (op[1] == 'd') { int y = read(); bit w; cin >> w; e[++ en] = Edge {x - m, y, w}, mp[en] = i; } 
		else if (op[1] == 'a') { seg :: ins(1, 1, Q + 1, mp[x], i - 1, x), mp[x] = Q + 2; }
		else { bit z; cin >> z; e[++ ex] = e[x], e[x].w = z; seg :: ins(1, 1, Q + 1, mp[x], i - 1, ex), mp[x] = i; }
	}

	for (auto [x, y] : mp) seg :: ins(1, 1, Q + 1, y, Q + 1, x); seg :: dfs(1, 1, Q + 1);
	
	return 0;
}
2023/12/19 21:28
加载中...