求帮忙调一下
  • 板块P2357 守墓人
  • 楼主HuYao
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/12/21 14:05
  • 上次更新2024/12/21 17:22:21
查看原帖
求帮忙调一下
1145208
HuYao楼主2024/12/21 14:05

求调

#include <bits/stdc++.h>
#define int long long
using namespace std;
long long n,m,op,l,r,tree[1000000],lz[200000],a[200000],k;
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
int zuo(int x){
	return x<<1;
}
int you(int x){
	return x<<1|1; 
}
void push_up(int x){
	tree[x]=tree[zuo(x)]+tree[you(x)];
}
void push_down(int x,int l,int r){
	int mid=(l+r)>>1;
	lz[zuo(x)]+=lz[x];
	lz[you(x)]+=lz[x];
	tree[you(x)]=(r-mid)*lz[x];
	tree[zuo(x)]=(mid-l+1)*lz[x];
	lz[x]=0; 
}
void update(int x,int l,int r,int ll,int rr,int kk){
	if(l>=ll&&r<=rr){
		lz[x]+=kk;
		tree[x]+=(r-l+1)*kk;
		return;
	}
	int mid=(l+r)>>1;
	push_down(x,l,r);
	if(ll<=mid) update(zuo(x),l,mid,ll,rr,kk);
	if(rr>mid) update(you(x),mid+1,r,ll,rr,kk);
	push_up(x);
}
int query(int x,int l,int r,int ll,int rr){
	int ans=0;
	if(l>=ll&&r<=rr) return tree[x];
	int mid=(l+r)>>1;
	push_down(x,l,r);
	if(ll<=mid) ans+=query(zuo(x),l,mid,ll,rr);
	if(rr>mid) ans+=query(you(x),mid+1,r,ll,rr);
	return ans;
}
void build(int x,int l,int r){
	lz[x]=0;
	if(l==r){
		tree[x]=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(zuo(x),l,mid);
	build(you(x),mid+1,r);
	push_up(x);
}
signed main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
	build(1,1,n);
	for(int i=1;i<=m;i++){
		op=read();
		if(op==1){
				l=read();r=read();k=read();
				update(1,1,n,l,r,k);
			}
		else if(op==2){
			k=read();
			update(1,1,n,1,1,k);
		}
		else if(op==3){
			k=read();
			update(1,1,n,1,1,-k);
		}
		else if(op==4){
			l=read();r=read();
			printf("%lld\n",query(1,1,n,l,r));
		}
		else{
			printf("%lld\n",query(1,1,n,1,1));
		}
	}
	return 0;
 } 
2024/12/21 14:05
加载中...