文章
2
粉丝
34
获赞
2
访问
1.4k
这题卡了好久,实在找不到哪里有问题,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;
...
登录后发布评论
这个题数据不大,只有求和的时候可能会超出int范围
不过有一个坑点是进行区间加减的时候,可能给出的是无效区间
有效区间[L, R]其中L<=R,如果L>R就是一个无效区间,一般写线段树踩不到这个坑
前缀和就会踩坑