#include<bits/stdc++.h>
using namespace std;
#define MAXN 100000
#define M ((L+R)>>1)
#define lc (id<<1)
#define rc (id<<1|1)
#define LL long long
LL C[(MAXN<<)+];
LL P,laz1[(MAXN<<)+],laz2[(MAXN<<)+];
void build(int L,int R,int id)
{
laz1[id]=;
laz2[id]=;
if(L==R) {scanf("%lld",&C[id]);C[id]%=P;return;}
build(L,M,lc);
build(M+,R,rc);
C[id]=(C[lc]+C[rc])%P;
}
void pushdown(int L,int R,int id)
{
if(laz1[id]==&&laz2[id]==) return;
laz1[lc]=laz1[lc]*laz1[id]%P;
laz1[rc]=laz1[rc]*laz1[id]%P;
laz2[lc]=(laz2[lc]*laz1[id]%P+laz2[id])%P;
laz2[rc]=(laz2[rc]*laz1[id]%P+laz2[id])%P;
C[lc]=(C[lc]*laz1[id]%P+(M+-L)*laz2[id]%P)%P;
C[rc]=(C[rc]*laz1[id]%P+((LL)R-M)*laz2[id]%P)%P;
laz1[id]=;
laz2[id]=;
}
void update1(int L,int R,int id,int l,int r,int x)
{
if(L>=l&&R<=r)
{
laz1[id]=laz1[id]*x%P;
laz2[id]=laz2[id]*x%P; //id当前拥有的标记已经计算过
C[id]=(C[id]*x)%P;
return;
}
pushdown(L,R,id);
if(l<=M) update1(L,M,lc,l,r,x);
if(r>M) update1(M+,R,rc,l,r,x);
C[id]=(C[lc]+C[rc])%P;
}
void update2(int L,int R,int id,int l,int r,int x)
{
if(L>=l&&R<=r)
{
laz2[id]=(laz2[id]+x)%P;
C[id]=(C[id]+(LL)(R+-L)*x%P)%P;
return;
}
pushdown(L,R,id);
if(l<=M) update2(L,M,lc,l,r,x);
if(r>M) update2(M+,R,rc,l,r,x);
C[id]=(C[lc]+C[rc])%P;
}
LL ask(int L,int R,int id,int l,int r)
{
if(L>=l&&R<=r) {return C[id]%P;}
pushdown(L,R,id);
LL tmp=;
if(l<=M) tmp=(tmp+ ask(L,M,lc,l,r))%P;
if(r>M) tmp=(tmp+ ask(M+,R,rc,l,r))%P;
C[id]=(C[lc]+C[rc])%P;
return tmp%P;
}
int main()
{
int T,N,m,i,j,k,s;
int x,l,r,c;
scanf("%d%lld",&N,&P);
build(,N,);
scanf("%d",&m);
while(m--)
{
scanf("%d",&x);
if(x==){
scanf("%d%d%d",&l,&r,&c);
update1(,N,,l,r,c);
}
else if(x==){
scanf("%d%d%d",&l,&r,&c);
update2(,N,,l,r,c);
}
else{
scanf("%d%d",&l,&r);
printf("%lld\n",ask(,N,,l,r));
}
}
91 1798: [Ahoi2009]Seq 维护序列seq

Time Limit: 30 Sec  Memory Limit: 64 MB
Submit: 6680  Solved: 2377
[Submit][Status][Discuss]

Description

老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成。
有长为N的数列,不妨设为a1,a2,…,aN 。有如下三种操作形式:
(1)把数列中的一段数全部乘一个值;
(2)把数列中的一段数全部加一个值;
(3)询问数列中的一段数的和,由于答案可能很大,你只需输出这个数模P的值。

Input

第一行两个整数N和P(1≤P≤1000000000)。第二行含有N个非负整数,从左到右依次为a1,a2,…,aN, (0≤ai≤1000000000,1≤i≤N)。第三行有一个整数M,表示操作总数。从第四行开始每行描述一个操作,输入的操作有以下三种形式:
操作1:“1 t g c”(不含双引号)。表示把所有满足t≤i≤g的ai改为ai×c (1≤t≤g≤N,0≤c≤1000000000)。
操作2:“2 t g c”(不含双引号)。表示把所有满足t≤i≤g的ai改为ai+c (1≤t≤g≤N,0≤c≤1000000000)。
操作3:“3 t g”(不含双引号)。询问所有满足t≤i≤g的ai的和模P的值
(1≤t≤g≤N)。
同一行相邻两数之间用一个空格隔开,每行开头和末尾没有多余空格。

Output

对每个操作3,按照它在输入中出现的顺序,依次输出一行一个整数表示询问结果。

Sample Input

7 43
1 2 3 4 5 6 7
5
1 2 5 5
3 2 4
2 3 7 9
3 1 3
3 4 7

Sample Output

2
35
8

HINT

【样例说明】

初始时数列为(1,2,3,4,5,6,7)。
经过第1次操作后,数列为(1,10,15,20,25,6,7)。
对第2次操作,和为10+15+20=45,模43的结果是2。
经过第3次操作后,数列为(1,10,24,29,34,15,16}
对第4次操作,和为1+10+24=35,模43的结果是35。
对第5次操作,和为29+34+15+16=94,模43的结果是8。

测试数据规模如下表所示

数据编号 1 2 3 4 5 6 7 8 9 10
N= 10 1000 1000 10000 60000 70000 80000 90000 100000 100000
M= 10 1000 1000 10000 60000 70000 80000 90000 100000 100000

Source

Day1

d
对于标记数组的理解还是不清楚导致WA数发,如果这个结点标记数组有值说明这些操作已经对这个结点做过了,只是留下标记方便下传而已,不需要再次用这个标记

操作这个结点。还有就是这个题目有加法和乘法标记两种,如果不考虑先后次序直接累加在原先的标记上是错误的做法,然而我就是这样......   po

我们定义当前结点的标记  mul=x,add=y  表示在这个节点的每个值都需要乘上x再加上y,所以初始时所有的结点 mul=1,add=0

对于pushdown数组如果这个结点的标记向下传递,假设子节点的标记为 mul=x1   add=y1. 传递之后mul和add怎么累加在一起表示呢,

对于元素a相当于 ((a*x1+y1)*x+y)=a*x*x1+y1*x+y,显然 mul=x*x1 add=y1*x+y;                         //因为x1,y1是先前存在的标记所以先操作x1,y1

要明确这两个结点的标记累加在一起是为了传递给子节点的子节点,因为上面说过有标记的点自然已经被标记改变过了,对于传递下来的标记改变节点的值这点很容易做到 只要  sum=(sum*x+len*add) 即可。

我们要明确标记的作用是对接受标记的节点依据标记值做出想造成的变化,两层标记加在一起要不影响下面接受时的变化,

对于上面的a(接受标记方)来说就是要mul=x*x1   add=y1*x+yl

说的有些语无伦次了。。。

[S

bzoj 1798 双标记区间修改线段树的更多相关文章

  1. Codeforces Round #538 (Div. 2) F 欧拉函数 + 区间修改线段树

    https://codeforces.com/contest/1114/problem/F 欧拉函数 + 区间更新线段树 题意 对一个序列(n<=4e5,a[i]<=300)两种操作: 1 ...

  2. POJ 2528 - Mayor's posters - [离散化+区间修改线段树]

    题目链接:http://poj.org/problem?id=2528 Time Limit: 1000MS Memory Limit: 65536K Description The citizens ...

  3. 【BZOJ3110】【整体二分+树状数组区间修改/线段树】K大数查询

    Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...

  4. hihoCoder #1078 : 线段树的区间修改(线段树区间更新板子题)

    #1078 : 线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题 ...

  5. 2017 CCPC 杭州 HDU6273J 区间修改(线段树&差分数组)

    http://acm.hdu.edu.cn/downloads/CCPC2018-Hangzhou-ProblemSet.pdf 解析 线段树区间延迟更新 或 差分数组 两个数   统计2和3的最少的 ...

  6. bzoj 1798 维护序列seq 线段树

    裸的线段树,注意标签下放就行了 多么痛的领悟,一定要开int64 /************************************************************** Pro ...

  7. BZOJ 4653: [Noi2016]区间 双指针 + 线段树

    只要一堆线段有重叠次数大于等于 $m$ 次的位置,那么一定有解 因为重叠 $m$ 次只需 $m$ 个线断,将那些多余的线断排除掉即可 先将区间按照长度从小到大排序,再用 $two-pointer$ 从 ...

  8. NOIp 2012 #2 借教室 Label:区间修改线段树

    题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然 ...

  9. [BZOJ 1483] [HNOI2009] 梦幻布丁 (线段树合并)

    [BZOJ 1483] [HNOI2009] 梦幻布丁 (线段树合并) 题面 N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1 ...

随机推荐

  1. MFC程序执行过程剖析

    一 MFC程序执行过程剖析 1)我们知道在WIN32API程序当中,程序的入口为WinMain函数,在这个函数当中我们完成注册窗口类,创建窗口,进入消息循环,最后由操作系统根据发送到程序窗口的消息调用 ...

  2. 2017浙江省赛 C - What Kind of Friends Are You? ZOJ - 3960

    地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3960 题目: Japari Park is a large zoo ...

  3. POJ - 3648 Wedding (2-SAT 输出解决方案)

    题意:有N-1对夫妇和1对新郎新娘要出席婚礼,这N对人要坐在走廊两侧.要求每对夫妇要坐在不同侧.有M对人有通奸关系,对于这一对人,不能同时坐在新娘对面(新娘新郎也可能和别人有通奸关系).求如何避免冲突 ...

  4. lvds split两channel输出到一个屏显示

    转:https://blog.csdn.net/changqing1990/article/details/81128552 其实之前写过LCD/LVDS的一些时序的基本概念<与LCD移植相关的 ...

  5. 高可用Mysql架构_Mycat集群部署(HAProxy + 两台Mycat+Mysql双主双从)

    既然大家都知道了Mysql分布式在大型网站架构中的作用,在这里就不再阐述.本片博客文章是基于我曾经搭建过的一个Mysql集群基础上实现的,实现过双主热备.读写分离.分库分表. 博客链接:http:// ...

  6. Cisco 交换Trunk配置

    交换Trunk配置 #进入直连端口下 config)#int f0/1 #配置trunk封装协议 config)#switchport trunk encapsulation dot1q #配置为tr ...

  7. # 20145314《信息安全系统设计基础》期中复习总结 Part B

    20145314<信息安全系统设计基础>期中复习总结 Part B 学习知识点内容总结 复习线索:http://group.cnblogs.com/topic/73069.html 本周的 ...

  8. 20145314郑凯杰 《Java程序设计》第1周学习总结

    20145314郑凯杰 <Java程序设计>第1周学习总结 教材学习内容总结 跟着教材的顺序开始总结我学过的内容: 1.三大平台 JAVA SE ,JAVA EE,JAVA ME 从毕向东 ...

  9. git操作方便,简单使用的客户端sourcetree 安装配置所遇问题总结

    常言道:工欲善其事,必先利其器. SourceTree是老牌的Git GUI管理工具了,也号称是最好用的Git GUI工具 这里先言言它的好: * 免费 * 功能强大:无论你是新手还是重度用户,Sou ...

  10. java中把指数形式的数字转为正常形式显示

    /** * 当浮点型数据位数超过10位之后,数据变成科学计数法显示.用此方法可以使其正常显示. * @param value * @return Sting */ public static Stri ...