TLE 56pts 求救
  • 板块P2357 守墓人
  • 楼主穼柗°
  • 当前回复13
  • 已保存回复14
  • 发布时间2025/1/21 21:12
  • 上次更新2025/1/22 08:17:44
查看原帖
TLE 56pts 求救
1045961
穼柗°楼主2025/1/21 21:12

rt.\Large\textsf{rt.}

#include <iostream>
#define int long long
using namespace std;
using cint=const int;
int n,f,a[200001],val[800001],tag[800001];
void build(cint u,cint l,cint r) {
	if(l==r) {val[u]=a[l];return;}
	cint mid=(l+r)>>1;
	build(u<<1,l,mid);
	build((u<<1)+1,mid+1,r);
	val[u]=val[u<<1]+val[(u<<1)+1];
}
void apply(cint u,cint l,cint r,const int x) {
	val[u]+=(r-l+1)*x,tag[u]+=x;
}
void pushdown(cint u,cint l,cint r) {
	if(tag[u]) {
		cint mid=(l+r)>>1;
		apply(u<<1,l,mid,tag[u]);
		apply((u<<1)+1,mid+1,r,tag[u]);
		tag[u]=0;
	}
}
void upd(cint u,cint l,cint r,cint s,cint t,const int x) {
	if(s<=l&&r<=t) {apply(u,l,r,x);return;}
	pushdown(u,l,r);
	cint mid=(l+r)>>1;
	if(s<=mid) upd(u<<1,l,mid,s,t,x);
	if(t>mid) upd((u<<1)+1,mid+1,r,s,t,x);
	val[u]=val[u<<1]+val[(u<<1)+1];
}
int query(cint u,cint l,cint r,cint s,cint t) {
	if(l>=r) return val[u];
	pushdown(u,l,r);
	cint mid=(l+r)>>1;
	if(t<=mid) return query(u<<1,l,mid,s,t);
	if(s>mid) return query((u<<1)+1,mid+1,r,s,t);
	return query(u<<1,l,mid,s,t)+query((u<<1)+1,mid+1,r,s,t);	
}
signed main() {
	cin.tie(nullptr)->sync_with_stdio(false),
	cout.tie(nullptr);
	cin>>n>>f;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	build(1,1,n);
	for(int op,l,r,k;f--;) {
		cin>>op;
		if(op==1) {
			cin>>l>>r>>k;
			upd(1,1,n,l,r,k);
		} else if(op==2) {
			cin>>k;
			upd(1,1,n,1,1,k);
		} else if(op==3) {
			cin>>k;
			upd(1,1,n,1,1,-k);
		} else if(op==4) {
			cin>>l>>r;
			cout<<query(1,1,n,l,r)<<'\n';
		} else cout<<query(1,1,n,1,1)<<'\n';
	}
	return 0;
}
2025/1/21 21:12
加载中...