关于树状数组的区间修改和区间查询
  • 板块学术版
  • 楼主GoldenBeach
  • 当前回复3
  • 已保存回复3
  • 发布时间2022/9/24 22:20
  • 上次更新2023/10/27 10:04:19
查看原帖
关于树状数组的区间修改和区间查询
452621
GoldenBeach楼主2022/9/24 22:20

题目链接: 题目

为什么我的代码过不了POJ3468?

#include<iostream>
#include<string>
//#include<bits/stdc++.h>
#define int long long
using namespace std;
int read(){
    int x=0,f=1;
    char c=getchar();
    while(c<48||c>57){if(c=='-')f=-1;c=getchar();}
    while(c>=48&&c<=57)x=(x<<1)+(x<<3)+(c^48),c=getchar();
    return x*f;
}
int n=read(),m=read(),a,b,tr1[500002],tr2[500002];
int lowbit(int x){return x&-x;}
void add(int u,int x){for(int i=u;i<=n;i+=lowbit(i))tr1[i]+=x,tr2[i]+=(x*(u-1));}
int query(int x){
    int sum=0;
    for(int i=x;i;i-=lowbit(i))sum+=(x*tr1[i]-tr2[i]);
    return sum;
}
signed main(){
    for(int i=1;i<=n;i++)b=read(),add(i,b-a),a=b;
    while(m--){
        string op;
        cin>>op;
        if(op=="Q"){
            int u=read(),v=read();
            printf("%lld\n",query(v)-query(u-1));
        }else{
            int u=read(),v=read(),k=read();
            add(u,k),add(v+1,-k);
        }
    }
    return 0;
}
2022/9/24 22:20
加载中...