题目链接

暴力数据结构之线段树$qwq$

裸题直接敲板子

忘了啥时候写的了$qwq$

直接上代码吧

  1. /**************************************************************
  2. Problem: 1798
  3. User: zhangheran
  4. Language: C++
  5. Result: Accepted
  6. Time:6372 ms
  7. Memory:10688 kb
  8. ****************************************************************/
  9.  
  10. #include<cstdio>
  11. #include<iostream>
  12. #include<algorithm>
  13. using namespace std;
  14. typedef long long ll;
  15. int n;
  16. int m;
  17. long long mod;
  18. struct lt
  19. {
  20. long long val[];
  21. long long lazy[];
  22. long long lazzy[];
  23. inline void update(int p,int l,int r)
  24. {
  25. val[p]*=lazzy[p];
  26. val[p]%=mod;
  27. val[p]+=lazy[p]*(r-l);
  28. val[p]%=mod;
  29. return;
  30. }
  31. inline void pushdown(int p,int l,int r)
  32. {
  33. update(p,l,r);
  34. if(r-l>)
  35. {
  36. lazy[*p]*=lazzy[p];
  37. lazy[*p]+=lazy[p];
  38. lazy[*p]%=mod;
  39. lazzy[*p]*=lazzy[p];
  40. lazzy[*p]%=mod;
  41. lazy[*p+]*=lazzy[p];
  42. lazy[*p+]+=lazy[p];
  43. lazy[*p+]%=mod;
  44. lazzy[*p+]*=lazzy[p];
  45. lazzy[*p+]%=mod;
  46. }lazy[p]=;
  47. lazzy[p]=;
  48. return;
  49. }
  50. ll build(int p,int l,int r)
  51. {
  52. lazzy[p]=;
  53. if(r-l==)
  54. {
  55. scanf("%lld",&val[p]);
  56. val[p]%=mod;
  57. return val[p];
  58. }
  59. int mid=(l+r)/;
  60. if(mid>l)val[p]+=build(*p,l,mid);
  61. if(mid<r)val[p]+=build(*p+,mid,r);
  62. val[p]%=mod;
  63. return val[p];
  64. }
  65. void setplus(int p,int l,int r,int dl,int dr,long long plus)
  66. {
  67. if(lazy[p]!=||lazzy[p]!=) pushdown(p,l,r);
  68. if(l==dl&&r==dr)
  69. {
  70. lazy[p]+=plus;
  71. lazy[p]%=mod;
  72. pushdown(p,l,r);
  73. return;
  74. }
  75. int mid=(l+r)/;
  76. if(mid>dl) setplus(*p,l,mid,dl,min(mid,dr),plus);
  77. else pushdown(*p,l,mid);
  78. if(mid<dr) setplus(*p+,mid,r,max(mid,dl),dr,plus);
  79. else pushdown(*p+,mid,r);
  80. val[p]=(val[*p]+val[*p+])%mod;
  81. return;
  82. }
  83. void setmult(int p,int l,int r,int dl,int dr,long long mult)
  84. {
  85. if(lazzy[p]!=||lazy[p]!=)pushdown(p,l,r);
  86. if(l==dl&&r==dr)
  87. {
  88. lazy[p]*=mult;
  89. lazzy[p]*=mult;
  90. lazy[p]%=mod;
  91. lazzy[p]%=mod;
  92. pushdown(p,l,r);
  93. return;
  94. }
  95. int mid=(l+r)/;
  96. if(mid>dl) setmult(*p,l,mid,dl,min(mid,dr),mult);
  97. else pushdown(*p,l,mid);
  98. if(mid<dr)setmult(*p+,mid,r,max(mid,dl),dr,mult);
  99. else pushdown(*p+,mid,r);
  100. val[p]=(val[*p]+val[*p+])%mod;
  101. return;
  102. }
  103. ll sum(int p,int l,int r,int dl,int dr)
  104. {
  105. if(lazy[p]!=||lazzy[p]!=) pushdown(p,l,r);
  106. if(l==dl&&r==dr) return val[p];
  107. int mid=(l+r)/;
  108. ll res=;
  109. if(mid>dl) res+=sum(*p,l,mid,dl,min(mid,dr));
  110. if(mid<dr) res+=sum(*p+,mid,r,max(mid,dl),dr);
  111. res%=mod;
  112. return res;
  113. }
  114. }lt;
  115. int main()
  116. {
  117. scanf("%d%d",&n,&mod);
  118. lt.build(,,n);scanf("%d",&m);
  119. for(int i=;i<=m;i++)
  120. {
  121. int opt,u,v;
  122. scanf("%d%d%d",&opt,&u,&v);
  123. if(opt==)
  124. {
  125. int t;
  126. scanf("%d",&t);
  127. lt.setmult(,,n,u-,v,t);
  128. }
  129. else if(opt==)
  130. {
  131. int t;
  132. scanf("%d",&t);
  133. lt.setplus(,,n,u-,v,t);
  134. }
  135. else if(opt==)
  136. printf("%lld\n",lt.sum(,,n,u-,v));
  137. }
  138. return ;
  139. }

bzoj1798维护序列的更多相关文章

  1. BZOJ1798 维护序列seq

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

  2. 【双标记线段树】bzoj1798维护序列seq

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

  3. bzoj1798 维护序列

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

  4. p2023&bzoj1798 维护序列

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

  5. BZOJ-1798 维护序列

    线段树.支持区间加.区间乘.区间查询和. 标记下移还有取模要注意. var n,p,q,i,s,t:longint; a:int64; num,n1,n2,n3:array[0..500000] of ...

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

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

  7. [AHOI 2009] 维护序列(线段树模板题)

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

  8. bzoj 维护序列seq(双标记线段树)

    Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 4184  Solved: 1518[Submit][Status][Discus ...

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

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

随机推荐

  1. Centos下nginx支持https协议

    1.首先配置nginx及其他插件,这个Google下,很多配置方案. 2.配置服务器的证书.操作步骤如下: [root@localhost ~]# cd /etc/pki/tls/certs [roo ...

  2. 概览JVM的基本结构和JVM内存结构

    概览JVM的基本结构和JVM的内存结构 这里概要介绍一下JVM在启动后,作为操作系统的一个进程的基本结构,以及从操作系统角度看,JVM如何管理它从操作系统里申请来的内存的,也就是JVM的内存结构或者叫 ...

  3. 201671010127 2016—2017-2 通过一个小程序对Java的再认识。

    学习了将近四周的Java语言,对于Java语言,我也有了更进一步的理解,出于对Java语言的喜爱,我总是喜欢没事的时候,自己敲一些很简单的代码,一边学习Java语言,一边对比C语言,往往可以帮助我们更 ...

  4. mysql免安装版1067错误终极解决办法|在windows平台下MySql启动时的1067错误的解决方法及反思

    [windows事件查看] 我的电脑--此电脑--右键管理--计算机管理--系统工具--事件查看器--Windows日志--应用程序--找错误标志,如下图 [提示] 按部就班,可能并不能解决你的问题, ...

  5. js 操作table

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default4.aspx.cs ...

  6. 命令行编译java的一点总结

    今天在使用命令行编译时遇到些问题,顺便又仔细分析了一些基础知识,记录总结一下. 下面使用javac和java命令都是在 D:\Workspace\java目录下执行的: 1 //Inner.java ...

  7. solidity错误处理

    官方文档: https://solidity.readthedocs.io/en/develop/control-structures.html#error-handling-assert-requi ...

  8. Introduction to Partial View

    By Jignesh Trivedi on May 14, 2015 http://www.c-sharpcorner.com/UploadFile/ff2f08/partial-view-in-mv ...

  9. Binder的工作机制浅析

    在Android开发中,Binder主要用于Service中,包括AIDL和Messenger,其中Messenger的底层实现就是AIDL,所以我们这里通过AIDL来分析一下Binder的工作机制. ...

  10. psimpl_v7_win32_demo

    psimpl - generic n-dimensional polyline simplification 通用N维折线简化程序 Author - Elmar de Koning 作者 - Elma ...