[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不用往下传递,而是固定在这个区间并不断累加,变成了这个区间固有的性质(有点像分块的标记了 ...
随机推荐
- ASP.NET请求过程-基本过程
客户端发送请求到达服务器 输入域名->DNS解析->指定IP 服务器(如果网页直接输入IP地址则直接到服务器)->请求到达服务器->HTTP.SYS接受HTTP请求->转 ...
- Docker 部署Jira8.1.0
Jira与Confluence一样,都需要用到独立的数据库,对于数据库的安装我们不做介绍,主要介绍如何用Docker部署Jira以及对Jira进行破解的操作. 1.数据库准备 关于数据库官方文档说明: ...
- K8S从入门到放弃系列-(4)kubernetes集群之kubectl命令行工具部署
摘要:随着版本的不断迭代,k8s为了集群安全,集群中趋向采用TLS+RBAC的安全配置方式,所以我们在部署过程中,所有组件都需要证书,并启用RBAC认证. 我们这里采用二进制安装,下载解压后,把对应组 ...
- redis实战---读书笔记
第一章 初识redis redis 是一个远程内存数据库,性能强劲,具有复制特性以及为解决问题而生的独一无二的数据模型. 1. redis 简介 redis 是一种非关系型数据库(NOSQL) r ...
- Word 英语单词前面的汉字间距变大、Word 英文断词
1. 前言 在写文档时,在用word穿插敲汉字和英语时,会出现英语单词前面的汉字间的间距突然变大的情况,如何解决? 2. 步骤 1.选中间隙变大的段落,然后右键点击段落 2.然后点击中文版式,把允许西 ...
- Spring Boot系列教程十:Spring boot集成MyBatis
一.创建项目 项目名称为 "springboot_mybatis_demo",创建过程中勾选 "Web","MyBatis" ...
- Neo4j查询语句总结
最近一直在做图数据库的相关工作,对neo4j的查询语言Cypher使用较多,故在此总结记录.Cypher作为图数据库的查询语言,感觉和关系型数据库的查询语言sql差不多吧. 1.如何找到一个节点x,x ...
- 18-MySQL DBA笔记-MySQL Server调优
第18章 MySQL Server调优 本章将为读者介绍针对MySQL Server的优化,这也是DBA最熟悉的领域之一.首先我们介绍MySQL的主要参数,然后,讲述常见硬件资源的优化.我们假设读者已 ...
- C# 整型数和浮点型数的进制转换
1.十进制转二进制 /// <summary> /// 十进制转二进制 /// </summary> public class Convert10To2 { /// <s ...
- XXX银行人事管理系统-数据库设计
1. 用户.权限.角色关系用户基本信息 userinfo [人员表]权限表actions[权限表]员工类型表usertype [管理组表]权限映射表actionmapping [权限映射表]权限分栏表 ...