线段树哪里有问题?
  • 板块P2357 守墓人
  • 楼主hbhz_zcy
  • 当前回复1
  • 已保存回复1
  • 发布时间2021/8/12 09:52
  • 上次更新2023/11/4 10:57:50
查看原帖
线段树哪里有问题?
142549
hbhz_zcy楼主2021/8/12 09:52

过样例,全WA爆零
code

#include<iostream>
#include<cstdio>
#define LL long long
using namespace std;
const int maxn=3e5;
struct node{int l,r;LL v,lazy;}f[maxn*4];
LL a[maxn];int n,q;
void pushup(int t){f[t].v=f[t<<1].v+f[t<<1|1].v;}
void pushdown(int t){
	if(!f[t].lazy)  return;
	int l=f[t].l,r=f[t].r,m=(l+r)/2;
	if(l!=m)  f[t<<1].lazy=f[t].lazy;
	if(m+1!=r)  f[t<<1|1].lazy=f[t].lazy;
	f[t<<1].v+=f[t].lazy*(m-l+1);
	f[t<<1|1].v+=f[t].lazy*(r-m);
	f[t].lazy=0;return;
}
void build (int t,int l,int r){
	f[t].l=l,f[t].r=r;
	if(l==r){f[t].v=a[l];return;}
	int m=(l+r)/2;
	build(t<<1,l,m);
	build(t<<1|1,m+1,r);
	pushup(t);
}
void add(int t,int ul,int ur,LL x){
	int l=f[t].l,r=f[t].r;
	if(ul<=l&&r<=ur){
		f[t].v+=x*(r-l+1);
		if(l!=r)  f[t].lazy+=x;
		return;
	}
	int m=(l+r)/2;pushdown(t);
	if(m>=ul)  add(t<<1,ul,ur,x);
	if(m<ur)  add(t<<1|1,ul,ur,x);
	pushup(t);
}
LL getsum(int t,int ul,int ur){
	int l=f[t].l,r=f[t].r;
	if(ul<=l&&r<=ur)  return f[t].v;
	int m=(l+r)/2;LL rt=0;pushdown(t);
	if(m>=ul)  rt+=getsum(t<<1,ul,ur);
	if(m<ur)  rt+=getsum(t<<1|1,ul,ur);
	return rt;
}
int main(){
	scanf("%d%d",&n,&q,&a[0]);
	for(int i=1;i<=n;i++)  scanf("%d",&a[i]);
	build(1,1,n);
	while(q--){
		int c,l,r;LL k;scanf("%d",&c);
		if(c==1||c==4)  scanf("%d%d",&l,&r);
		if(c<=3)  scanf("%lld",&k);
		if(c==1)  add(1,l,r,k);
		else if(c==2)  add(1,1,1,k);
		else if(c==3)  add(1,1,1,-k);
		else if(c==4)  printf("%lld\n",getsum(1,l,r));
		else if(c==5)  printf("%lld\n",getsum(1,1,1));
	}
	return 0;
}
2021/8/12 09:52
加载中...