树状数组WA最后一个点求助
  • 板块P2357 守墓人
  • 楼主SJZ08
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/6/20 21:04
  • 上次更新2024/6/20 21:11:22
查看原帖
树状数组WA最后一个点求助
879242
SJZ08楼主2024/6/20 21:04

80pts代码:

#include <iostream>
#include <algorithm>
using namespace std;
const int N=2e5+5;
int n;
long long a[N],c1[N],c2[N];
long long Read() {
    long long x=0,flag=1;
    char ch=getchar();
    while(ch<'0'||ch>'9') {
        if(ch=='-') {
            flag=-1;
        }
        ch=getchar();
    }
    while(ch>='0'&&ch<='9') {
        x=x*10+ch-'0';
        ch=getchar();
    }
    return x*flag;
}
int lowbit(int x) {
	return x&(-x);
}
void add(int k,long long x) {
	long long X=k*x;
	while (k<=n) {
		c1[k]+=x,c2[k]+=X;
		k+=lowbit(k);
	}
}
long long getsum(long long *num,int k) {
	long long sum=0;
	while (k>0) {
		sum+=num[k];
		k-=lowbit(k);
	}
	return sum;
}
long long query(int l,int r) {
	return (r+1)*getsum(c1,r)-l*getsum(c1,l-1)-(getsum(c2,r)-getsum(c2,l-1));
}
int main() {
	int m;
	n=Read();
	m=Read();
	for (int i=1;i<=n;i++) {
		scanf("%d",&a[i]);
		add(i,a[i]-a[i-1]);
	}
	long long l,r,x;
	while (m--) {
		int mode;
		scanf("%d",&mode);
		if (mode==1) {
			l=Read(),r=Read(),x=Read();
			add(l,x);
			add(r+1,-x);
		}else if (mode==2) {
			x=Read();
			add(1,x);
			add(2,-x);
		}else if (mode==3) {
			x=Read();
			add(1,-x);
			add(2,x);
		}else if (mode==4) {
			l=Read(),r=Read();
			printf("%lld\n",query(l,r));
		}else if (mode==5) {
			printf("%lld\n",query(1,1));
		}
	}
	return 0;
}
2024/6/20 21:04
加载中...