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< ...
随机推荐
- Bash Shell中命令行选项/参数处理
0.引言 写程序的时候经常要处理命令行参数,本文描述在Bash下的命令行处理方式. 选项与参数: 如下一个命令行: ./test.sh -f config.conf -v --prefix=/home ...
- Zlib not installed
若提示:zlib not installed wget http://zlib.net/zlib-1.2.8.tar.gz tar zxf zlib-1.2.8.tar.gz cd zlib- ...
- ubuntu+qt+opencv
linux下Qt+OpenCv环境的搭建: https://blog.csdn.net/yaowangII/article/details/84303124 1.qt:https://blog.csd ...
- vim如何达到高效
参考:http://blog.jobbole.com/44891/ 搜索技巧 1. 使用*快速查询当前光标所在的单词 然后使用n快速找到下一个查询结果: 使用N快速找到上一个查询结果 2. 在.vim ...
- node_exporter + grafana
监控服务器CPU.内存.磁盘.I/O等信息,首先需要安装node_exporter.node_exporter的作用是用于机器系统数据收集. 下载安装: https://github.com/prom ...
- PAT_A1077#Kuchiguse
Source: PAT A1077 Kuchiguse (20 分) Description: The Japanese language is notorious for its sentence ...
- C语言|博客作业6
一.本周教学内容&目标 第3章 分支结构 3.1-3.2 使学生熟悉多分支结构.字符型数据类型和逻辑运算符. 二.本周作业头 问题 答案 这个作业属于那个课程 C语言程序设计II 这个作业要求 ...
- VM虚拟机启动centos出现内部错误
内部错误 解决办法 1.关闭虚拟机后,单击VM,右键,以管理员身份运行. 2.找到电脑的 管理— Vmware workstation server ,默认状态下是手动,把他改为自动重启就可以啦.
- leetcode.图.207课程表-Java
1. 具体题目 现在你总共有 n 门课需要选,记为 0 到 n-1.在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1].给定 ...
- BZOJ 4657 (网络流)
题面 Nick最近在玩一款很好玩的游戏,游戏规则是这样的: 有一个n*m的地图,地图上的每一个位置要么是空地,要么是炮塔,要么是一些BETA狗,Nick需要操纵炮塔攻击BETA狗们. 攻击方法是:对于 ...