#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. Flask之初体验

    Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后 ...

  2. 145. Binary Tree Postorder Traversal(二叉树后序遍历)

    Given a binary tree, return the postorder traversal of its nodes' values. For example:Given binary t ...

  3. HDU - 4871 Shortest-path tree (最短路径树+ 树分治)

    题意:给你一张带权无向图,先求出这张图从点1出发的最短路树,再求在树上经过k个节点最长的路径值,以及个数. 分析:首先求最短路树,跑一遍最短路之后dfs一遍即可建出最短路树. 第二个问题,树分治解决. ...

  4. web前端基础——初识HTML

    1 HTML概念 HTML(Hypertext Markup Language)即超文本标记语言,是网页的描述语言.它其实是一种描述网页的标准,它通过给需要描述的内容加上标签,浏览器按照HTML语言的 ...

  5. ASP.NET MVC BundleConfig介绍和使用

    1.BundleConfig介绍: 在创建ASP.NET MVC5项目时,默认在App_Start文件夹中创建了BudleConfig.cs文件. public class BundleConfig ...

  6. Linux下编程学习一

    本篇主要记录一些在学习LINUX下编程时,, C和C++语言的一些基础的常识, 一. 函数指针 void MyFun(int x); 函数声明 void (*FunP)(int ); 函数指针声明 下 ...

  7. java的String

    String.valueOf()      将其他类型的值转换成字符串类型 String.intern()          该方法会将字符串常量池中的字符串与外部的字符串(s)进行比较,如果共享池中 ...

  8. getAttribute() 与 attr() 的区别

    getAttribute() 和 attr() 都是获取元素属性的方法,只是一种是 JS 写法,一种是 JQ 写法,但其实它们是有区别的. 主要区别 调用 getAttribute() 的主体必须是元 ...

  9. ubuntu 14.04 163镜像

    1.备份原来/etc/apt/sources.list 2.以下内容覆盖原来文件内容 deb http://mirrors.163.com/ubuntu/ trusty main restricted ...

  10. Eye Protection FAQ

    Q: Why does smart protection not work? A: Please make sure the checkbox "Eye Protection" i ...