关于我线段树又写挂了
  • 板块灌水区
  • 楼主ChenZQ
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/4/6 11:11
  • 上次更新2024/4/6 13:09:06
查看原帖
关于我线段树又写挂了
745358
ChenZQ楼主2024/4/6 11:11

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 100010;
int n,m;
int a[N],seg[N << 2],tag[N << 2],st[N << 2];
int b[N][7];
void pushdown(int u)
{
	tag[u*2]=tag[u];tag[u*2+1]=tag[u];
	st[u*2]+=tag[u];st[u*2+1]+=tag[u];
	tag[u]=0;
}
void pushup(int u)
{
	st[u]=min(st[u*2],st[u*2+1]);
	seg[u]=seg[u*2]+seg[u*2+1];
}
void build_tree(int l,int r,int u)
{
	if(l==r)
	{
		seg[u]=a[l];
		return;
	}
	int mid=(l+r)/2;
	build_tree(l,mid,u*2);build_tree(mid+1,r,u*2+1);
	seg[u]=seg[u*2]+seg[u*2+1];
}
void update(int l,int r,int x,int y,int u)
{
	if(l>=x && r<=y && st[u]>=6) return;
	if(l==r)
	{
		int t=(int)sqrt((double)seg[u]);
		seg[u]=t;
		return;
	}
	pushdown(u);
	int mid=(l+r)/2;
	
	if(mid>=x && l<=y) update(l,mid,x,y,u*2);
	if(r>=x && mid+1<=y) update(mid+1,r,x,y,u*2+1);
	pushup(u);
}
void segst(int l,int r,int x,int y,int u)
{
	if(l>=x && r<=y && st[u]>=6) return;
	if(l==r)
	{
		st[u]++;
		return;
	} 
	if(l==r) return;
	
	if(l>=x && r<=y)
	{
		st[u]++;
		tag[u]++;
		pushdown(u);
		return;
	}
	int mid=(l+r)/2;
	if(mid>=x && l<=y) segst(l,mid,x,y,u*2);
	if(r>=x && mid+1<=y) segst(mid+1,r,x,y,u*2+1);
	pushup(u);
}
int ask(int l,int r,int x,int y,int u)
{
	if(l>=x && r<=y) {pushdown(u);return seg[u];}
	if(l==r) return 0;
    pushdown(u);
	int mid=(l+r)/2;
	int k=0;
	if(mid>=x && l<=y) k+=ask(l,mid,x,y,u*2);
	if(r>=x && mid+1<=y) k+=ask(mid+1,r,x,y,u*2+1);
	return k;
}

signed main()
{
	scanf("%lld",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",&a[i]);
		int x=a[i];
		for(int j=1;j<=6;j++) b[i][j]=sqrt(x),x=sqrt(x);
	}
	build_tree(1,n,1);
	scanf("%lld",&m);
	while(m--)
	{
		int op,x,y;
		scanf("%lld%lld%lld",&op,&x,&y);
		if(op==0) update(1,n,x,y,1),segst(1,n,x,y,1);
		else
		{
			printf("%lld\n",ask(1,n,x,y,1));
		}
	}
} 

这道题我超时了,代码求调

2024/4/6 11:11
加载中...