警钟撅烂:如果你 28 分
查看原帖
警钟撅烂:如果你 28 分
186472
AC_loveRealNewbie楼主2023/9/14 12:28

如果你错误的点在于期望输出不是 00 而你输出 00 了,你看看你查询最大最小值的时候是不是这样写的:

int askmaxn(int p, int l, int r)
{
	if(r < l)
		return 0;
	// 就是这个地方
	if(l <= tpl && tpr <= r)
		return tpx;
	spread(p);
	int ans = -114514;
	int mid = (tpl + tpr) / 2;
	if(mid >= l)
		ans = max(ans, askmaxn(p * 2, l, r));
	if(mid < r)
		ans = max(ans, askmaxn(p * 2 + 1, l, r));
	return ans;
}

这样写可以有效避免当 u=v 时输出初始值的问题,然而我们做一个假设:你的 u 和 v 跳到了同一个节点,此时就会直接返回 0,如果你此前的最大值是负数或者最小值是正数的话,你要查询的值就会被 0 覆盖。

改正:把这个东西删掉,然后在读取询问时加一句特判:

	while(q --)
	{
		cin >> str;
		scanf("%d%d", &l, &r);
		if(str == "C")
		{
			if(d[st[l]].fa == ed[l])
				changedot(st[l], r);
			else
				changedot(ed[l], r);
			continue;
		}
		l += 1;
		r += 1;
		if(str == "N")
			coverpath(l, r);
		if(l == r)
		{
			printf("0\n");
			continue;
		}
		// 这里 ↑
		if(str == "SUM")
			printf("%d\n", asksumpath(l, r));
		if(str == "MAX")
			printf("%d\n", askmaxnpath(l, r));
		if(str == "MIN")
			printf("%d\n", askminnpath(l, r));
	}
2023/9/14 12:28
加载中...