传送门

写这道题是为了get一个同时传送乘法下标和加法下标的小技巧,线段树模板题。不多说。

标记名字打错无限智力--

 //BZOJ 1798
 //by Cydiater
 //2016.9.13
 #include <iostream>
 #include <cstdio>
 #include <cstring>
 #include <string>
 #include <algorithm>
 #include <queue>
 #include <map>
 #include <iomanip>
 #include <cstdlib>
 #include <cmath>
 #include <ctime>
 using namespace std;
 #define ll unsigned long long
 #define up(i,j,n)        for(int i=j;i<=n;i++)
 #define down(i,j,n)        for(int i=j;i>=n;i--)
 #define FILE "seqb"
 ;
 const ll oo=0x3f3f3f3f;
 inline ll read(){
     ,f=;
     ;ch=getchar();}
     +ch-';ch=getchar();}
     return x*f;
 }
 struct SegTree{
     ll v,delta1,delta2,leftt,rightt;
 }t[MAXN<<];
 ll N,mod,M,op,x,y,Delta1,Delta2,a[MAXN];
 namespace solution{
     inline void downit(int node){
         if(t[node].leftt==t[node].rightt)return;
         ll delta1=t[node].delta1,delta2=t[node].delta2,leftt,rightt;
         t[node].delta1=;t[node].delta2=;
         ){
             t[node<<].delta1*=delta2;t[node<<].delta1%=mod;
             t[node<<].delta2*=delta2;t[node<<].delta2%=mod;
             t[node<<].v*=delta2;t[node<<].delta2%=mod;
             t[node<<|].delta1*=delta2;t[node<<|].delta1%=mod;
             t[node<<|].delta2*=delta2;t[node<<|].delta2%=mod;
             t[node<<|].v*=delta2;t[node<<|].delta2%=mod;
         }
         leftt=t[node<<].leftt;rightt=t[node<<].rightt;
         t[node<<].delta1+=delta1;t[node<<].delta1%=mod;
         t[node<<].v+=(rightt-leftt+)*delta1;t[node<<].v%=mod;
         leftt=t[node<<|].leftt;rightt=t[node<<|].rightt;
         t[node<<|].delta1+=delta1;t[node<<|].delta1%=mod;
         t[node<<|].v+=(rightt-leftt+)*delta1;t[node<<|].v%=mod;
     }
     inline ].v+t[node<<|].v)%mod;}
     inline void updata(int leftt,int rightt,int root){
         downit(root);
         if(leftt>y||rightt<x)                return;
         if(leftt>=x&&rightt<=y){
             if(Delta1){
                 t[root].delta1+=Delta1;
                 t[root].v+=(rightt-leftt+)*Delta1;
                 t[root].delta1%=mod;
                 t[root].v%=mod;
             }
             ){
                 t[root].delta1*=Delta2;t[root].delta1%=mod;
                 t[root].delta2*=Delta2;t[root].delta2%=mod;
                 t[root].v*=Delta2;t[root].v%=mod;
             }
             return;
         }
         ;
         updata(leftt,mid,root<<);
         updata(mid+,rightt,root<<|);
         reload(root);
     }
     inline ll find(int leftt,int rightt,int root){
         downit(root);
         ;
         if(leftt>=x&&rightt<=y)        return t[root].v;
         ;
         )+find(mid+,rightt,root<<|))%mod;
     }
     inline void build(int leftt,int rightt,int root){
         t[root].delta2=;
         if(leftt==rightt){
             t[root].leftt=t[root].rightt=leftt;
             t[root].v=a[leftt];t[root].delta1=;
             return;
         }
         t[root].leftt=leftt;t[root].rightt=rightt;t[root].delta1=;
         ;
         build(leftt,mid,root<<);
         build(mid+,rightt,root<<|);
         reload(root);
     }
     void slove(){
         N=read();mod=read();
         up(i,,N)a[i]=read();
         build(,N,);
         M=read();
         while(M--){
             op=read();x=read();y=read();
             ){
                 Delta1=;Delta2=read();
                 updata(,N,);
             }
             ){
                 Delta1=read();Delta2=;
                 updata(,N,);
             }
             ){
                 printf(,N,));
                 //cout<<find(1,N,1)<<endl;
             }
         }
     }
 }
 int main(){
     //freopen(FILE".in","r",stdin);
     //freopen("input.in","r",stdin);
     //freopen(FILE".out","w",stdout);
     using namespace solution;
     slove();
     ;
 }

BZOJ1798: [Ahoi2009]Seq 维护序列seq的更多相关文章

  1. BZOJ1798: [Ahoi2009]Seq 维护序列seq[线段树]

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 5504  Solved: 1937[Submit ...

  2. BZOJ 1798: [Ahoi2009]Seq 维护序列seq( 线段树 )

    线段树.. 打个 mul , add 的标记就好了.. 这个速度好像还挺快的...( 相比我其他代码 = = ) 好像是#35.. ---------------------------------- ...

  3. 1798: [Ahoi2009]Seq 维护序列seq

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 2930  Solved: 1087[Submit ...

  4. bzoj 1798: [Ahoi2009]Seq 维护序列seq (线段树 ,多重标记下放)

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 7773  Solved: 2792[Submit ...

  5. bzoj 1798: [Ahoi2009]Seq 维护序列seq 线段树 区间乘法区间加法 区间求和

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeO ...

  6. Bzoj 1798: [Ahoi2009]Seq 维护序列seq(线段树区间操作)

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小可 ...

  7. BZOJ1798[Ahoi2009]Seq 维护序列seq 题解

    题目大意: 有长为N的数列,有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一段数全部加一个值; (3)询问数列中的一段数的和,由于答案可能很大,你只需输出这个数模P的值. ...

  8. 【bzoj1798】[Ahoi2009]Seq 维护序列seq 线段树

    题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一 ...

  9. 【分块】bzoj1798 [Ahoi2009]Seq 维护序列seq

    分块,打标记,维护两个标记:乘的 和 加的. 每次 区间乘的时候,对 乘标记 和 加标记 都 乘上那个值. 每次 区间加的时候 对 加标记 加上那个值. (ax+b)*v=axv+bv.开 long ...

  10. [bzoj1798][Ahoi2009]Seq 维护序列seq ([洛谷P3373]【模板】线段树 2)

    题目大意:有$n$个数,有$m$个操作,有三种: $1\;l\;r\;x:$把区间$[l,r]$内的数乘上$x$ $2\;l\;r\;x:$把区间$[l,r]$内的数加上$x$ $3\;l\;r:$询 ...

随机推荐

  1. css+div 浮动分块

    前段时间学过几天html,只是怀着了解的态度,能够读懂别人的页面,能够扒现成就行,一直没有自己动手去实践过,其实也不是没有实践过,前段时间扒了一个网页,想按照自己的要求来改,可后果是越改越乱.今天心血 ...

  2. 又发现个.net framework的坑

    请找出这两个方法的区别: http://msdn.microsoft.com/en-us/library/ms584187(v=vs.110).aspx

  3. ContentProvider详解

    作用:把一个App中的数据库通过Url的形式共享出来,供其他App使用. 首先在App1中创建一个数据库,用SQLiteOpenHelper public class MyOpenHelper ext ...

  4. htop查看系统负载

    htop 是 Linux 系统中的一个互动进程查看器,可以让用户进行交互式操作,可横向或纵向滚动浏览进程列表,支持鼠标操作.用户可以在安装 htop 来监控服务器的负载. 01.下载 https:// ...

  5. 有趣的问题--12 coins problem

    问题描述: 12个金币,其中有一枚是假的,重量与众不同. 现有一架天平,需要你用最少的次数来称重,然后告诉我: (1)哪个金币是假的 (2)它到底是更轻还是更重.   (注:此处为3次)     {解 ...

  6. MyBatis学习总结

    1.引入jar包到lib目录下:只需要mybatis的一个mybatis.jar及数据库的jar包. 2.在src下新建xml配置文件,即上图中的conf.xml <?xml version=& ...

  7. Shell命令_awk命令

    # awk '条件1{动作1} 条件2{动作2}-' 文件名 条件( Pattern): 一般使用关系表达式作为条件 x > 10 判断变量 x是否大于10 x>=10 大于等于 x< ...

  8. AOP 学习笔记

    代理是一个设计模式,提供了对目标对象另外的访问方式:即通过代理访问目标对象. 好处:可以在目标对象实现的基础上,增强额外的功能操作. Cglib 代理,也叫作 子类代理. JDK的动态代理有一个限制, ...

  9. 【HDU 4408】Minimum Spanning Tree(最小生成树计数)

    Problem Description XXX is very interested in algorithm. After learning the Prim algorithm and Krusk ...

  10. AFnetworking3.1的基本使用

    听说之后AFHttpWorking版本可能会影响到苹果的审核,今天下了最新版本的AFHttpWorking,并且做了简单的封装,我这里是通过cocoapods下载了两个工具 1=AFHttpWorki ...