线段树跪求改错Orz
  • 板块灌水区
  • 楼主南瓜桐
  • 当前回复7
  • 已保存回复7
  • 发布时间2022/10/6 16:41
  • 上次更新2023/10/27 08:28:49
查看原帖
线段树跪求改错Orz
439327
南瓜桐楼主2022/10/6 16:41
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
namespace wzl{
int n,m;
const int maxnm = 1e5 + 1;
const int maxmn = 1e5 + 1;
int a[maxmn] = {},sgtree[4*maxnm] = {},lazy[4*maxmn] = {};
void buildTree(int s, int t, int node){
	printf("%d %d %d\n",s,t,node);
	int Lnode = 2*node;
	int Rnode = 2*node + 1;
	int mid = (s + t)>>1;
	if(s == t){
		sgtree[node] = a[s];
		return;
	}
	buildTree(s,m,Lnode);
	buildTree(m+1,t,Rnode);
	sgtree[node] = sgtree[Lnode] + sgtree[Rnode];
	return;
}
void update(int s, int t, int l, int r, int p, int node){
	int Lnode = 2*node;
	int Rnode = Lnode +1;
	int mid = (s + t)>>1;
	if(l <= s && t <= r){
		sgtree[node] += (t-s+1)*p;
		lazy[node] += p;
		return ;
	}
	if(!lazy[node] && s!=t){
		sgtree[Lnode] += lazy[node]*(m-s+1);
		lazy[Lnode] += lazy[node];
		sgtree[Rnode] += lazy[node]*(t-m);
		lazy[Rnode] += lazy[node];
		lazy[node] = 0; 
	}
	if(l <= m) update(s,m,l,r,p,Lnode);
	if(r >= m+1) update(m+1,t,l,r,p,Rnode);
	sgtree[node] = sgtree[Lnode] + sgtree[Rnode];
	return;
}
int getsum(int s,int t,int l,int r,int node){
	int Lnode = 2*node;
	int Rnode = Lnode +1;
	int mid = (s + t)>>1;
	if(s <= l && t <= r){
		return sgtree[node];
	}
	if(!lazy[node] && s != t){
		sgtree[Lnode] += lazy[node]*(m-s+1);
		lazy[Lnode] += lazy[node];
		sgtree[Rnode] += lazy[node]*(t-m);
		lazy[Rnode] += lazy[node];
		lazy[node] = 0; 
	}
	int sum = 0;
	if(l <= m) sum += getsum(s,m,l,r,Lnode);
	if(r >= m+1) sum += getsum(m+1,t,l,r,Rnode);
	return sum;
}
void main(){
	cin>>n>>m;
	for(int i = 1; i <= n; ++i) cin>>a[i];
	buildTree(1,n,1);
//	cout<<"qq";
	do{
		int f; cin>>f;
		if(f == 1){
			int x,y,k;
			cin>>x>>y>>k;
			update(1,n,x,y,k,1);
		}
		if(f == 2){
			int x,y;
			cin>>x>>y;
			cout<<getsum(1,n,x,y,1);
		}
	}while(--m);
	return ;
}
}


int main(){
	wzl::main();
}

输出:

1 5 1
1 5 2
1 5 4
1 5 8
1 5 16
1 5 32
1 5 64
1 5 128
1 5 256
1 5 512
1 5 1024
1 5 2048
1 5 4096
1 5 8192
1 5 16384
1 5 32768
1 5 65536
1 5 131072
1 5 262144
1 5 524288
1 5 1048576
1 5 2097152
1 5 4194304
1 5 8388608
1 5 16777216
1 5 33554432
1 5 67108864
1 5 134217728
1 5 268435456
1 5 536870912
1 5 1073741824
1 5 -2147483648
然后就一直是 1 5 0 了
2022/10/6 16:41
加载中...