警示侯人
查看原帖
警示侯人
877768
wmx111楼主2024/11/24 10:22

线段树数据不开到1e6+5乘4可能会到边界,如:

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10;
int tree[N*4],a[N],maxx[N];
int n,m;
void pushup(int rt){
	maxx[rt]=max(maxx[rt<<1],maxx[rt<<1|1]);
	tree[rt]=tree[rt<<1]+tree[rt<<1|1];
}
void build(int l,int r,int rt){
	if(l==r){
		tree[rt]=maxx[rt]=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(l,mid,rt<<1);
	build(mid+1,r,rt<<1|1);
	pushup(rt);
}
void update(int l,int r,int rt,int L,int R){
	if(l==r&&l>=L&&r<=R){
 		tree[rt]=maxx[rt]=sqrt(tree[rt]);
		return;
	}
	int mid=(l+r)>>1;
	if(L<=mid&&maxx[rt<<1]>1) update(l,mid,rt<<1,L,R);
	if(mid<R&&maxx[rt<<1|1]>1) update(mid+1,r,rt<<1|1,L,R);
	pushup(rt);	
}
int query(int l,int r,int rt,int L,int R){
	if(L<=l&&r<=R){
		return tree[rt];
	}
	int sum=0;
	int mid=(l+r)>>1;
	if(L<=mid)sum+=query(l,mid,rt<<1,L,R);
	if(R>mid)sum+=query(mid+1,r,rt<<1|1,L,R);
	return sum;
}
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	build(1,n,1);
	cin>>m;
	while(m--){
		int pos,x,y;
		cin>>pos>>x>>y;
		if(x>y){
			swap(x,y);
		} 
		if(pos==0){
			update(1,n,1,x,y);
		}
		if(pos==1){
			cout<<query(1,n,1,x,y)<<endl;
		}
	}
	return 0;
}

就会50pts 但把

const int N=1e5+10;

改成

const int N=1e6+10

就能过 为啥啊

2024/11/24 10:22
加载中...