一个关于线段树的问题
  • 板块灌水区
  • 楼主wo_hen_la
  • 当前回复11
  • 已保存回复11
  • 发布时间2023/7/27 16:02
  • 上次更新2023/11/3 07:22:48
查看原帖
一个关于线段树的问题
794701
wo_hen_la楼主2023/7/27 16:02

P4145 上帝造题的七分钟 2 / 花神游历各国

在这段AC代码的add函数中,数值修改时要加tree[k].l==tree[k].r(不然全WA)。

但是加在线段树1模板上会超时,可这两题都是区间修改。

求助大佬

#include<bits/stdc++.h>
#define int long long 
using namespace std;
int a[100005];
struct node
{
	int l,r,num,mx;
}tree[400005];
void build(int k,int ll,int rr)
{
	tree[k].l=ll;
	tree[k].r=rr;
	if(ll==rr){
		tree[k].num=a[ll];
		tree[k].mx=a[ll];
		return;
	}
	int mid=(ll+rr)>>1;
	build(k*2,ll,mid);
	build(k*2+1,mid+1,rr);
	tree[k].num=tree[k*2].num+tree[k*2+1].num;
	tree[k].mx=max(tree[k*2].mx,tree[k*2+1].mx);
	return;
}
void add(int k,int ll,int rr)
{
	if(tree[k].l>=ll && tree[k].r<=rr && tree[k].l==tree[k].r){
		tree[k].num=tree[k].mx=sqrt(tree[k].num);
		return;
	}
	if(tree[k*2].r>=ll && tree[k*2].mx>1) add(k*2,ll,rr);
	if(tree[k*2+1].l<=rr && tree[k*2+1].mx>1) add(k*2+1,ll,rr);
	tree[k].num=tree[k*2].num+tree[k*2+1].num;
	tree[k].mx=max(tree[k*2].mx,tree[k*2+1].mx);
	return;	
}
int ask(int k,int ll,int rr)
{
	int cnt=0;
	if(tree[k].l>=ll && tree[k].r<=rr){
		return tree[k].num;
	}
	if(tree[k*2].r>=ll) cnt+=ask(k*2,ll,rr);
	if(tree[k*2+1].l<=rr) cnt+=ask(k*2+1,ll,rr);
	return cnt;
}
signed main()
{
	int n,m;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	cin>>m;
	build(1,1,n);
	while(m--){
		int c,x,y;
		cin>>c>>x>>y;
		if(x>y) swap(x,y);
		if(c==0) add(1,x,y);
		else cout<<ask(1,x,y)<<"\n";
	}
	return 0;
}
2023/7/27 16:02
加载中...