[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不用往下传递,而是固定在这个区间并不断累加,变成了这个区间固有的性质(有点像分块的标记了 ...
随机推荐
- lamp和xampp和lampp的区别
lamp:我们最常说的lamp,是一种系统环境,由Linux+Apache+Mysql+PHP构成,常用来运行web服务器.要在系统上完成这个环境的安装,可以很复杂的一步一步编译和设置,也可以用已经集 ...
- layer弹出层,结合art-template实现弹出编辑
模板 <!-- 模板 --> <script id="render-tpl" type="text/html"> <div cla ...
- 腾讯云+阿里云 搭建hadoop + hbase
目录 服务器配置 hadoop hbase JAVA测试 历时两天,踩了无数坑最后搭建成功... 准备 两台服务器都安装jdk1.8(最好装在相同路径). hadoop 下载 hbase 下载 这里使 ...
- quartz 简单定时器
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring- ...
- php 之分页
$a=$_FILES; // print_r($a);die; foreach ($a as $key => $value) { $k=$key; } // $_FILES['license'] ...
- Python列表排序方法reverse、sort、sorted详解
python语言中的列表排序方法有三个:reverse反转/倒序排序.sort正序排序.sorted可以获取排序后的列表.在更高级列表排序中,后两中方法还可以加入条件参数进行排序. reverse() ...
- WUSTOJ 1279: Wallace and His Pet(Java)
1279: Wallace and His Pet 题目 给出一句话(英文),单词总数不超过1000,每个单词不超过10个字符,一句话只有一个唯一的字符"."(句点).将这句话 ...
- 机器学习笔记--Hoeffding霍夫丁不等式
Hoeffding霍夫丁不等式 在<>第八章"集成学习"部分, 考虑二分类问题\(y \in \{-1, +1\}\) 和真实函数\(f\), 假定基分类器的错误率为\ ...
- javascript 写一个ajax 自动拦截,并下载数据
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...
- 应用人员反馈报错,ORA-03137: TTC protocol internal error : [12333]
一.报错现象 应用人员反馈连接不上数据库,连接报错. 我们使用PLSQL发现可以连接数据库,但是数据库DB Alert存在如下报错信息 DB AlertFri Oct :: Errors ): ORA ...