树状数组爆零求助
  • 板块P2357 守墓人
  • 楼主LYqwq
  • 当前回复5
  • 已保存回复5
  • 发布时间2022/1/22 08:18
  • 上次更新2023/10/28 11:36:37
查看原帖
树状数组爆零求助
399116
LYqwq楼主2022/1/22 08:18
#include <iostream>
using namespace std;
typedef long long ll;
const int N=2e5+5;
ll n,m,a,b,op,l,r,k;

inline ll read(){
	ll X=0; bool flag=1; char ch=getchar();
	while(ch<'0' || ch>'9'){if(ch=='-') flag=0; ch=getchar();}
	while(ch>='0' && ch<='9') X=(X<<1)+(X<<3)+ch-'0',ch=getchar();
	if(flag) return X;
	return ~(X-1);
}

inline void write(ll X){
	if(X<0) putchar('-'),X=~(X-1);
	ll s[20],top=0;
	while(X) s[++top]=X%10,X/=10;
	if(!top) s[++top]=0;
	while(top) putchar(s[top--]+'0');
	putchar('\n');
}

template<class T>
class BIT{
	public:
		BIT(){}
		BIT(int _n){
			n=_n;
			val=0;
			for(int i=1; i<=n; i++){
				ca[i]=cb[i]=0;
			}
		}
		void add(int x,int v){
			for(int i=x; i<=n; i+=lowbit(i)){
				ca[x]+=v;
				cb[x]+=v*x;
			}
		}
		T sum(int x){
			T res=0;
			for(int i=x; i; i-=lowbit(i)){
				res+=(i+1)*ca[i]-cb[i];
			}
			return res;
		}
		T addfst(T k=0){ // 修改及查询主墓碑的值
			return val+=k;
		}
	private:
		T ca[N],cb[N],n,val;
		inline T lowbit(T x){
			return x&-x;
		}
};

int main(){
	cin >> n >> m;
	n=read(),m=read();
	BIT<ll> bit(n); // longlong类型树状数组
	for(int i=1; i<=n; i++){
		b=read();
		bit.add(i,b-a); // 差分
		a=b;
	}
	while(m--){
		op=read();
		switch(op){
			case 1:
				l=read(),r=read(),k=read();
				bit.add(l,k);
				bit.add(r+1,-k); // 区间修改
				break;
			case 2:
				k=read();
				bit.addfst(k); // 将主墓碑加上 k
				break;
			case 3:
				k=read();
				bit.addfst(-k); // 将主墓碑减去 k
				break;
			case 4:
				// 若包含主墓碑,则加上去
				write(bit.sum(r)-bit.sum(l-1)+(l==1)*bit.addfst());
				break;
			case 5:
				// 主墓碑单独维护
				write(bit.sum(1)+bit.addfst());
		}
	}
	return 0;
}

可能有点长了(

样例输入完序列就 over 了,交上去也红红黑黑的,求大佬指出错误。

2022/1/22 08:18
加载中...