HDU4578-Transformation-线段树的加、乘、变、次方操作
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-线段树的加、乘、变、次方操作的更多相关文章
- HDU4578 Transformation 线段树
这个题让我重新学习了加 乘 在区间的操作 题解:http://blog.csdn.net/guognib/article/details/25324025?utm_source=tuicool& ...
- 【CF52C】Circular RMQ(线段树区间加减,区间最值)
给定一个循环数组a0, a1, a2, …, an-1,现在对他们有两个操作: Inc(le, ri, v):表示区间[le, ri]范围的数值增加v Rmq(le, ri):表示询问区间[le, r ...
- hdu 4578 Transformation 线段树多种操作裸题
自己写了一个带结构体的WA了7.8次 但是测了几组小数据都对..感觉问题应该出在模运算那里.写完这波题解去对拍一下. 以后线段树绝不写struct!一般的struct都带上l,r 但是一条线段的长度确 ...
- vijos 1659 河蟹王国 线段树区间加、区间查询最大值
河蟹王国 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 https://vijos.org/p/1659 Description 河蟹王国有一位河蟹国王,他 ...
- 30-Transformation(HDU4578)-区间线段树(复杂)
http://acm.hdu.edu.cn/showproblem.php?pid=4578 Transformation Time Limit: 15000/8000 MS (Java/Others ...
- 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 ...
- 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 ...
- Transformation 线段树好题 好题 (独立写出来对线段树不容易)
Transformation Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 65535/65536 K (Java/Others)T ...
- 线段树 区间加 gcd 差分 小阳的贝壳
小阳的贝壳 如果线段树要维护区间gcd 这个很简单,但是如果有了区间加,维护gcd 就比较麻烦了. 这个首先可以证明的是 gcd(x,y,z)=gcd(x,y-x,z-y) 这个可以推到 n 个 ...
- HDU 4578 Transformation --线段树,好题
题意: 给一个序列,初始全为0,然后有4种操作: 1. 给区间[L,R]所有值+c 2.给区间[L,R]所有值乘c 3.设置区间[L,R]所有值为c 4.查询[L,R]的p次方和(1<=p< ...
随机推荐
- iis 跨域设置多域名
首先下载 https://www.iis.net/downloads/microsoft/url-rewrite 在最下方 然后在Web.config 文件里面 <configuration&g ...
- linux的CentOS、Ubuntu、Debian三个比较异同
Linux有非常多的发行版本,从性质上划分,大体分为由商业公司维护的商业版本与由开源社区维护的免费发行版本.商业版本以Redhat为代表,开源社区版本则以debian为代表.这些版本各有不同的特点,在 ...
- [Java 教程 02] 开发环境搭建
在上一篇文章对Java做了一个简单介绍之后,我想大家都已经对她有一个初步的认识了吧!那踏入正式学习使用Java之前,我们有一步是不得不做的,它是什么呢?没有错,就是我们本篇文章的标题所说,搭建Java ...
- tf.add_to_collection,tf.get_collection简介
tf.add_to_collection:把变量放入一个集合,把很多变量变成一个列表 tf.get_collection:从一个结合中取出全部变量,是一个列表 tf.add_n:把一个列表的东西都依次 ...
- APScheduler的简单记录
此工具作为 定时任务调度 系统,在日常业务中经常使用,如定时获取第三方数据,定时清理数据 等等: 定时任务 和 业务逻辑 编写方式 一般有2种: 以 定时 清理db数据为例,在flask中,如下: 1 ...
- SQL join的示意图
SQL join 用于把来自两个或多个表的行结合起来. 下图展示了 LEFT JOIN.RIGHT JOIN.INNER JOIN.OUTER JOIN 相关的 7 种用法. 注意JOIN要和ON相连 ...
- mongodb重置密码
1.删除服务,重新创建没有验证的服务 2.关闭服务后修改conf文件auth=false或者 3.重新开启服务后然后进入mongo 查看是否存在用户 use admin db.system.users ...
- Spring boot与thymeleaf的集成
# thymeleaf热部署 spring.thymeleaf.cache=false @Value("${spring.thymeleaf.cache}") p ...
- SQL中的DQL查询语句
目录 1. DQL:查询语句 排序查询 聚合函数 分组查询 分页查询 2. 约束 3. 多表之间的关系 4. 范式 DQL:查询语句 1. 排序查询 语法:order by 子句 order by 排 ...
- 根据mysql数据库 定义solr Schema.xml中配置业务域
<!--product--> <field name="product_name" type="text_ik" indexed=" ...