Sample Input
5 5
3 3 5 7
1 2 4 4
4 1 5 2
2 2 5 8
4 3 5 3
0 0

Sample Output

307
7489 题意:
给出n,m,表示该数有n个节点,m次操作。
接下来m次操作,op、x、y、z,
op=1时,将区间内每个元素+z
op=2时,将区间内每个元素*z
op=3时,将区间内每个元素都变成z
op=4时,求出区间内每个元素的p次方之和输出且对mod10007取余。 数组说明:
a[i]:该区间相等元素值
book[i]: 假设该节点下面的儿子节点全部相等则标记为0,否则为1

对于op=4时的次方操作:
if(L<=l&&r<=R&&book[i]==)
{
ll ans=;
for(int k=; k<p; k++)
ans=(ans*a[i])%mod;
ans=(ans*(r-l+))%mod;
return ans;
}


 #include<stdio.h>
#include<map>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<stack>
#include<cmath>
#include<vector>
using namespace std;
typedef long long ll;
const int mod=;
const int N=1e5+; int a[*N];
bool book[*N]; void pushdown(int i)
{
if(book[i<<]||book[i<<|])
book[i]=;
else if(a[i<<]!=a[i<<|])
book[i]=;
else
{
book[i]=;
a[i]=a[i<<]=a[i<<|];//因为a[i<<1]==a[i<<1|1]
}
}
//1 x y 1 n
void update(int i,int L,int R,int l,int r,int z,int op)
{
if(L<=l&&r<=R&&book[i]==)//1不相等 0相等
{
if(op==)
a[i]=(a[i]+z)%mod;
else if(op==)
a[i]=(a[i]*z)%mod;
else if(op==)
a[i]=z;
return;
}
if(book[i]==)
{
book[i<<]=book[i<<|]=;
a[i<<]=a[i<<|]=a[i];
book[i]=;
}
int mid=(l+r)>>;
if(L<=mid)
update(i<<,L,R,l,mid,z,op);
if(R>mid)
update(i<<|,L,R,mid+,r,z,op);
pushdown(i);//a[i]=a[i<<1]+a[i<<1|1];
} ll query(int i,int L,int R,int l,int r,int p)
{
if(L<=l&&r<=R&&book[i]==)
{
ll ans=;
for(int k=;k<p;k++)
ans=(ans*a[i])%mod;
ans=(ans*(r-l+))%mod;
return ans;
}
if(book[i]==)
{
book[i<<]=book[i<<|]=;
a[i<<]=a[i<<|]=a[i];
book[i]=;
}
int mid=(l+r)>>;
ll ans=;
if(L<=mid)
ans+=query(i<<,L,R,l,mid,p);
if(R>mid)
ans+=query(i<<|,L,R,mid+,r,p);
return ans%mod; } int main()
{
int n,m,op,L,R,z;
while(cin>>n>>m)
{
if(n==&&m==)
break;
memset(book,,sizeof(book));//假设全相等标记为0//book[1]表示该节点下面的元素不相等
memset(a,,sizeof(a));//该区间相等元素值
for(int i=; i<m; i++)
{
cin>>op>>L>>R>>z;
if(op!=) //1+,2*,3变为z,
update(,L,R,,n,z,op);
else //*z次方
{
ll ans=query(,L,R,,n,z)%mod;
printf("%lld\n",ans);
}
}
}
return ;
}

 

 

HDU4578-Transformation-线段树的加、乘、变、次方操作的更多相关文章

  1. HDU4578 Transformation 线段树

    这个题让我重新学习了加 乘 在区间的操作 题解:http://blog.csdn.net/guognib/article/details/25324025?utm_source=tuicool& ...

  2. 【CF52C】Circular RMQ(线段树区间加减,区间最值)

    给定一个循环数组a0, a1, a2, …, an-1,现在对他们有两个操作: Inc(le, ri, v):表示区间[le, ri]范围的数值增加v Rmq(le, ri):表示询问区间[le, r ...

  3. hdu 4578 Transformation 线段树多种操作裸题

    自己写了一个带结构体的WA了7.8次 但是测了几组小数据都对..感觉问题应该出在模运算那里.写完这波题解去对拍一下. 以后线段树绝不写struct!一般的struct都带上l,r 但是一条线段的长度确 ...

  4. vijos 1659 河蟹王国 线段树区间加、区间查询最大值

    河蟹王国 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 https://vijos.org/p/1659 Description 河蟹王国有一位河蟹国王,他 ...

  5. 30-Transformation(HDU4578)-区间线段树(复杂)

    http://acm.hdu.edu.cn/showproblem.php?pid=4578 Transformation Time Limit: 15000/8000 MS (Java/Others ...

  6. poj 3468 A Simple Problem with Integers 线段树区间加,区间查询和

    A Simple Problem with Integers Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://poj.org/problem?i ...

  7. poj 3468 A Simple Problem with Integers 线段树区间加,区间查询和(模板)

    A Simple Problem with Integers Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://poj.org/problem?i ...

  8. Transformation 线段树好题 好题 (独立写出来对线段树不容易)

    Transformation Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 65535/65536 K (Java/Others)T ...

  9. 线段树 区间加 gcd 差分 小阳的贝壳

    小阳的贝壳 如果线段树要维护区间gcd 这个很简单,但是如果有了区间加,维护gcd 就比较麻烦了. 这个首先可以证明的是 gcd(x,y,z)=gcd(x,y-x,z-y)   这个可以推到 n 个 ...

  10. HDU 4578 Transformation --线段树,好题

    题意: 给一个序列,初始全为0,然后有4种操作: 1. 给区间[L,R]所有值+c 2.给区间[L,R]所有值乘c 3.设置区间[L,R]所有值为c 4.查询[L,R]的p次方和(1<=p< ...

随机推荐

  1. python3+django2 个人简单博客实现 -正在施工

  2. Dubbo 系列(07-3)集群容错 - 负载均衡

    目录 Dubbo 系列(07-3)集群容错 - 负载均衡 Spring Cloud Alibaba 系列目录 - Dubbo 篇 1. 背景介绍 1.1 负载均衡算法 1.2 继承体系 2. 源码分析 ...

  3. 重定向和转向的写法,重定向以post方式提交

    重转向保留跳转过来的Referer,路径不会变1 request.getRequestDispatcher("/eventweb/index.sp?loginId=" + logi ...

  4. 修改el-input

    无论是input框,还是select, 都是对 el-input 进行修改: .houseRegisterCompany .el-input{ width: 130px; }

  5. java并发编程之美-阅读记录5

    java并发包中的并发List 5.1CopeOnWriteArrayList 并发包中的并发List只有CopyOnWriteArrayList,该类是一个线程安全的arraylist,对其进行的修 ...

  6. MyBatis中XML 映射配置文件的简单介绍

    官网写的比较具体,可以查看以下的网站: http://www.mybatis.org/mybatis-3/zh/configuration.html 另外,实际用到标准的CRUD的操作和查询列表, & ...

  7. YARN学习笔记

    分布式资源调度框架 Yet Another Resource Negotiator YARN 不同框架使用相同的系统资源 YARN的核心组件(架构) ResourceManager RM 整个集群同一 ...

  8. go语言从例子开始之Example7.switch分支结构

    switch ,方便的条件分支语句 package main import "fmt" import "time" func main() { 一个基本的 sw ...

  9. nginx实现高性能负载均衡的Tomcat集群

    1. 安装软件: nginx 两个apache-tomcat 安装过程省略. 2.配置两个tomcat的http端口,第一个为18080,第二个为28080 注意:需要把server.xml文件中所有 ...

  10. 【串线篇】SpringMvc数据传出

    /** * SpringMVC除过在方法上传入原生的request和session外还能怎么样把数据带给页面 *  * 四大域: *  pageContext:${pageScope.msg }< ...