洛谷P2023 [AHOI2009]维护序列
数据比线段树2要毒瘤,一直60分的原因是:
1.long long 没开
2.没有边做边%或者像我P3373一样写了个看着像的边做边%
3.要看注释的话可以跳到P3373
上代码
1 #include<iostream> 2 #include<cmath> 3 #include<cstdio> 4 #include<cstring> 5 #include<queue> 6 #define lson i*2,l,mid 7 #define rson i*2+1,mid+1,r 8 using namespace std; 9 10 struct tree{ 11 long long mul; 12 long long add; 13 long long sum; 14 long long l,r; 15 }t[400860]; 16 17 long long n,m,a[100860],p; 18 19 void build_tree(long long i,long long l,long long r) 20 { 21 t[i].l=l; 22 t[i].r=r; 23 t[i].mul=1; 24 t[i].sum=0; 25 t[i].add=0; 26 if(l==r) 27 { 28 t[i].sum=a[l]%p; 29 return ; 30 } 31 long long mid=(l+r)/2; 32 build_tree(lson); 33 build_tree(rson); 34 t[i].sum=(t[i*2].sum+t[i*2+1].sum)%p; 35 } 36 37 void pushdown2(long long i) 38 { 39 t[i*2].mul=t[i].mul%p*t[i*2].mul%p; 40 t[i*2+1].mul=t[i].mul%p*t[i*2+1].mul%p; 41 t[i*2].add=(t[i*2].add%p*t[i].mul%p+t[i].add)%p; 42 t[i*2+1].add=(t[i*2+1].add%p*t[i].mul%p+t[i].add)%p; 43 t[i*2].sum=(t[i].mul%p*t[i*2].sum%p+t[i].add%p*(t[i*2].r-t[i*2].l+1))%p; 44 t[i*2+1].sum=(t[i].mul%p*t[i*2+1].sum+t[i].add%p*(t[i*2+1].r-t[i*2+1].l+1))%p; 45 t[i].add=0; 46 t[i].mul=1; 47 } 48 void pushdown(long long i) 49 { 50 t[i*2].mul=t[i].mul%p*t[i*2].mul%p; 51 t[i*2+1].mul=t[i*2+1].mul%p*t[i].mul%p; 52 t[i*2].add=(t[i*2].add%p*t[i].mul%p+t[i].add)%p; 53 t[i*2+1].add=(t[i*2+1].add%p*t[i].mul%p+t[i].add)%p; 54 t[i*2].sum=(t[i].mul%p*t[i*2].sum%p+t[i].add%p*(t[i*2].r-t[i*2].l+1))%p; 55 t[i*2+1].sum=(t[i].mul%p*t[i*2+1].sum%p+t[i].add%p*(t[i*2+1].r-t[i*2+1].l+1))%p; 56 t[i].add=0; 57 t[i].mul=1; 58 } 59 void mul_tree(long long i,long long l,long long r,long long x,long long y,long long a) 60 { 61 if(l>=x&&r<=y) 62 { 63 t[i].sum*=a%p; 64 t[i].sum%=p; 65 t[i].mul*=a%p; 66 t[i].mul%=p; 67 t[i].add*=a%p; 68 t[i].mul%=p; 69 return ; 70 } 71 pushdown(i); 72 long long mid=(l+r)/2; 73 if(x<=mid) mul_tree(lson,x,y,a); 74 if(y>mid) mul_tree(rson,x,y,a); 75 t[i].sum=(t[i*2].sum+t[i*2+1].sum)%p; 76 } 77 void add_tree(long long i,long long l,long long r,long long x,long long y,long long a) 78 { 79 if(l>=x&&r<=y) 80 { 81 //t[i].mul*=a%p; 82 t[i].add+=a%p; 83 t[i].add%=p; 84 t[i].sum+=(t[i].r-t[i].l+1)*a%p; 85 t[i].sum%=p; 86 return ; 87 } 88 pushdown(i); 89 long long mid=(l+r)/2; 90 if(x<=mid) add_tree(lson,x,y,a); 91 if(y>mid) add_tree(rson,x,y,a); 92 t[i].sum=(t[i*2].sum+t[i*2+1].sum)%p; 93 } 94 95 long long query_tree(long long i,long long l,long long r,long long a,long long b) 96 { 97 if(l>=a&&r<=b) 98 { 99 return t[i].sum%p; 100 } 101 long long mid=(l+r)/2; 102 long long ans=0; 103 pushdown(i); 104 if(a<=mid) ans+=query_tree(lson,a,b)%p; 105 if(b>mid) ans+=query_tree(rson,a,b)%p; 106 return ans%p; 107 108 } 109 int main() 110 { 111 scanf("%lld %lld ",&n,&p); 112 long long i,j; 113 for(i=1;i<=n;i++) 114 scanf("%lld ",&a[i]); 115 scanf("%lld ",&m); 116 build_tree(1,1,n); 117 for(i=1;i<=m;i++) 118 { 119 long long k; 120 long long t1,t2,t3; 121 scanf("%lld ",&k); 122 if(k==1) 123 { 124 scanf("%lld %lld %lld ",&t1,&t2,&t3); 125 mul_tree(1,1,n,t1,t2,t3); 126 //printf("%lld \n",query_tree(1,1,n,t1,t2)%p); 127 } 128 if(k==2) 129 { 130 scanf("%lld %lld %lld ",&t1,&t2,&t3); 131 add_tree(1,1,n,t1,t2,t3); 132 //printf("%lld \n",query_tree(1,1,n,t1,t2)%p); 133 } 134 if(k==3) 135 { 136 scanf("%lld %lld ",&t1,&t2); 137 printf("%lld \n",query_tree(1,1,n,t1,t2)%p); 138 } 139 } 140 return 0; 141 }
转载于:https://www.cnblogs.com/zsx6/p/10347083.html
洛谷P2023 [AHOI2009]维护序列相关推荐
- 【洛谷P2023】维护序列
这个板子不打就是手生--一段时间不会处理线段树了qwq,这个题难点就是在于下放标记 #include<iostream> #include<cstring> #include& ...
- P2023 [AHOI2009]维护序列
线段树模板题 此题关键在于 pushdown 考虑加法标记 lt1 和 乘法标记 lt2 考虑到乘法优先级 要 高于 加法优先级 因此在 pushdown 里先 传 lt2 再传 lt1 注意 lt2 ...
- BZOJ4553/洛谷P4093 [HEOI2016/TJOI2016]序列 动态规划 分治
原文链接http://www.cnblogs.com/zhouzhendong/p/8672434.html 题目传送门 - BZOJ4553 题目传送门 - 洛谷P4093 题解 设$Li$表示第$ ...
- [AHOI2009]维护序列
题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一 ...
- ahoi2009维护序列
链接:https://www.luogu.org/problemnew/show/P2023 裸的线段树维护+* 代码: #include <bits/stdc++.h> using na ...
- 【洛谷3648】[APIO2014] 序列分割(斜率优化DP)
点此看题面 大致题意: 你可以对一个序列进行\(k\)次分割,每次得分为两个块元素和的乘积,求总得分的最大值. 区间\(DPor\)斜率优化\(DP\) 这题目第一眼看上去感觉很明显是区间\(DP\) ...
- YBTOJ洛谷P4331:数字序列(左偏树)
文章目录 题目描述 数据范围 解析 代码 题目描述 数据范围 n<=1e6n<=1e6n<=1e6 解析 先考虑简单情况 如果原数列是单调递增的,显然应该使bi=aib_i=a_ib ...
- 洛谷 P2051 [AHOI2009]中国象棋 状态压缩思想DP
P2051 [AHOI2009]中国象棋 题意: 给定一个n*m的空棋盘,问合法放置任意多个炮有多少种情况.合法放置的意思是棋子炮不会相互打到. 思路: 这道题我们可以发现因为炮是隔一个棋子可以打出去 ...
- 洛谷2051 [AHOI2009]中国象棋
题目链接 题意概述:n行m列棋盘放若干个棋子每行每列最多两个求方案总数,答案对9999973取模. 可以比较容易看出这是个dp,设f[i][j][k]表示前i行j列放1个棋子k列放2个棋子的方案总数. ...
最新文章
- portlet java_探秘企业门户开发:Java Portlet入门(2)
- 16 级高代 II 思考题十的多种证明
- [bzoj 3534][Sdoi2014] 重建
- python元胞转list_[Python练习向] 简易元胞自动机框架
- 程序员新人怎样在复杂代码中找 bug?
- x86服务器当虚拟化的存储,龙存科技-软件定义数据中心产品提供商
- linux版本i686,在Ubuntu中'i686'是什么意思? - Ubuntu问答
- UML统一建模语言习题一
- android 界面置顶,Android实现界面滚动时顶部部分内容置顶(附源码)
- hssfrow 单元格样式_poi导出excel单元格中画斜线_AnyReport报表
- c语言赋值运算符大全,C语言基础学习运算符-赋值运算符(示例代码)
- java 苹果vcf解析_iOS开发- 生成/解析.vcf文件
- [Python]提取docx/网页超链接
- Atmel和SIGFOX在远程物联网连接领域开展合作
- 微信聊天自动解析html文本,微信小程序纯文本实现@功能
- 使用Factory IO连接TIA Portal 自动化仿真
- 电子书沦为“压泡面”神器,其实高端电子书就该从这两个里边选
- img 图片加载设置超时
- 基于STM32单片机的跑步机心率检测proteus仿真原理图PCB
- (ROS)Moveit编程示例
热门文章
- java中获取链表的第一个节点,两个链表中的第一个公共节点(java)
- css flex布局 padding,css三栏布局的三种实现方式(圣杯布局、双飞翼布局、Flex布局)...
- IIS出现server application error解决方案
- exception e 是泛类吗_Spring异步编程 | 你的@Async就真的异步吗?异步历险奇遇记
- 中南大学 10科学计算和 MATLAB 语言 矩阵变换
- 安装 卸载 mysql linux,Linux 下MySQL 安装与卸载
- python语言程序设计实践教程实验八答案_Python程序设计实验报告: 实验八 文件...
- C语言:编写一个函数,计算二维数组中的最大元素,数组以指针的方式传递
- 彩电主板更换后图像是矩型怎么处理_液晶彩电主板常见故障维修
- clickhouse 数据存储