• 智乃酱的cube(线段树维护)




    智乃酱有n个cube(立方体),一开始,这些立方体的长宽高均为1,也就是它们的体积都为1×1×1=1,并且这些立方体从1到n排成一排。
    接下来智乃酱将要进行m次操作。智乃酱可以将l到r这个区间内所有的立方体某个维度增加a,或者向你询问从l到r中所有立方体的体积之和。
    由于这个数字比较大,所以每次查询时你只用输出从l到r中所有立方体的体积之和mod 10^9+7后的结果即可。

    链接:登录—专业IT笔试面试备考平台_牛客网
    来源:牛客网
     

    输入描述:

    第一行输入两个正整数n,m(1≤n≤10^5,1≤m≤4×10^5)表示区间的长度与操作的数目。
    接下来m行,每行首先输入一个字符表示操作的类型。
    当输入的字符为′x′时,还需输入三个整数l,r,a(1≤l≤r≤n,1≤a≤10^9)表示对l到r中所有立方体的x轴上的边的边长增加a。
    当输入的字符为′y′时,还需输入三个整数l,r,a(1≤l≤r≤n,1≤a≤10^9)表示对l到r中所有立方体的y轴上的边的边长增加a。
    当输入的字符为′z′时,还需输入三个整数l,r,a(1≤l≤r≤n,1≤a≤10^9)l,r,a表示对l到r中所有立方体的z轴上的边的边长增加a{a}a。
    当输入的字符为′q′时,还需输入两个整数l,r(1≤l≤r≤n)l表示查询l到r中所有立方体的体积之和mod 10^9+7后的结果。
    
    输入保证至少进行了一次查询操作。

    输出描述:

    对于每个查询操作,输出l到r中所有立方体的体积之和mod 10^9+7后的结果。

    示例1

    输入

    5 9
    x 1 3 1
    y 2 4 1
    q 1 5
    z 3 5 1
    q 1 5
    x 1 5 1
    y 1 5 1
    z 1 5 1
    q 1 5

    输出

    13
    20
    87

    1. #include<bits/stdc++.h>
    2. using namespace std;
    3. #define int long long
    4. const int N=1e5+10;
    5. const int mod=1e9+7;
    6. int n,m;
    7. int add(int a,int b)
    8. {
    9. return (a+b)%mod;
    10. }
    11. int sub(int a,int b)
    12. {
    13. return ((a-b)%mod+mod)%mod;
    14. }
    15. int mul(int a,int b)
    16. {
    17. return a*b%mod;
    18. }
    19. struct node
    20. {
    21. int lza,lzb,lzc;
    22. int x,y,z,xy,xz,yz,xyz;
    23. } t[N*4];
    24. void pushdown(int i,int l,int r)
    25. {
    26. if(t[i].lza)
    27. {
    28. int k=t[i].lza;
    29. int mid=(l+r)>>1;
    30. int f1=mid-l+1,f2=r-mid;
    31. t[i<<1].xyz=add(t[i<<1].xyz,mul(t[i<<1].yz,k));
    32. t[i<<1|1].xyz=add(t[i<<1|1].xyz,mul(t[i<<1|1].yz,k));
    33. t[i<<1].xy=add(t[i<<1].xy,mul(t[i<<1].y,k));
    34. t[i<<1|1].xy=add(t[i<<1|1].xy,mul(t[i<<1|1].y,k));
    35. t[i<<1].xz=add(t[i<<1].xz,mul(t[i<<1].z,k));
    36. t[i<<1|1].xz=add(t[i<<1|1].xz,mul(t[i<<1|1].z,k));
    37. t[i<<1].x=add(t[i<<1].x,mul(f1,k));
    38. t[i<<1|1].x=add(t[i<<1|1].x,mul(f2,k));
    39. t[i<<1].lza=add(t[i<<1].lza,k);
    40. t[i<<1|1].lza=add(t[i<<1|1].lza,k);
    41. t[i].lza=0;
    42. //return;
    43. }
    44. if(t[i].lzb)
    45. {
    46. int k=t[i].lzb;
    47. int mid=(l+r)>>1;
    48. int f1=mid-l+1,f2=r-mid;
    49. t[i<<1].xyz=add(t[i<<1].xyz,mul(t[i<<1].xz,k));
    50. t[i<<1|1].xyz=add(t[i<<1|1].xyz,mul(t[i<<1|1].xz,k));
    51. t[i<<1].xy=add(t[i<<1].xy,mul(t[i<<1].x,k));
    52. t[i<<1|1].xy=add(t[i<<1|1].xy,mul(t[i<<1|1].x,k));
    53. t[i<<1].yz=add(t[i<<1].yz,mul(t[i<<1].z,k));
    54. t[i<<1|1].yz=add(t[i<<1|1].yz,mul(t[i<<1|1].z,k));
    55. t[i<<1].y=add(t[i<<1].y,mul(f1,k));
    56. t[i<<1|1].y=add(t[i<<1|1].y,mul(f2,k));
    57. t[i<<1].lzb=add(t[i<<1].lzb,k);
    58. t[i<<1|1].lzb=add(t[i<<1|1].lzb,k);
    59. t[i].lzb=0;
    60. //return;
    61. }
    62. if(t[i].lzc)
    63. {
    64. int k=t[i].lzc;
    65. int mid=(l+r)>>1;
    66. int f1=mid-l+1,f2=r-mid;
    67. t[i<<1].xyz=add(t[i<<1].xyz,mul(t[i<<1].xy,k));
    68. t[i<<1|1].xyz=add(t[i<<1|1].xyz,mul(t[i<<1|1].xy,k));
    69. t[i<<1].yz=add(t[i<<1].yz,mul(t[i<<1].y,k));
    70. t[i<<1|1].yz=add(t[i<<1|1].yz,mul(t[i<<1|1].y,k));
    71. t[i<<1].xz=add(t[i<<1].xz,mul(t[i<<1].x,k));
    72. t[i<<1|1].xz=add(t[i<<1|1].xz,mul(t[i<<1|1].x,k));
    73. t[i<<1].z=add(t[i<<1].z,mul(f1,k));
    74. t[i<<1|1].z=add(t[i<<1|1].z,mul(f2,k));
    75. t[i<<1].lzc=add(t[i<<1].lzc,k);
    76. t[i<<1|1].lzc=add(t[i<<1|1].lzc,k);
    77. t[i].lzc=0;
    78. //return;
    79. }
    80. }
    81. void pushup(int i)
    82. {
    83. t[i].x=add(t[i<<1].x,t[i<<1|1].x);
    84. t[i].y=add(t[i<<1].y,t[i<<1|1].y);
    85. t[i].z=add(t[i<<1].z,t[i<<1|1].z);
    86. t[i].xy=add(t[i<<1].xy,t[i<<1|1].xy);
    87. t[i].xz=add(t[i<<1].xz,t[i<<1|1].xz);
    88. t[i].yz=add(t[i<<1].yz,t[i<<1|1].yz);
    89. t[i].xyz=add(t[i<<1].xyz,t[i<<1|1].xyz);
    90. }
    91. void build(int i,int l,int r)
    92. {
    93. t[i].lza=t[i].lzb=t[i].lzc=0;
    94. if(l==r)
    95. {
    96. t[i].x=t[i].y=t[i].z=t[i].xy=t[i].xz=t[i].yz=t[i].xyz=1;
    97. return;
    98. }
    99. int mid=(l+r)>>1;
    100. build(i<<1,l,mid);
    101. build(i<<1|1,mid+1,r);
    102. pushup(i);
    103. return;
    104. }
    105. void update(int rt,int l,int r,int L,int R,int type,int val)
    106. {
    107. if(L<=l&&r<=R)
    108. {
    109. if(type==1)
    110. {
    111. int k=val;
    112. int f1=r-l+1;
    113. t[rt].xyz=add(t[rt].xyz,mul(t[rt].yz,k));
    114. t[rt].xy=add(t[rt].xy,mul(t[rt].y,k));
    115. t[rt].xz=add(t[rt].xz,mul(t[rt].z,k));
    116. t[rt].x=add(t[rt].x,mul(f1,k));
    117. t[rt].lza=add(t[rt].lza,k);
    118. return;
    119. }
    120. if(type==2)
    121. {
    122. int k=val;
    123. int f1=r-l+1;
    124. t[rt].xyz=add(t[rt].xyz,mul(t[rt].xz,k));
    125. t[rt].xy=add(t[rt].xy,mul(t[rt].x,k));
    126. t[rt].yz=add(t[rt].yz,mul(t[rt].z,k));
    127. t[rt].y=add(t[rt].y,mul(f1,k));
    128. t[rt].lzb=add(t[rt].lzb,k);
    129. return;
    130. }
    131. if(type==3)
    132. {
    133. int k=val;
    134. int f1=r-l+1;
    135. t[rt].xyz=add(t[rt].xyz,mul(t[rt].xy,k));
    136. t[rt].xz=add(t[rt].xz,mul(t[rt].x,k));
    137. t[rt].yz=add(t[rt].yz,mul(t[rt].y,k));
    138. t[rt].z=add(t[rt].z,mul(f1,k));
    139. t[rt].lzc=add(t[rt].lzc,k);
    140. return;
    141. }
    142. return ;
    143. }
    144. pushdown(rt,l,r);
    145. int mid=(l+r)>>1;
    146. if(L<=mid) update(rt<<1,l,mid,L,R,type,val);
    147. if(R>mid)update(rt<<1|1,mid+1,r,L,R,type,val);
    148. pushup(rt);
    149. return;
    150. }
    151. int query(int rt,int l,int r,int L,int R)
    152. {
    153. if(L<=l&&R>=r)
    154. {
    155. return t[rt].xyz;
    156. }
    157. pushdown(rt,l,r);
    158. int mid=(l+r)>>1;
    159. int ans=0;
    160. if(mid >= R) ans=add(ans,query(rt<<1, l, mid, L, R));
    161. else if(mid < L) ans=add(ans,query(rt<<1|1, mid + 1, r, L, R));
    162. else
    163. {
    164. ans=add(ans,add(query(rt<<1, l, mid, L, mid),query(rt<<1|1, mid + 1, r, mid + 1, R)));
    165. }
    166. return ans;
    167. }
    168. signed main()
    169. {
    170. ios::sync_with_stdio(false);
    171. cin.tie(0);
    172. cout.tie(0);
    173. cin>>n>>m;
    174. build(1,1,n);
    175. for(int i=1; i<=m; i++)
    176. {
    177. char c;
    178. cin>>c;
    179. int l,r;
    180. cin>>l>>r;
    181. if(c=='x')
    182. {
    183. int a;
    184. cin>>a;
    185. update(1,1,n,l,r,1,a);
    186. }
    187. else if(c=='y')
    188. {
    189. int a;
    190. cin>>a;
    191. update(1,1,n,l,r,2,a);
    192. }
    193. else if(c=='z')
    194. {
    195. int a;
    196. cin>>a;
    197. update(1,1,n,l,r,3,a);
    198. }
    199. else
    200. {
    201. cout<<query(1,1,n,l,r)<<"\n";
    202. }
    203. }
    204. return 0;
    205. }

  • 相关阅读:
    安化云台山风景区研学趣味多,时间碎片记录精彩瞬间
    夜神模拟器安装frida-server图文详解
    新加坡国立大学『3D计算机视觉』课程;Python爬虫知识库;基于SKLearn时序预测模块;从零构建AI推理引擎;前沿论文 | ShowMeAI资讯日报
    迁移学习--预训练微调
    域名解析常见问题(上)
    HCIA-单臂路由-VLAN-VLAN间通信-OSPF 小型实验
    软考中级(软件设计师)——计算机网络(5分)与信息安全(3分)
    杨表
    【毕业设计】基于深度学习实现语义分割算法系统 - 机器视觉
    oracle在Windows正常使用需要启动哪些服务
  • 原文地址:https://blog.csdn.net/m0_61949623/article/details/127136485