关于本题做法,求大佬指明为什么错了

P3368 【模板】树状数组 2

```cpp #include<iostream> #include<cstdio> using namespace std; long long n,m; long long c[500000+5],a[500000+5]; long long o2(int x) { return x&(-x); } void add(long long i,long long n,long long num) { while(i<=n) { c[i]+=num; i+=o2(i); } } long long find(long long i) { long long ans=0; while(i>0) { ans+=c[i]; i-=o2(i); } return ans; } int main() { cin>>n>>m; for(int i=1;i<=n;i++) { cin>>a[i]; add(i,n,a[i]-a[i-1]); } for(int i=1;i<=m;i++) { long long flag,x,y,k; cin>>flag; if(flag==1) { cin>>x>>y>>k; add(x,y+1,k); } else { cin>>x; cout<<find(x)<<endl; } } return 0; } ```
by ryarrn @ 2018-11-07 22:19:19


和题解的差距就是我的区间修改从输入的区间遍历,题解是从第一个数到n加上值,再从第二个数+1减去值,不知道自己的做法为什么只得了30分。求大佬指教 ```cpp void add(long long i,long long n,long long num) { while(i<=n) { c[i]+=num; i+=o2(i); } } ```
by ryarrn @ 2018-11-07 22:22:04


这道题要用差分呀
by qseer @ 2018-11-07 22:53:32


线段树万岁!!! ~~谁有UKE代码?(最好带上题号)**学术版讨论被删除了QWQ**~~
by 持之以珩 @ 2019-01-27 22:54:50


|