求调
查看原帖
求调
1603819
little_zxh_qwq楼主2025/2/6 20:30
#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[114514];
int sgt[414514];
int lc[414514],rc[414514];
int tag[414514];
int build(int l,int r,int i){
	lc[i]=l;
	rc[i]=r;
	if(l==r){
		sgt[i]=a[l];
		return a[l];
	}
	int m=(l+r)>>1;
	sgt[i]=build(l,m,i<<1)+build(m+1,r,(i<<1)|1);
	return sgt[i];
}
void pushdown(int l,int r,int i,int x){
	if(l==lc[i]&&r==rc[i]){
		tag[i]+=(r-l+1)*x;
		sgt[i]+=tag[i];
		return;
	}
	int m=rc[i*2];
	if(l<=m){
		pushdown(l,m,i<<1,x);
	}
	if(r>=m+1){
		pushdown(m+1,r,(i<<1)|1,x);
	}
}
int query(int l,int r,int i){
	if(l==lc[i]&&r==rc[i]){
		return sgt[i];
	}
	int m=rc[i*2];
	if(tag[i]){
		sgt[i]+=tag[i];
		pushdown(lc[i<<1],rc[i<<1],i<<1,tag[i]/(rc[i]-lc[i]+1));
		pushdown(lc[(i<<1)|1],rc[(i<<1)|1],(i<<1)|1,tag[i]/(rc[i]-lc[i]+1));
		tag[i]=0;
	}
	int sum=0;
	if(l<=m){
		sum+=query(l,m,i<<1);
	}
	if(r>=m+1){
		sum+=query(m+1,r,(i<<1)|1);
	}
	return sum;
}
main(){
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	int t=build(1,n,1);
	for(int i=1;i<=m;i++){
		int op,l,r;
		cin>>op>>l>>r;
		if(op==1){
			int x;
			cin>>x;
			pushdown(l,r,1,x);
		}
		else{
			cout<<query(l,r,1)<<endl;
		}
	}
	for(int i=1;i<=n*4;i++){
		cout<<i<<" "<<lc[i]<<" "<<rc[i]<<" "<<tag[i]<<" "<<sgt[i]<<endl;
	}
} 

我估计是犯了个唐诗的错误,但我没看出来

2025/2/6 20:30
1058410
Gcc_Gdb_7_8_12025/2/6 20:47

盖楼

盖楼

盖楼

再讲一遍:不是复杂度的问题!不是函数名的问题!而是把更新和下方标记函数弄成了一个啥都不是的函数!

况且 tag 是直接加 xx,不用乘长度

2025/2/6 20:47
1603819
little_zxh_qwq楼主2025/2/6 20:47

@Gcc_Gdb_7_8_1

我存的tag是整个区间的变化。

2025/2/6 20:47
1048165
SerenityWay2025/2/6 20:48

@little_zxh_qwq 就是按照你的代码改的

2025/2/6 20:48
1392543
_X_Z_N_2025/2/6 20:48

@Gcc_Gdb_7_8_1 bushi,zxh没用上传和下传标记,用的标记永久化

2025/2/6 20:48
180103
Ew_Cors2025/2/6 20:48
if(l==lc[i]&&r==rc[i]){
		tag[i]+=(r-l+1)*x;
		sgt[i]+=tag[i];
		return;
	}
if(tag[i]){
		sgt[i]+=tag[i];
	

那你为啥加两遍,

2025/2/6 20:48
180103
Ew_Cors2025/2/6 20:49

你 pushdown 到 i 节点的时候加一次到 sgt,查询的时候又加一遍,不会算重吗

2025/2/6 20:49
180103
Ew_Cors2025/2/6 20:50

你的 tag 究竟是什么,为什么在 pushdown 里加到 sgt 之后不立即清空,在查询的时候又清空了,

2025/2/6 20:50
1058410
Gcc_Gdb_7_8_12025/2/6 20:54

@X_Z_N

sgt[i]+=tag[i];
		pushdown(lc[i<<1],rc[i<<1],i<<1,tag[i]/(rc[i]-lc[i]+1));
		pushdown(lc[(i<<1)|1],rc[(i<<1)|1],(i<<1)|1,tag[i]/(rc[i]-lc[i]+1));
tag[i]=0;

tag[i]=0

这啥都不是

2025/2/6 20:54