P3373【模板】线段树2

题目描述

如题,已知一个数列,你需要进行下面两种操作:

1.将某区间每一个数加上x

2.将某区间每一个数乘上x

3.求出某区间每一个数的和

输入输出格式

输入格式:

第一行包含三个整数N、M、P,分别表示该数列数字的个数、操作的总个数和模数。

第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值。

接下来M行每行包含3或4个整数,表示一个操作,具体如下:

操作1: 格式:1 x y k 含义:将区间[x,y]内每个数乘上k

操作2: 格式:2 x y k 含义:将区间[x,y]内每个数加上k

操作3: 格式:3 x y 含义:输出区间[x,y]内每个数的和对P取模所得的结果

输出格式:

输出包含若干行整数,即为所有操作3的结果。

输入输出样例

输入样例#1:

5 5 38
1 5 4 2 3
2 1 4 1
3 2 5
1 2 4 2
2 3 5 5
3 1 4
输出样例#1:

17
2

说明

时空限制:1000ms,128M

数据规模:

对于30%的数据:N<=8,M<=10

对于70%的数据:N<=1000,M<=10000

对于100%的数据:N<=100000,M<=100000

(数据已经过加强^_^)

样例说明:

故输出应为17、2(40 mod 38=2)

线段树多个lazy标记的应用。

每个点上的标记表示自己儿子要乘或加上多少。

标记下放时,儿子节点的add标记与儿子节点的值分别先乘上父亲节点的乘标记再加上父亲节点的加标记(因为父亲节点的加标记已经乘上了一些乘标记了,不需要再乘一次)

儿子节点的乘标记直接乘上父亲节点的乘标记。

 #include<iostream>
 #include<cstdio>
 using namespace std;
 ;
 typedef long long ll;
 struct node{
     int l,r;
     ll val,add,time;
 }T[N*];
 ll Mod,a[N];
 inline void build(int l,int r,int x)
 {
     T[x].l=l;
     T[x].r=r;
     T[x].add=;
     T[x].time=;
     if(l!=r)
     {
         ;
         build(l,m,x*);
         build(m+,r,x*+);
         T[x].val=(T[x*].val+T[x*+].val)%Mod;
     }
     else T[x].val=a[l]%Mod;
 }
 inline ll cnt(int l,int r,int x)
 {
     if(l==T[x].l&&r==T[x].r) return T[x].val;
     ;i<=;i++)
     {
         T[x*+i].val=(T[x*+i].val*T[x].time+T[x].add*(T[x*+i].r-T[x*+i].l+))%Mod;
         T[x*+i].add=(T[x*+i].add*T[x].time+T[x].add)%Mod;
         T[x*+i].time=(T[x].time*T[x*+i].time)%Mod;
     }
     T[x].add=;
     T[x].time=;
     ll res=;
     ;
     );
     +);
     )+cnt(m+,r,x*+))%Mod;
     return res;
 }
 inline void addc(int l,int r,int x,ll c,int t)
 {
     if(l==T[x].l&&r==T[x].r)
     {
         )
         {
             T[x].time=(T[x].time*c)%Mod;
             T[x].val=(T[x].val*c)%Mod;
             T[x].add=(T[x].add*c)%Mod;
         }
         else
         {
             T[x].val=(T[x].val+c*(r-l+))%Mod;
             T[x].add=(T[x].add+c)%Mod;
         }
         return;
     }
     ;i<=;i++)
     {
         T[x*+i].val=(T[x*+i].val*T[x].time+T[x].add*(T[x*+i].r-T[x*+i].l+))%Mod;
         T[x*+i].add=(T[x*+i].add*T[x].time+T[x].add)%Mod;
         T[x*+i].time=(T[x].time*T[x*+i].time)%Mod;
     }
     T[x].add=;
     T[x].time=;
     ;
     ,c,t);
     +,c,t);
     else
     {
         addc(l,m,x*,c,t);
         addc(m+,r,x*+,c,t);
     }
     T[x].val=(T[x*].val+T[x*+].val)%Mod;
 }
 int main()
 {
     int n,m,t,l,r;
     ll k;
     scanf("%d%d%lld",&n,&m,&Mod);
     ;i<=n;i++) scanf("%lld",&a[i]);
     build(,n,);
     ;i<=m;i++)
     {
         scanf("%d%d%d",&t,&l,&r);
         ||t==)
         {
             scanf("%lld",&k);
             addc(l,r,,k,t);
         }
         ));
     }
     ;
 }

Luogu3373【模板】线段树2的更多相关文章

  1. hdu 1754 I Hate It (模板线段树)

    http://acm.hdu.edu.cn/showproblem.php?pid=1754 I Hate It Time Limit: 9000/3000 MS (Java/Others)    M ...

  2. 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)

    To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...

  3. hdu3966 树链剖分点权模板+线段树区间更新/树状数组区间更新单点查询

    点权树的模板题,另外发现树状数组也是可以区间更新的.. 注意在对链进行操作时方向不要搞错 线段树版本 #include<bits/stdc++.h> using namespace std ...

  4. 【线段树】【P3372】模板-线段树

    百度百科 Definition&Solution 线段树是一种log级别的树形结构,可以处理区间修改以及区间查询问题.期望情况下,复杂度为O(nlogn). 核心思想见百度百科,线段树即将每个 ...

  5. 算法模板——线段树6(二维线段树:区域加法+区域求和)(求助phile)

    实现功能——对于一个N×M的方格,1:输入一个区域,将此区域全部值作加法:2:输入一个区域,求此区域全部值的和 其实和一维线段树同理,只是不知道为什么速度比想象的慢那么多,求解释...@acphile ...

  6. 【洛谷 p3373】模板-线段树 2(数据结构--线段树)

    题意:已知一个数列,你需要进行下面三种操作:1.将某区间每一个数加上x:2.将某区间每一个数乘上x:3.求出某区间每一个数的和. 解法:(唉 :-(,这题卡住我了......)对于加法和乘法的混合操作 ...

  7. 【洛谷 p3372】模板-线段树 1(数据结构--线段树)

    题目:已知一个数列,你需要进行下面两种操作:1.将某区间每一个数加上x:2.求出某区间每一个数的和. 解法:如题,模版题.需要加上 lazy 标记,也就是我的 upd.lazy 标记的思路就是对一个结 ...

  8. hdu 1754 I Hate It (线段树、单点更新)(PS:ios::sync_with_stdio(false)可以加快cin、cout的读取写出速度)

    I Hate ItTime Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  9. poj 3468 A Simple Problem with Integers 线段树 题解《挑战程序设计竞赛》

    地址 http://poj.org/problem?id=3468 线段树模板 要背下此模板 线段树 #include <iostream> #include <vector> ...

  10. 线段树 扫描线 L - Atlantis HDU - 1542 M - City Horizon POJ - 3277 N - Paint the Wall HDU - 1543

    学习博客推荐——线段树+扫描线(有关扫描线的理解) 我觉得要注意的几点 1 我的模板线段树的叶子节点存的都是 x[L]~x[L+1] 2 如果没有必要这个lazy 标志是可以不下传的 也就省了一个pu ...

随机推荐

  1. Java面向对象知识点

    对象:一切客观存在的事物都是对象 语法部分: 类的概念:1.类是对象的抽象 2.类是客观事物在人脑中的主观反应 3.类是对象的模板 类的设计: 属性:定义位置:类以内,方法以外 实例变量:1 有默认值 ...

  2. vs 2015常用快捷键

    原文 :http://www.23pro.com/post/4.html 1.回到上一个光标位置/前进到下一个光标位置 1)回到上一个光标位置:使用组合键"Ctrl + -"; 2 ...

  3. 【PHP系列】PHP组件详解

    缘起 枫爷之前做过几年的PHP的研发,大部分都是在开源框架的引导下,编写代码.现在依然,本能的会去让我使用某个PHP框架开发PHP应用,也是因为懒吧,没有好好的去研究研究除了框架之外的一些东西. 今天 ...

  4. 不恰当的update语句使用主键和索引导致mysql死锁

    背景知识: 截至目前,MySQL一共向用户提供了包括DBD.HEAP.ISAM.MERGE.MyIAS.InnoDB以及Gemeni这7种Mysql表类型.其中DBD.InnoDB属于事务安全类表,而 ...

  5. VUE2.0实现购物车和地址选配功能学习第五节

    第五节 单件商品金额计算和单选全选功能 1.vue精髓在于操作data模型来改变dom,渲染页面,而不是直接去改变dom 2.加减改变总金额功能: html:<div class="c ...

  6. Android中使用Handler以及CountDownTimer实现包含倒计时的闪屏页面

    上一篇博文<Android中Handler使用浅析>通过实现倒计时闪屏页面的制作引出了Handler的使用方法以及实现原理,博文末尾也提到了实现过程中的Bug,有兴趣的朋友可以点击链接回去 ...

  7. 电子器件行业ERP实施案例

    XX有限公司是一家致力于能源需求侧管理,为工业,建筑,交通等终端能耗领域提供系统高效的能源管理解决方案的中港合资企业,作为最早从事电力计量与采集的省级高新技术企业,自2001年成立以来,专注于用户侧智 ...

  8. H5微场景宽、高度自适应办法

    最近在做一些手机端微场景,发现处理各种手机屏幕分辨率是个很让人头疼的事情,最终找到了一个处理效果比较满意的方案.各位客观请往下看: 如果有过做微场景经历的客官们应该都了解,在代码中给一个元素的宽高设成 ...

  9. C++ 11 学习3:显示虚函数重载(override)

    5.显示虚函数重载 在 C++ 里,在子类中容易意外的重载虚函数.举例来说: struct Base { virtual void some_func(); }; struct Derived : B ...

  10. [POJ1028]Web Navigation(栈)

    这题是01年East Central North的A题,目测是签到题 Description Standard web browsers contain features to move backwa ...