暴力0tps 求调
查看原帖
暴力0tps 求调
1405718
JoyLosingK楼主2024/11/1 15:45

rt,写的五十分暴力,不知道错哪了快疯了

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
const int N = 5005, logn = 14;
int n, m, t, op, a, b, s, de[N], fa[N], f[N][logn];
struct edge {
	int to, c;
};
vector<edge> e[N];
inline ll read() {
	ll x = 0, f = 1;
	char ch = getchar();
	for (; !isdigit(ch); ch = getchar()) if (ch == '-') f = -1;
	for (; isdigit(ch); ch = getchar()) x = (x << 3) + (x << 1) + ch - '0';
	return x * f;
}
void dfs(int u) {
	for (int i = 0; i < e[u].size(); i++) {
		int v = e[u][i].to;
		if (v == fa[u]) continue;
		de[v] = de[u] + 1;
		fa[v] = u;
		dfs(v);
	}
	return;
}
inline int lca(int x, int y) {
	if (de[x] < de[y]) swap(x, y);
	for (int i = 0, p = de[x] - de[y]; p; i++, p >>= 1)
		if (p & 1) x = f[x][i];
	if (x == y) return x;
	for (int j = logn; j >= 0; j--)
		if (f[x][j] != f[y][j]) x = f[x][j], y = f[y][j];
	return f[x][0];
}
inline void slove(int u) {
	for (int i = 0; i < e[u].size(); i++) {
		if (e[u][i].to == fa[u]) e[u][i].c = 1;
		else e[u][i].c = 0;
	}
	return;
}
inline void modifly(int x, int y, int g) {
	int i, j;
	for (i = x; fa[i] != g; i = fa[i]) slove(i);
	for (j = y; fa[j] != g; j = fa[j]) slove(j);
	slove(i), slove(j);
	for (int h = 0; h < e[g].size(); h++) {
		if (e[g][h].to == i || e[g][h].to == j) e[g][h].c = 1;
		else e[g][h].c = 0;
	}
	return;
}
inline int query(int x, int y, int g) {
	int res = 0;
	for (int i = x; i != g; i = fa[i])
		for (int j = 0; j < e[i].size(); j++)
			if (e[i][j].to == fa[i]) res += e[i][j].to;
	for (int i = y; i != g; i = fa[i])
		for (int j = 0; j < e[i].size(); j++)
			if (e[i][j].to == fa[i]) res += e[i][j].to;
	return res;
}
int main() {
	t = read();
	while (t--) {
		n = read(), m = read();
		for (int i = 1, u, v; i < n; i++)
			u = read(), v = read(),
			e[u].push_back((edge) {
			v, 0
		}),
		e[v].push_back((edge) {
			u, 0
		});
		dfs(1);
		for (int i = 1; i <= n; i++) f[i][0] = fa[i];
		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= logn; j++)
				f[i][j] = f[f[i][j - 1]][j - 1];
		while (m--) {
			op = read(), a = read(), b = read(), s = lca(a, b);
			if (op == 1) modifly(a, b, s);
			else cout << query(a, b, s) << endl;
		}
		for (int i = 1; i <= n; i++) e[i].clear(), fa[i] = 0, de[i] = 0;
	}
	return 0;
}
2024/11/1 15:45
加载中...