竞赛讨论区 > J题 树状数组WA
头像
Lazy_Durant
发布于 01-22 15:40
+ 关注

J题 树状数组WA

#include<bits/stdc++.h>
using namespace std;
const int N=10005;
int n,a[N],c[N],q,l,r,op;
int lowbit(int i){
    return (-i)&i;
}
void add(int i,int z){//数组的第i个值更新了 
    for(;i<=n;i+=lowbit(i)) c[i]+=z;
}
int sum(int i){//计算i之前的前缀和 
    int s=0;
    for(;i>0;i-=lowbit(i)) s+=c[i];
    return s;
}
int sum(int l,int r){  //计算区间和 
    return sum(r)-sum(l-1);
}
void one_change(int i, int k) {
    int diff = k - a[i];  // 计算变化的差值
    a[i] = k; //更新第 i 个数的值
    // 更新后续元素的前缀和
    for (int j = i; j <= n; j += lowbit(j)) {
        c[j] += diff;
    }
}
int f(int x){
	return 2*(abs(x*x*x-3*x)/(3*x*x+1));
}

int main()
{
    //初始化树状数组 
    memset(c,0,sizeof(c));
	scanf("%d%d",&n,&q);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		add(i,a[i]);
	}
	//功能自行调用
	while(q--){
		scanf("%d%d%d",&op,&l,&r);
		if(op==1){
			for(int i=l;i<=r;i++){
				one_change(i,f(a[i])); 
			}
		}else{
			cout<<sum(l,r)<<endl;
		}
	}
    return 0; 
}

求大佬帮忙看看,哪里有问题

全部评论

(0) 回帖
加载中...
话题 回帖

等你来战

查看全部

热门推荐