题目描述

老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成。 有长为N的数列,不妨设为a1,a2,…,aN 。有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一段数全部加一个值; (3)询问数列中的一段数的和,由于答案可能很大,你只需输出这个数模P的值。

输入输出格式

输入格式:

第一行两个整数N和P(1≤P≤1000000000)。 第二行含有N个非负整数,从左到右依次为a1,a2,…,aN, (0≤ai≤1000000000,1≤i≤N)。 第三行有一个整数M,表示操作总数。 从第四行开始每行描述一个操作,输入的操作有以下三种形式: 操作1:“1 t g c”(不含双引号)。表示把所有满足t≤i≤g的ai改为ai×c (1≤t≤g≤N,0≤c≤1000000000)。 操作2:“2 t g c”(不含双引号)。表示把所有满足t≤i≤g的ai改为ai+c (1≤t≤g≤N,0≤c≤1000000000)。 操作3:“3 t g”(不含双引号)。询问所有满足t≤i≤g的ai的和模P的值 (1≤t≤g≤N)。 同一行相邻两数之间用一个空格隔开,每行开头和末尾没有多余空格。

输出格式:

对每个操作3,按照它在输入中出现的顺序,依次输出一行一个整数表示询问结果。

输入输出样例

输入样例#1: 复制

  1. 7 43
  2. 1 2 3 4 5 6 7
  3. 5
  4. 1 2 5 5
  5. 3 2 4
  6. 2 3 7 9
  7. 3 1 3
  8. 3 4 7
输出样例#1: 复制

  1. 2
  2. 35
  3. 8

说明

【样例说明】

初始时数列为(1,2,3,4,5,6,7)。

经过第1次操作后,数列为(1,10,15,20,25,6,7)。

对第2次操作,和为10+15+20=45,模43的结果是2。

经过第3次操作后,数列为(1,10,24,29,34,15,16}

对第4次操作,和为1+10+24=35,模43的结果是35。

对第5次操作,和为29+34+15+16=94,模43的结果是8。

测试数据规模如下表所示

数据编号 1 2 3 4 5 6 7 8 9 10

N= 10 1000 1000 10000 60000 70000 80000 90000 100000 100000

M= 10 1000 1000 10000 60000 70000 80000 90000 100000 100000

Source: Ahoi 2009

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. #define MAXN 100001
  6. using namespace std;
  7. struct nond{
  8. long long l,r,sum;
  9. long long flag1,falg2;
  10. }tree[MAXN*];
  11. long long n,m,p;
  12. void up(long long now){
  13. tree[now].sum=(tree[now*].sum+tree[now*+].sum)%p;
  14. }
  15. void build(long long now,long long l,long long r){
  16. tree[now].l=l;tree[now].r=r;
  17. tree[now].flag1=;tree[now].falg2=;
  18. if(tree[now].l==tree[now].r){
  19. scanf("%d",&tree[now].sum);
  20. return ;
  21. }
  22. long long mid=(tree[now].l+tree[now].r)/;
  23. build(now*,l,mid);
  24. build(now*+,mid+,r);
  25. up(now);
  26. }
  27. void down(long long now){
  28. if(tree[now].flag1!=){
  29. tree[now*].flag1=tree[now*].flag1*tree[now].flag1%p;
  30. tree[now*].falg2=tree[now*].falg2*tree[now].flag1%p;
  31. tree[now*].sum=tree[now*].sum*tree[now].flag1%p;
  32. tree[now*+].flag1=tree[now*+].flag1*tree[now].flag1%p;
  33. tree[now*+].falg2=tree[now*+].falg2*tree[now].flag1%p;
  34. tree[now*+].sum=tree[now*+].sum*tree[now].flag1%p;
  35. tree[now].flag1=;
  36. }
  37. if(tree[now].falg2){
  38. tree[now*].falg2=(tree[now*].falg2+tree[now].falg2)%p;
  39. tree[now*+].falg2=(tree[now*+].falg2+tree[now].falg2)%p;
  40. tree[now*].sum=(tree[now*].sum+(tree[now*].r-tree[now*].l+)*tree[now].falg2%p)%p;
  41. tree[now*+].sum=(tree[now*+].sum+(tree[now*+].r-tree[now*+].l+)*tree[now].falg2%p)%p;
  42. tree[now].falg2=;
  43. }
  44. }
  45. void changechen(long long now,long long l,long long r,long long k){
  46. if(tree[now].l==l&&tree[now].r==r){
  47. tree[now].sum=tree[now].sum*k%p;
  48. tree[now].flag1=tree[now].flag1*k%p;
  49. tree[now].falg2=tree[now].falg2*k%p;
  50. return ;
  51. }
  52. if(tree[now].flag1!=||tree[now].falg2) down(now);
  53. long long mid=(tree[now].l+tree[now].r)/;
  54. if(r<=mid) changechen(now*,l,r,k);
  55. else if(l>mid) changechen(now*+,l,r,k);
  56. else{
  57. changechen(now*,l,mid,k);
  58. changechen(now*+,mid+,r,k);
  59. }
  60. up(now);
  61. }
  62. void changeadd(long long now,long long l,long long r,long long k){
  63. if(tree[now].l==l&&tree[now].r==r){
  64. tree[now].sum=(tree[now].sum+(tree[now].r-tree[now].l+)*k%p)%p;
  65. tree[now].falg2=(tree[now].falg2+k)%p;
  66. return ;
  67. }
  68. if(tree[now].flag1!=||tree[now].falg2) down(now);
  69. long long mid=(tree[now].l+tree[now].r)/;
  70. if(r<=mid) changeadd(now*,l,r,k);
  71. else if(l>mid) changeadd(now*+,l,r,k);
  72. else{
  73. changeadd(now*,l,mid,k);
  74. changeadd(now*+,mid+,r,k);
  75. }
  76. up(now);
  77. }
  78. long long query(long long now,long long l,long long r){
  79. if(tree[now].l==l&&tree[now].r==r)
  80. return tree[now].sum%p;
  81. if(tree[now].flag1!=||tree[now].falg2) down(now);
  82. long long mid=(tree[now].l+tree[now].r)/;
  83. if(r<=mid) return query(now*,l,r);
  84. else if(l>mid) return query(now*+,l,r);
  85. else return (query(now*,l,mid)+query(now*+,mid+,r))%p;
  86. }
  87. int main(){
  88. scanf("%lld%lld",&n,&p);
  89. build(,,n);scanf("%lld",&m);
  90. for(long long i=;i<=m;i++){
  91. long long opt,x,y,k;
  92. scanf("%lld%lld%lld",&opt,&x,&y);
  93. if(opt==){
  94. scanf("%lld",&k);
  95. changechen(,x,y,k);
  96. }
  97. else if(opt==){
  98. scanf("%lld",&k);
  99. changeadd(,x,y,k);
  100. }
  101. else if(opt==) printf("%lld\n",query(,x,y)%p);
  102. }
  103. }

洛谷 P2023 [AHOI2009]维护序列的更多相关文章

  1. 洛谷P2023 [AHOI2009]维护序列(线段树区间更新,区间查询)

    洛谷P2023 [AHOI2009]维护序列 区间修改 当我们要修改一个区间时,要保证 \(ax+b\) 的形式,即先乘后加的形式.当将区间乘以一个数 \(k\) 时,原来的区间和为 \(ax+b\) ...

  2. 洛谷 P2023 [AHOI2009]维护序列 题解

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

  3. [洛谷P2023] [AHOI2009]维护序列

    洛谷题目链接:[AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列 ...

  4. 【题解】洛谷P2023 [AHOI2009] 维护序列(线段树)

    洛谷P2023:https://www.luogu.org/problemnew/show/P2023 思路 需要2个Lazy-Tag 一个表示加的 一个表示乘的 需要先计算乘法 再计算加法 来自你谷 ...

  5. 洛谷 P2023 [AHOI2009]维护序列 || 线段树加法和乘法运算

    原理倒是非常简单.设原数为x,加法的lazytag为b,乘法的lazytag为a,操作数为c,那么原式为ax+b,乘上c后(ax+b)c=(ac)*x+b*c,加上c后(ax+b)+c=ax+(b+c ...

  6. 洛谷 2023 [AHOI2009]维护序列

    洛谷 2023 [AHOI2009]维护序列 洛谷原题传送门 这个题也是一道经典的线段树模版(其实洛谷的模版二改一下输入顺序就能AC),其中包括区间乘法修改.区间加法修改.区间查询三个操作. 线段树的 ...

  7. 洛谷P3373 【模板】线段树 2 && P2023 [AHOI2009]维护序列——题解

    题目传送: P3373 [模板]线段树 2  P2023 [AHOI2009]维护序列 该题较传统线段树模板相比多了一个区间乘的操作.一提到线段树的区间维护问题,就自然想到了“懒标记”:为了降低时间复 ...

  8. P2023 [AHOI2009]维护序列 题解(线段树)

    题目链接 P2023 [AHOI2009]维护序列 解题思路 线段树板子.不难,但是...有坑.坑有多深?一页\(WA\). 由于乘法可能乘\(k=0\),我这种做法可能会使结果产生负数.于是就有了这 ...

  9. [P2023][AHOI2009]维护序列(线段树)

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

随机推荐

  1. [Swift通天遁地]六、智能布局-(2)视图对象的尺寸和位置相对约束

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  2. 异常强大的Markdown编辑插件-Markdown Preview Enhanced

    最近使用Markdown写作,了解到以下这些Markdown写作工具 MaHua 在线markdown编辑器 百度搜索Markdown时,它排在非常靠前的位置 马克飞象- 专为印象笔记打造的Markd ...

  3. Kafka详解与总结(五)

    Kafka持久化 1. 概述 Kafka大量依赖文件系统去存储和缓存消息.对于硬盘有个传统的观念是硬盘总是很慢,这使很多人怀疑基于文件系统的架构能否提供优异的性能.实际上硬盘的快慢完全取决于使用它的方 ...

  4. python 画图

    1.根据实际图形,用符号画出原来图形 from PIL import Image import argparse #命令行输入参数处理 parser = argparse.ArgumentParser ...

  5. Win10中的睡眠、休眠

    共同点: 都是节能技术. 异同点: 睡眠: 需要耗电.通过键盘鼠标唤醒.唤醒速度快.将用户正在处理的数据保存到内存中,除内存以外的所有设备都停止供电. 休眠: 不需耗电.通过电源键唤醒.唤醒速度慢.将 ...

  6. python 之 sqlite3

    # -*- coding: utf-8 -*- ''' 创建数据库日志,三列为时间 身份证号和备注名''' import os import sys import sqlite3 import dat ...

  7. JS——缓慢动画封装

    在知道如何获取内嵌式和外链式的标签属性值之后,我们再次封装缓慢动画: 单个属性 <!DOCTYPE html> <html> <head lang="en&qu ...

  8. Json——转义符

    C#后台直接输出Json字符串需要反斜杠“\” context.Response.Write("[{\"Name\": \"wqx\", \" ...

  9. dubbo之延迟暴露

    延迟暴露 如果你的服务需要预热时间,比如初始化缓存,等待相关资源就位等,可以使用 delay 进行延迟暴露. 延迟 5 秒暴露服务 <dubbo:service delay="5000 ...

  10. Caffe2:python -m caffe2.python.operator_test.relu_op_test

    1. 进行语句测试时候,出现问题, 设置环境变量CUDA_VISIBLE_DEVICES 参考: cuda设置指定可见方法 在/etc/profile文件或者-/.bashrc末尾添加以下行: exp ...