社区讨论

求助!或许这就是线段树的极限了吧

P4145上帝造题的七分钟 2 / 花神游历各国参与者 2已保存回复 7

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
7 条
当前快照
1 份
快照标识符
@loc7tf8s
此快照首次捕获于
2023/10/30 09:22
2 年前
此快照最后确认于
2023/11/04 18:54
2 年前
查看原帖
蒟蒻打的线段树,T了3个。这都无所谓,但是为什么最后5个点wa了,切都是too short on line one,求助。
CPP
#include<bits/stdc++.h>
using namespace std;
const int MM=400005;
int t[MM],mx[MM],a[MM],n,m,q,x,y;
void pushup(int now)
{
	t[now]=t[now<<1]+t[now<<1|1];
	mx[now]=max(t[now<<1],t[now<<1|1]);
}
int buildt(int now,int l,int r)
{
	if(l==r)
		return t[now]=a[l];
	else
		return t[now]=buildt(now<<1,l,(l+r)>>1)+buildt(now<<1|1,((l+r)>>1)+1,r);
}
int buildmx(int now,int l,int r)
{
	if(l==r)
		return mx[now]=a[l];
	else
		return mx[now]=max(buildmx(now<<1,l,(l+r)>>1),buildmx(now<<1|1,((l+r)>>1)+1,r)); 
}
int getmx(int now,int l,int r,int L,int R)
{
	if(l==r)
		return mx[now];
	if(L<=l&&r<=R)
		return mx[now];
	int mid=(l+r)>>1,tmp=-1;	
	if(L<=mid)
		tmp=max(tmp,getmx(now<<1,l,mid,L,R));
	if(R>mid)
		tmp=max(tmp,getmx(now<<1|1,mid+1,r,L,R));
	return tmp;
} 
void _sqrt(int now,int l,int r,int aim)
{
	if(l==r&&l==aim)
	{
		t[now]=sqrt(t[now]);
		mx[now]=sqrt(mx[now]);
		return;
	}
	int mid=(l+r)>>1;
	if(aim<=mid)
		_sqrt(now<<1,l,mid,aim);
	else
		_sqrt(now<<1|1,mid+1,r,aim);
	pushup(now);
}
int ask(int now,int l,int r,int L,int R)
{
	if(l==r)
		return t[now];
	if(L<=l&&r<=R)
		return t[now];
	int mid=(l+r)>>1;
	int tmp=0;
	if(L<=mid)
		tmp+=ask(now<<1,l,mid,L,R);
	if(R>mid)
		tmp+=ask(now<<1|1,mid+1,r,L,R);
	return tmp;
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	cin>>m;
	buildt(1,1,n);
	buildmx(1,1,n);
	for(int i=1;i<=m;i++)
	{
		cin>>q>>x>>y;
		if(x>y)
			swap(x,y);
		if(q==0)
			if(getmx(1,1,n,x,y)>1)
				for(int i=x;i<=y;i++)
				{
					a[i]=sqrt(a[i]);
					 _sqrt(1,1,n,i);
				}
		if(q==1)
			cout<<ask(1,1,n,x,y)<<endl;
	}
	return 0;
}

回复

7 条回复,欢迎继续交流。

正在加载回复...