[hdoj4578][多延迟标记的线段树]
Transformation
Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 65535/65536 K (Java/Others)
Total Submission(s): 9392 Accepted Submission(s): 2408
There are n integers, a1, a2, …, an. The initial values of them are 0. There are four kinds of operations.
Operation 1: Add c to each number between ax and ay inclusive. In other words, do transformation ak<---ak+c, k = x,x+1,…,y.
Operation 2: Multiply c to each number between ax and ay inclusive. In other words, do transformation ak<---ak×c, k = x,x+1,…,y.
Operation 3: Change the numbers between ax and ay to c, inclusive. In other words, do transformation ak<---c, k = x,x+1,…,y.
Operation 4: Get the sum of p power among the numbers between ax and ay inclusive. In other words, get the result of axp+ax+1p+…+ay p.
Yuanfang has no idea of how to do it. So he wants to ask you to help him.
For each case, the first line contains two numbers n and m, meaning that there are n integers and m operations. 1 <= n, m <= 100,000.
Each the following m lines contains an operation. Operation 1 to 3 is in this format: "1 x y c" or "2 x y c" or "3 x y c". Operation 4 is in this format: "4 x y p". (1 <= x <= y <= n, 1 <= c <= 10,000, 1 <= p <= 3)
The input ends with 0 0.
3 3 5 7
1 2 4 4
4 1 5 2
2 2 5 8
4 3 5 3
0 0
7489
#include<bits/stdc++.h>
using namespace std;
#define debug(x) cout<<"["<<#x<<"]"<<" is "<<x<<endl
#define forp(x) for(int i=1;i<=x;i++)
#define scai(x) scanf("%d",&x)
#define scal(x) scanf("%lld",&x)
#define pri(x) printf("%d\n",x)
#define prl(x) printf("%lld\n",x)
typedef long long ll;
const int maxn=1e5+;
const ll mod=1e4+;
struct node{
int l;
int r;
ll ad;
ll mu;
ll a[];
}N[maxn<<];
void pushup(int rt){
N[rt].a[]=N[rt<<].a[]+N[(rt<<)|].a[];
N[rt].a[]=N[rt<<].a[]+N[(rt<<)|].a[];
N[rt].a[]=N[rt<<].a[]+N[(rt<<)|].a[];
N[rt].mu%=mod;
N[rt].ad%=mod;
N[rt].a[]%=mod;
N[rt].a[]%=mod;
N[rt].a[]%=mod;
}
void pushdown(int rt){
if(N[rt].mu!=){
ll m=N[rt].mu;
N[rt].mu=;
N[rt<<].ad=N[rt<<].ad*m%mod;
N[(rt<<)|].ad=N[(rt<<)|].ad*m%mod;
N[rt<<].mu=N[rt<<].mu*m%mod;
N[(rt<<)|].mu=N[(rt<<)|].mu*m%mod;
N[rt<<].a[]=N[rt<<].a[]*m%mod;
N[rt<<].a[]=N[rt<<].a[]*m%mod*m%mod;
N[rt<<].a[]=N[rt<<].a[]*m%mod*m%mod*m%mod;
N[(rt<<)|].a[]=N[(rt<<)|].a[]*m%mod;
N[(rt<<)|].a[]=N[(rt<<)|].a[]*m%mod*m%mod;
N[(rt<<)|].a[]=N[(rt<<)|].a[]*m%mod*m%mod*m%mod;
}
if(N[rt].ad!=){
ll m=N[rt].ad;
N[rt].ad=;
N[rt<<].ad=N[rt<<].ad+m%mod;
N[(rt<<)|].ad=N[(rt<<)|].ad+m%mod;
N[rt<<].a[]=N[rt<<].a[]+m%mod*m%mod*m%mod*(N[rt<<].r-N[rt<<].l+)%mod+*m*N[rt<<].a[]%mod+*m%mod*m%mod*N[rt<<].a[]%mod;
N[rt<<].a[]%=mod;
N[rt<<].a[]=N[rt<<].a[]+m%mod*m%mod*(N[rt<<].r-N[rt<<].l+)%mod+*m*N[rt<<].a[]%mod;
N[rt<<].a[]%=mod;
N[rt<<].a[]=N[rt<<].a[]+m*(N[rt<<].r-N[rt<<].l+)%mod;
N[rt<<].a[]%=mod;
N[(rt<<)|].a[]=N[(rt<<)|].a[]%mod+m%mod*m%mod*m%mod*(N[(rt<<)|].r-N[(rt<<)|].l+)%mod+*m*N[(rt<<)|].a[]%mod+*m%mod*m%mod*N[(rt<<)|].a[]%mod;
N[(rt<<)|].a[]%=mod;
N[(rt<<)|].a[]=N[(rt<<)|].a[]%mod+m%mod*m%mod*(N[(rt<<)|].r-N[(rt<<)|].l+)%mod+*m*N[(rt<<)|].a[]%mod;
N[(rt<<)|].a[]%=mod;
N[(rt<<)|].a[]=N[(rt<<)|].a[]+m*(N[(rt<<)|].r-N[(rt<<)|].l+)%mod;
N[(rt<<)|].a[]%=mod;
}
}
void build(int L,int R,int rt){
N[rt].l=L;
N[rt].r=R;
N[rt].mu=;
N[rt].ad=;
if(L==R){
N[rt].a[]=;
N[rt].a[]=;
N[rt].a[]=;
return;
}
int mid=(L+R)/;
build(L,mid,rt<<);
build(mid+,R,(rt<<)|);
pushup(rt);
}
void update(int L,int R,int rt,int l1,int r1,ll add,ll mul){
N[rt].mu%=mod;
N[rt].ad%=mod;
N[rt].a[]%=mod;
N[rt].a[]%=mod;
N[rt].a[]%=mod;
if(l1<=L&&r1>=R){
if(mul!=){
ll m=mul;
N[rt].ad=N[rt].ad*m%mod;
N[rt].mu=N[rt].mu*m%mod;
N[rt].a[]=N[rt].a[]*m%mod;
N[rt].a[]=N[rt].a[]*m%mod*m%mod;
N[rt].a[]=N[rt].a[]*m%mod*m%mod*m%mod;
}
if(add!=){
ll m=add;
N[rt].ad=N[rt].ad+m%mod;
N[rt].a[]=N[rt].a[]+m%mod*m%mod*m%mod*(N[rt].r-N[rt].l+)%mod+*m*N[rt].a[]%mod+*m%mod*m%mod*N[rt].a[]%mod;
N[rt].a[]%=mod;
N[rt].a[]=N[rt].a[]+m%mod*m%mod*(N[rt].r-N[rt].l+)%mod+*m%mod*N[rt].a[]%mod;
N[rt].a[]%=mod;
N[rt].a[]=N[rt].a[]+m*(N[rt].r-N[rt].l+)%mod;
N[rt].a[]%=mod;
}
return;
}
pushdown(rt);
int mid=(L+R)/;
if(mid>=l1){
update(L,mid,rt<<,l1,r1,add,mul);
}
if(mid<r1){
update(mid+,R,(rt<<)|,l1,r1,add,mul);
}
pushup(rt);
}
ll query(int L,int R,int rt,int l1,int r1,int p){
N[rt].mu%=mod;
N[rt].ad%=mod;
N[rt].a[]%=mod;
N[rt].a[]%=mod;
N[rt].a[]%=mod;
if(l1<=L&&r1>=R){
return N[rt].a[p]%mod;
}
int mid=(L+R)/;
ll ak=;
pushdown(rt);
if(mid>=l1){
ak+=query(L,mid,rt<<,l1,r1,p);
}
if(mid<r1){
ak+=query(mid+,R,(rt<<)|,l1,r1,p);
} return ak%mod;
}
int main(){
int n,m;
scai(n);
scai(m);
while(n||m){
build(,n,);
forp(m){
ll a,b,c,d;
scal(a);
scal(b);
scal(c);
scal(d);
if(a==){
update(,n,,b,c,d,);
}
else if(a==){
update(,n,,b,c,,d);
}
else if(a==){
update(,n,,b,c,d,);
}
else{
prl(query(,n,,b,c,d));
}
}
scai(n);
scai(m);
}
return ;
}
[hdoj4578][多延迟标记的线段树]的更多相关文章
- HDU 1698 just a hook - 带有lazy标记的线段树(用结构体实现)
2017-08-30 18:54:40 writer:pprp 可以跟上一篇博客做个对比, 这种实现不是很好理解,上一篇比较好理解,但是感觉有的地方不够严密 代码如下: /* @theme:segme ...
- HDU1698 just a Hook - 带有lazy标记的线段树
2017-08-30 16:44:33 writer:pprp 上午刚刚复习了一下不带有lazy标记的线段树, 下午开始学带有lazy标记的线段树 这个是我看大佬代码敲的,但是出了很多问题, 这提醒我 ...
- 洛谷 1083 (NOIp2012) 借教室——标记永久化线段树 / 差分+二分
题目:https://www.luogu.org/problemnew/show/P1083 听说线段树不标记永久化会T一个点. 注意mn记录的是本层以下.带上标记的min! #include< ...
- [HDU5306]Gorgeous Sequence(标记回收线段树)
题意:维护一个序列,支持区间与一个数取min,询问区间最大,询问区间和(序列长度<=1e6) 分析: http://www.shuizilong.com/house/archives/hdu-5 ...
- 带有lazy标记的线段树
#include<bits/stdc++.h> using namespace std; ]; struct st{ int l,r,val,add; }tr[]; void build( ...
- Codeforces 444C 线段树 懒惰标记
前天晚上的CF比赛div2的E题,很明显一个线段树,当时还在犹豫复杂度的问题,因为他是区间修改和区间查询,肯定是要用到懒惰标记. 然后昨天真的是给这道题跪了,写了好久好久,...我本来是写了个add标 ...
- 洛谷 P3373 【模板】线段树 2
洛谷 P3373 [模板]线段树 2 洛谷传送门 题目描述 如题,已知一个数列,你需要进行下面三种操作: 将某区间每一个数乘上 xx 将某区间每一个数加上 xx 求出某区间每一个数的和 输入格式 第一 ...
- 【ACM/ICPC2013】线段树题目集合(一)
前言:前一段时间在网上找了一个线段树题目列表,我顺着做了一些,今天我把做过的整理一下.感觉自己对线段树了解的还不是很深,自己的算法能力还要加强.光练代码能力还是不够的,要多思考.向队友学习,向大牛学习 ...
- 可持久化线段树——区间更新hdu4348
和线段树类似,每个结点也要打lazy标记 但是lazy标记和线段树不一样 具体区别在于可持久化后lazy-tag不用往下传递,而是固定在这个区间并不断累加,变成了这个区间固有的性质(有点像分块的标记了 ...
随机推荐
- K8S从入门到放弃系列-(9)kubernetes集群之kubelet部署
摘要: Kubelet组件运行在Node节点上,维持运行中的Pods以及提供kuberntes运行时环境,主要完成以下使命: 1.监视分配给该Node节点的pods 2.挂载pod所需要的volume ...
- LeetCode 题目的 Python 实现(持续更新中)
Python-LeetCode 是一个使用 Python 语言解决 LeetCode 问题的代码库,库有以下几个方面需要注意: 所有题目都是 AC 的: 按照题目顺序,每 50 个放在一个目录下,方便 ...
- Centos7.3安装jdk和maven
安装jdk和maven 通过winscp上传jdk 解压 tar -zxvf jdk-8u91-linux-x64.ta ...
- 利用Python进行数据分析 第4章 IPython的安装与使用简述
本篇开始,结合前面所学的Python基础,开始进行实战学习.学习书目为<利用Python进行数据分析>韦斯-麦金尼 著. 之前跳过本书的前述基础部分(因为跟之前所学的<Python基 ...
- glib系列1 编译
1 安装 meson glib 使用 meson进行构建,需要python3,首先下载meson, meson/meson.py 就是程序本身了,可以直接运行 git clone https://gi ...
- STM32的I2C通讯过程
使用I2C外设通讯时,在通讯的不同阶段它会对“状态寄存器(SR1 及SR2)”的不同数据位写入参数,通过读取这些寄存器标志来了解通讯状态. 1.主发送器 可使用STM32标准库函数来直接检测这些事件的 ...
- SAS学习笔记5 字符截取语句(index、compress、substr、scan函数)
index:返回一个字符串中,某个特定字符或字符串的位置,找不到时返回0 compress:从一个字符串移除特定的字符 substr函数 字符替换与提取字符 substr(s, p, n)从变量s的第 ...
- Map 集合遍历的4种方法
Map 集合初始化时,指定集合初始值大小. 说明:HashMap 使用 HashMap(int initialCapacity) 初始化. 正例:initialCapacity = (需要存储的元素个 ...
- 一个炒鸡好用的pdf阅读器
下载地址:https://www.sumatrapdfreader.org/free-pdf-reader.html 一个关系很好的同事推荐的pdf阅读器 之前用的感觉不错 每次都记不住 自己收 ...
- Python 生成动态变量 调用动态变量
动态生成变量: variable = locals() for i in range(10): variable['A'+str(i)] = 123 print(A8) 调用动态变量: v = loc ...