将每个点看成二维坐标点$(i,a_i)$,那么每次操作的范围都是一个矩形。

于是建立KD-Tree,通过打标记支持操作即可。

时间复杂度$O(m\sqrt{n})$。

  1. #include<cstdio>
  2. #include<algorithm>
  3. const int N=50010,P=536870912;
  4. int n,m,i,root,cmp_d,ans,op,A,B,C,D,E;
  5. struct info{
  6. int a,b;
  7. info(){a=1,b=0;}
  8. info(int _a,int _b){a=_a,b=_b;}
  9. info operator+(info x){return info(1LL*x.a*a%P,(1LL*x.a*b+x.b)%P);}
  10. }tmp;
  11. struct node{
  12. int d[2],l,r,Max[2],Min[2];
  13. int cnt,val,sum;
  14. info tag;
  15. }T[N];
  16. inline bool cmp(const node&a,const node&b){return a.d[cmp_d]<b.d[cmp_d];}
  17. inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
  18. inline void umax(int&a,int b){if(a<b)a=b;}
  19. inline void umin(int&a,int b){if(a>b)a=b;}
  20. inline void up(int x){
  21. T[x].cnt=1;
  22. if(T[x].l){
  23. T[x].cnt+=T[T[x].l].cnt;
  24. umax(T[x].Max[0],T[T[x].l].Max[0]);
  25. umin(T[x].Min[0],T[T[x].l].Min[0]);
  26. umax(T[x].Max[1],T[T[x].l].Max[1]);
  27. umin(T[x].Min[1],T[T[x].l].Min[1]);
  28. }
  29. if(T[x].r){
  30. T[x].cnt+=T[T[x].r].cnt;
  31. umax(T[x].Max[0],T[T[x].r].Max[0]);
  32. umin(T[x].Min[0],T[T[x].r].Min[0]);
  33. umax(T[x].Max[1],T[T[x].r].Max[1]);
  34. umin(T[x].Min[1],T[T[x].r].Min[1]);
  35. }
  36. }
  37. int build(int l,int r,int D){
  38. int mid=(l+r)>>1;
  39. cmp_d=D,std::nth_element(T+l+1,T+mid+1,T+r+1,cmp);
  40. T[mid].Max[0]=T[mid].Min[0]=T[mid].d[0];
  41. T[mid].Max[1]=T[mid].Min[1]=T[mid].d[1];
  42. if(l!=mid)T[mid].l=build(l,mid-1,!D);
  43. if(r!=mid)T[mid].r=build(mid+1,r,!D);
  44. return up(mid),mid;
  45. }
  46. inline void tag(int x,info p){
  47. T[x].val=(1LL*p.a*T[x].val+p.b)%P;
  48. T[x].sum=(1LL*p.a*T[x].sum+1LL*p.b*T[x].cnt)%P;
  49. T[x].tag=T[x].tag+p;
  50. }
  51. inline void pb(int x){
  52. if(T[x].tag.a==1&&T[x].tag.b==0)return;
  53. if(T[x].l)tag(T[x].l,T[x].tag);
  54. if(T[x].r)tag(T[x].r,T[x].tag);
  55. T[x].tag=info();
  56. }
  57. void change(int x){
  58. if(T[x].Max[E]<A||T[x].Min[E]>B)return;
  59. if(T[x].Min[E]>=A&&T[x].Max[E]<=B){tag(x,tmp);return;}
  60. pb(x);
  61. if(T[x].d[E]>=A&&T[x].d[E]<=B)T[x].val=(1LL*C*T[x].val+D)%P;
  62. if(T[x].l)change(T[x].l);
  63. if(T[x].r)change(T[x].r);
  64. T[x].sum=(T[x].val+T[T[x].l].sum+T[T[x].r].sum)%P;
  65. }
  66. void ask(int x){
  67. if(T[x].Max[E]<A||T[x].Min[E]>B)return;
  68. if(T[x].Min[E]>=A&&T[x].Max[E]<=B){ans=(ans+T[x].sum)%P;return;}
  69. pb(x);
  70. if(T[x].d[E]>=A&&T[x].d[E]<=B)ans=(ans+T[x].val)%P;
  71. if(T[x].l)ask(T[x].l);
  72. if(T[x].r)ask(T[x].r);
  73. T[x].sum=(T[x].val+T[T[x].l].sum+T[T[x].r].sum)%P;
  74. }
  75. int main(){
  76. read(n),read(m);
  77. for(i=1;i<=n;i++)T[i].d[0]=i,read(T[i].d[1]);
  78. root=build(1,n,0);
  79. while(m--){
  80. read(op),read(A),read(B),ans=0,E=op&1;
  81. if(op<2)read(C),read(D),tmp=info(C%=P,D%=P);
  82. if(op==0)change(root);
  83. if(op==1)change(root);
  84. if(op==2)ask(root),printf("%d\n",ans);
  85. if(op==3)ask(root),printf("%d\n",ans);
  86. }
  87. return 0;
  88. }

  

BZOJ4303 : 数列的更多相关文章

  1. BZOJ4303:数列

    浅谈\(K-D\) \(Tree\):https://www.cnblogs.com/AKMer/p/10387266.html 题目传送门:https://lydsy.com/JudgeOnline ...

  2. C#求斐波那契数列第30项的值(递归和非递归)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  3. BZOJ1500[NOI2005]维修数列

    Description Input 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目.第2行包含N个数字,描述初始时的数列.以下M行,每行一 ...

  4. PAT 1049. 数列的片段和(20)

    给定一个正数数列,我们可以从中截取任意的连续的几个数,称为片段.例如,给定数列{0.1, 0.2, 0.3, 0.4},我们有(0.1) (0.1, 0.2) (0.1, 0.2, 0.3) (0.1 ...

  5. 斐波拉契数列加强版——时间复杂度O(1),空间复杂度O(1)

    对于斐波拉契经典问题,我们都非常熟悉,通过递推公式F(n) = F(n - ) + F(n - ),我们可以在线性时间内求出第n项F(n),现在考虑斐波拉契的加强版,我们要求的项数n的范围为int范围 ...

  6. fibonacci数列(五种)

    自己没动脑子,大部分内容转自:http://www.jb51.net/article/37286.htm 斐波拉契数列,看起来好像谁都会写,不过它写的方式却有好多种,不管用不用的上,先留下来再说. 1 ...

  7. js中的斐波那契数列法

    //斐波那契数列:1,2,3,5,8,13…… //从第3个起的第n个等于前两个之和 //解法1: var n1 = 1,n2 = 2; for(var i=3;i<101;i++){ var ...

  8. 洛谷 P1182 数列分段Section II Label:贪心

    题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成M(M≤N)段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一数列4 2 4 5 1要分成3段 将其如下分段: [4 ...

  9. 剑指Offer面试题:8.斐波那契数列

    一.题目:斐波那契数列 题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项.斐波那契数列的定义如下: 二.效率很低的解法 很多C/C++/C#/Java语言教科书在讲述递归函数的时 ...

随机推荐

  1. TCP协议漏洞影响大量Linux设备

    导读 本周三在得州奥斯丁举行的 USENIX 安全研讨会上,加州大学河滨分校研究生 Yue Cao 将报告一个严重的TCP协议边信道漏洞(PDF),该漏洞允许攻击者远程劫持任意两主机之间的会话.该漏洞 ...

  2. Unity 3D 粒子系统的一点经验

    http://hunterwang.diandian.com/post/2012-10-21/40041523890 最近做东西需要增加效果,简单的运用了一下粒子效果,真心感觉比较难调整好效果.同时也 ...

  3. compact过滤数组中的nil

    http://ruby-doc.org/core-2.2.0/Array.html#method-i-compact compact → new_aryclick to toggle source R ...

  4. [BZOJ1220][POJ1091][HNOI2002]跳蚤

    [BZOJ1220][POJ1091][HNOI2002]跳蚤 试题描述 Z城市居住着很多只跳蚤.在Z城市周六生活频道有一个娱乐节目.一只跳蚤将被请上一个高空钢丝的正中央.钢丝很长,可以看作是无限长. ...

  5. Android程序启动程序与页面的跳转

    package login; import com.example.login.R; import android.app.Activity; import android.content.Inten ...

  6. 《linux备份与恢复之二》3.19 dump(文件系统备份)

    <Linux指令从初学到精通>第3章文件管理,本章介绍了许多常用命令,如cp.ln.chmod.chown.diff.tar.mv等,因为这些都与文件管理相关,在日常的使用中经常用到,因此 ...

  7. Dom lesson1

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. iOS 一个工程中引用其他工程时要注意Skip Install选项

    当主工程引用其他工程,以便使用他们生成的库的时候,在发布时,主要注意这个选项.这个选项的说明如下 Activating this setting when deployment locations a ...

  9. C# 支持多种语言

    通过Resource文件建立本地化. net 资源文件名(这里是Resource1.resx)由根名称(即Resource1),本地语言名称(默认情况下还没有)及扩展名组成,在读取资源时,资源管理器会 ...

  10. Python网络编程(4)——异步编程select & epoll

    在SocketServer模块的学习中,我们了解了多线程和多进程简单Server的实现,使用多线程.多进程技术的服务端为每一个新的client连接创建一个新的进/线程,当client数量较多时,这种技 ...