文章

2

粉丝

34

获赞

2

访问

1.4k

头像
感觉题目有点问题,各位瞅瞅(附我认为正确的答案
P1650
发布于2024年9月11日 21:28
阅读数 369

错误的参考答案

这题卡了好久,实在找不到哪里有问题,long long啥的都考虑到了,还是过不了

随便找了个过了的代码运行,对于数据(随手写的):

5 5
-213221312313 24832179313 27931739123 379724923 -4232342334
Query 1 5
Add 3 5 1000342
Query 1 1
Query 5 5
Query 3 4

运行能过的代码(其实就是N诺的《计算机考研机试攻略-满分篇》P63中3-2线段树区间更新的参考代码),得到的答案是

379724921
-2147483648
-2146483306
2529209254

对于第一个询问,1-5的和,用计算器算,明显不是这个数;对于第二个询问,第一个数(并没有被修改),也明显错误。

问题所在

研究代码,看到了问题所在

可以看到tree和lazy都是定义为long long的

但是

这里的val又定义为int,这样会导致,假如输入的操作数是超过int,就会出现错误。

正确代码

下面这个代码过不了此题,但稍微修改(只改输入输出格式)就能1604,姑且认为是正确的代码

因为这道题问的是区间和,所以用了树状数组,代码稍微比线段树简单一丢丢。

也由于不是用的线段树,所以我也复现不了上述的问题,所以一直过不了这道题。懒得再写线段树了,就酱吧。

#include<bits/stdc++.h>
using namespace std;

#define ll long long
ll c1[100005],c2[100005],N;

ll lowbit(ll i)
{
	return (-i)&i;
}

void update(ll id,ll v)
{
	ll v2 = id*v;
	while(id<=N)
	{
		c1[id]+=v;
		c2[id]+=v2;
		id+=lowbit(id);
	}
}

ll getsum(ll id,int t) // 树状数组c1/c2的前缀和
{
	ll sum1=0,sum2=0;
...
登录查看完整内容


登录后发布评论

1 条评论
admin SVIP
2024年9月11日 22:09

这个题数据不大,只有求和的时候可能会超出int范围

不过有一个坑点是进行区间加减的时候,可能给出的是无效区间

有效区间[L, R]其中L<=R,如果L>R就是一个无效区间,一般写线段树踩不到这个坑

前缀和就会踩坑crying

赞(0)