HDU ACM 4578 Transformation->段树-间隔的变化

HDU ACM 4578 Transformation->段树-间隔的变化

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

分析:复杂的经营分部树。

只有一个查询操作,这是要求[l,r]的数量之间p钍总和。并不是所有的查询所有节点,会议TLE。最好的是查询部件[a。b]。所有这个区间值我们是平等的,即能返回(b-a+1)*val 的值。区间内全部值都同样的情况的区间。对于置初值和加乘操作。分两种情况:1、当为置初值操作。直接覆盖区间就可以。并把标记的加乘操作赋为初始值。2、当为加乘操作时。先推断当前区间段是否为同样的值,是的话直接加乘,维护这个同样的值就可以。假设不同样,看区间是否已有加乘标记,把这个加乘标记一直传递下去。直到遇见那个区间段区间全部值同样时停止。最后把这个加乘赋给最開始的区间段。简单的说就是,覆盖操作可直接维护,不是覆盖操作的话。区间仅仅能保留一个加乘操作。

#include<iostream>
using namespace std;

#define lz t<<1,l,mid           //左区间
#define rz (t<<1)|1,mid+1,r     //右区间
#define N 100005
#define MOD 10007
__int64 add[N<<2],mul[N<<2],chan[N<<2],sum[N<<2];

void Build(int t,int l,int r)  //建立线段树
{
	int mid;

	mul[t]=1;
	add[t]=sum[t]=0;
	chan[t]=0;
	if(l==r)
	{
		chan[t]=1;           //叶节点设为1。方便询问的查询
		return ;
	}
	mid=(l+r)>>1;
	Build(lz);
	Build(rz);
}

void PushDown(int t,int l,int r)   //标记下传
{
	int mid;

	if(l==r) return ;
	mid=(l+r)>>1;
	if(chan[t])      //set标记下传
	{
		add[t<<1]=0,mul[t<<1]=1;
		add[(t<<1)|1]=0,mul[(t<<1)|1]=1;
		chan[t<<1]=chan[(t<<1)|1]=1;
		sum[t<<1]=sum[(t<<1)|1]=sum[t];
		chan[t]=0;
	}
	else 
	{
		if(add[t])  //加标记下传
		{
	    	if(chan[t<<1]) sum[t<<1]=(sum[t<<1]+add[t])%MOD; //左子树有set标记
    		else
			{
	    		PushDown(lz);   //下传
	    		add[t<<1]=(add[t<<1]+add[t])%MOD;
			}
	     	if(chan[(t<<1)|1]) sum[(t<<1)|1]=(sum[(t<<1)|1]+add[t])%MOD; //左子树有set标记
	    	else
			{
	    		PushDown(rz);   //下传
	    		add[(t<<1)|1]=(add[(t<<1)|1]+add[t])%MOD;
			}
	    	add[t]=0;
		}
		if(mul[t]>1) //乘标记下传
		{
    		if(chan[t<<1]) sum[t<<1]=(sum[t<<1]*mul[t])%MOD; //左子树有set标记
	     	else
			{
		    	PushDown(lz);   //下传
		    	mul[t<<1]=(mul[t<<1]*mul[t])%MOD;
			}
	    	if(chan[(t<<1)|1]) sum[(t<<1)|1]=(sum[(t<<1)|1]*mul[t])%MOD; //左子树有set标记
	    	else
			{
	     		PushDown(rz);   //下传
	    		mul[(t<<1)|1]=(mul[(t<<1)|1]*mul[t])%MOD;
			}
	    	mul[t]=1;
		}
	}
}

void Update(int t,int l,int r,int ul,int ur,int c,int op)
{
	int mid;

	if(l>=ul && ur>=r) //边界
	{
		if(op==3)
			chan[t]=1,mul[t]=1,add[t]=0,sum[t]=c;
		else if(chan[t])
		{
			if(op==1) sum[t]=(sum[t]+c)%MOD;
			else sum[t]=(sum[t]*c)%MOD;
		}
		else
		{
			PushDown(t,l,r);  //下传
			if(op==1) add[t]=(add[t]+c)%MOD;
			else mul[t]=(mul[t]*c)%MOD;
		}
		return ;
	}
	PushDown(t,l,r);
	mid=(l+r)>>1;
	if(ur<=mid) Update(lz,ul,ur,c,op);
	else if(ul>mid) Update(rz,ul,ur,c,op);
	else
	{
		Update(lz,ul,mid,c,op);
		Update(rz,mid+1,ur,c,op);
	}
}

__int64 Query(int t,int l,int r,int ul,int ur,int p)
{
	int mid,i;
	__int64 ans,tp,t1,t2;

	if(ul<=l && r<=ur)
		if(chan[t])
		{
			ans=1;
			tp=sum[t];
			for(i=1;i<=p;i++) ans=(ans*tp)%MOD;
			return (r-l+1)*ans%MOD;              //由于区间的每一个部分都是同样的
		}
	PushDown(t,l,r);  //下传标记
	mid=(l+r)>>1;
	if(ur<=mid) return Query(lz,ul,ur,p);
	else if(ul>mid) return Query(rz,ul,ur,p);
	else
	{
		t1=Query(lz,ul,mid,p);
		t2=Query(rz,mid+1,ur,p);
		return (t1+t2)%MOD;
	}
}

int main()
{
	int n,m,i,l,r,c,op;

	while(scanf("%d%d",&n,&m)==2 && n+m)
	{
		Build(1,1,n);    //1为根节点
		for(i=1;i<=m;i++)
		{
			scanf("%d%d%d%d",&op,&l,&r,&c);
			if(op<=3) Update(1,1,n,l,r,c,op);
			else
				printf("%I64d\n",Query(1,1,n,l,r,c)%MOD);
		}
	}
	return 0;
}

版权声明:本文博主原创文章。博客,未经同意不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116783.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • django request.get_django post请求

    django request.get_django post请求Django在接收到http请求之后,会根据http请求携带的参数以及报文信息创建一个WSGIRequest对象,并且作为视图函数第一个参数传给视图函数。也就是我们经常看到的request参数。在这个

    2022年8月7日
    7
  • 数据结构单链表的算法描述_数据结构创建单链表及其实现

    数据结构单链表的算法描述_数据结构创建单链表及其实现一、什么是链表链表是一种数据结构,跟数组不同,链表不需要连续的内存空间,而是通过指针将零散的内存块连接起来。因此,链表的查找需要通过节点按顺序遍历,而增加与删除通过只需要操作指针指向,这也造成了相

    2022年8月16日
    11
  • Alex 的 Hadoop 菜鸟教程: 第6课 Hbase 安装教程「建议收藏」

    Alex 的 Hadoop 菜鸟教程: 第6课 Hbase 安装教程「建议收藏」这次给大家介绍一下Hbase的概念和安装教程

    2022年5月18日
    95
  • 数据挖掘十大经典算法

    数据挖掘十大经典算法

    2021年12月3日
    38
  • 实现dubbo服务降级

    实现dubbo服务降级dubbo降级服务使用dubbo在进行服务调用时,可能由于各种原因(服务器宕机/网络超时/并发数太高等),调用中就会出现RpcException,调用失败。服务降级就是指在由于非业务异常导致的服务不可用时(上面举得例子),可以返回默认值,避免异常影响主业务的处理。dubbo服务降级配置mock配置方式dubbo官方文档上使用一个mock配置,实现服务降级。mock只在出现非业务异常(比如超时,网络

    2022年6月4日
    79
  • 幼儿绘本-套装

    幼儿绘本-套装书名出版社出版时间定价团价聪明豆绘本系列第1辑6本《聪明豆绘本系列第1辑:咕噜牛》2014-1-125.030.0《聪明豆绘本系列第1辑:咕噜牛小妞妞》2014-1-125.0《聪明豆绘本系列第1辑:女巫扫帚排排坐》2014-1-125.0《聪明豆绘本系列第1辑:小房子变大房子》2014

    2022年7月27日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号