初学OI,本地AC,提交WA。。。
查看原帖
初学OI,本地AC,提交WA。。。
312306
LJ07楼主2021/11/28 09:59

最后一个点WAWA

提示是too short on line 1

#include <bits/stdc++.h>
using namespace std;
inline int inti() {
	char c;
	bool f(true);
	while (!isdigit(c = getchar())) f = c != '-';
	int x(c ^ 48);
	while (isdigit(c = getchar())) x = x * 10 + (c ^ 48);
	return f ? x : -x;
}
const int N(2e5 + 5);
int n, m, head[N + 5], tot(1), mappe[N + 5], mappv[N + 5], val[N + 5];
int dfn[N + 5], son[N + 5], fa[N + 5], sz[N + 5], dep[N + 5], top[N + 5], cntD;
struct Edge {
	int to, nxt;
}e[N * 2 + 5];
void add(int u, int v) {e[++tot] = (Edge) {v, head[u]}, head[u] = tot;}
void dfs1(int u) {
	sz[u] = 1;
	for (int i(head[u]); i; i = e[i].nxt) {
		int v(e[i].to);
		if (v == fa[u])
			continue;
		fa[v] = u, dep[v] = dep[u] + 1, mappe[v] = i >> 1, mappv[i >> 1] = v;
		dfs1(v), sz[u] += sz[v];
		if (sz[son[u]] < sz[v])
			son[u] = v;
	}
}
void dfs2(int u, int tp) {
	top[u] = tp, dfn[u] = ++cntD;
	if (son[u])
		dfs2(son[u], tp);
	for (int i(head[u]); i; i = e[i].nxt)
		if (e[i].to != fa[u] && e[i].to != son[u])
			dfs2(e[i].to, e[i].to);
}
int sum[N * 4 + 5], maxx[N * 4 + 5], minn[N * 4 + 5];
bool tag[N * 4 + 5];
void update(int rt) {
	tag[rt] ^= 1, sum[rt] = -sum[rt];
	swap(maxx[rt], minn[rt]);
	maxx[rt] = -maxx[rt], minn[rt] = -minn[rt];
}
void pushup(int rt) {
	sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
	maxx[rt] = max(maxx[rt << 1], maxx[rt << 1 | 1]);
	minn[rt] = min(minn[rt << 1], minn[rt << 1 | 1]);
}
void pushdown(int rt) {
	if (!tag[rt])
		return;
	update(rt << 1);
	update(rt << 1 | 1);
	tag[rt] = false;
}
void modify2(int rt, int L, int R, int l, int r) {
	if (l <= L && R <= r) {
		update(rt);
		return;
	}
	int mid(L + R >> 1);
	pushdown(rt);
	if (l <= mid)
		modify2(rt << 1, L, mid, l, r);
	if (r > mid)
		modify2(rt << 1 | 1, mid + 1, R, l, r);
	pushup(rt);
}
void modify1(int rt, int L, int R, int p, int k) {
	if (L == R) {
		sum[rt] = maxx[rt] = minn[rt] = k;
		return;
	}
	int mid(L + R >> 1);
	pushdown(rt);
	if (p <= mid)
		modify1(rt << 1, L, mid, p, k);
	else 
		modify1(rt << 1 | 1, mid + 1, R, p, k);
	pushup(rt);
}
int query_max(int rt, int L, int R, int l, int r) {
	if (l <= L && R <= r)
		return maxx[rt];
	int mid(L + R >> 1), ans(-0x7fffffff);
	pushdown(rt);
	if (l <= mid)
	 	ans = max(ans, query_max(rt << 1, L, mid, l, r));
	if (r > mid)
		ans = max(ans, query_max(rt << 1 | 1, mid + 1, R, l, r));
	return ans;
}
int query_min(int rt, int L, int R, int l, int r) {
	if (l <= L && R <= r)
		return minn[rt];
	int mid(L + R >> 1), ans(0x7fffffff);
	pushdown(rt);
	if (l <= mid)
	 	ans = min(ans, query_min(rt << 1, L, mid, l, r));
	if (r > mid)
		ans = min(ans, query_min(rt << 1 | 1, mid + 1, R, l, r));
	return ans;
}
int query_sum(int rt, int L, int R, int l, int r) {
	if (l <= L && R <= r)
		return sum[rt];
	int mid(L + R >> 1), ans(0);
	pushdown(rt);
	if (l <= mid)
	 	ans += query_sum(rt << 1, L, mid, l, r);
	if (r > mid)
		ans += query_sum(rt << 1 | 1, mid + 1, R, l, r);
	return ans;
}
void test1(int w, int i) {modify1(1, 1, n, dfn[mappv[i]], w);}
void test2(int v, int u) {
	while (top[u] != top[v]) {
		if (dep[top[u]] < dep[top[v]])
			swap(u, v);
		modify2(1, 1, n, dfn[top[u]], dfn[u]);
		u = fa[top[u]];
	}
	if (dep[u] < dep[v])
		modify2(1, 1, n, dfn[son[u]], dfn[v]);
	if (dep[v] < dep[u])
		modify2(1, 1, n, dfn[son[v]], dfn[u]);
}
void test3(int v, int u) {
	int ans(0);
	while (top[u] != top[v]) {
		if (dep[top[u]] < dep[top[v]])
			swap(u, v);
		ans += query_sum(1, 1, n, dfn[top[u]], dfn[u]);
		u = fa[top[u]];
	}
	if (dep[u] < dep[v])
		ans += query_sum(1, 1, n, dfn[son[u]], dfn[v]);
	if (dep[v] < dep[u])
		ans += query_sum(1, 1, n, dfn[son[v]], dfn[u]);
	printf("%d\n", ans);
}
void test4(int v, int u) {
	int ans(-0x7fffffff);
	while (top[u] != top[v]) {
		if (dep[top[u]] < dep[top[v]])
			swap(u, v);
		ans = max(ans, query_max(1, 1, n, dfn[top[u]], dfn[u]));
		u = fa[top[u]];
	}
	if (dep[u] < dep[v])
		ans = max(ans, query_max(1, 1, n, dfn[son[u]], dfn[v]));
	if (dep[v] < dep[u])
		ans = max(ans, query_max(1, 1, n, dfn[son[v]], dfn[u]));
	printf("%d\n", ans);
}
void test5(int v, int u) {
	int ans(0x7fffffff);
	while (top[u] != top[v]) {
		if (dep[top[u]] < dep[top[v]])
			swap(u, v);
		ans = min(ans, query_min(1, 1, n, dfn[top[u]], dfn[u]));
		u = fa[top[u]];
	}
	if (dep[u] < dep[v])
		ans = min(ans, query_min(1, 1, n, dfn[son[u]], dfn[v]));
	if (dep[v] < dep[u])
		ans = min(ans, query_min(1, 1, n, dfn[son[v]], dfn[u]));
	printf("%d\n", ans);
}
int main() {
	n = inti();
	for (int i(1); i < n; ++i) {
		int u(inti() + 1), v(inti() + 1);
		add(u, v), add(v, u), val[i] = inti();
	}
	dfs1(1), dfs2(1, 1);;
	for (int i(2); i <= n; ++i) modify1(1, 1, n, dfn[i], val[mappe[i]]);
	for (m = inti(); m--; ) {
		char opt[100];
		scanf("%s", opt);
		if (opt[0] == 'C')
			test1(inti(), inti());
		else if (opt[0] == 'N')
			test2(inti() + 1, inti() + 1);
		else if (opt[0] == 'S')
			test3(inti() + 1, inti() + 1);
		else if (opt[1] == 'A')
			test4(inti() + 1, inti() + 1);
		else 
			test5(inti() + 1, inti() + 1);
	}
	return 0;
}
2021/11/28 09:59
加载中...