洛谷 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),因此加法时只需要更新加法的lazytag,乘法的时候就需要同时乘乘法和加法的lazytag。(乘法时的操作曾经搞错)
有些细节却很难受啊...比如很容易忘记加取模(一般都是程序打完了之后再补上,但是这个程序要补的地方太多,容易漏,要小心),把乘法的lazytag初始化为1出错,很容易少几句话...
//以下代码中:加important标记的是曾经缺少的,注释掉的是曾经多的
#include<cstdio>
#include<cstring>
#define lc (num<<1)
#define rc (num<<1|1)
#define mid ((l+r)>>1)
typedef long long LL;
LL a[];
LL tree[],laz[],laz2[];
LL L,R,x,n,m,md;
void build(LL l,LL r,LL num)
{
laz2[num]=;//important
if(l==r)
{
tree[num]=a[l]%md;
return;
}
build(l,mid,lc);
build(mid+,r,rc);
tree[num]=(tree[lc]+tree[rc])%md;
}
void pushdown(LL l,LL r,LL num)
{
if(laz2[num]!=)
{
laz2[lc]=(laz2[lc]*laz2[num])%md;
laz2[rc]=(laz2[rc]*laz2[num])%md;
/*important*/
laz[lc]=(laz[lc]*laz2[num])%md;
laz[rc]=(laz[rc]*laz2[num])%md;
tree[lc]=(tree[lc]*laz2[num])%md;
tree[rc]=(tree[rc]*laz2[num])%md;
/*-important*/
/*
tree[lc]=(tree[lc]+(mid-l+1)*laz2[num])%md;
tree[rc]=(tree[rc]+(r-mid)*laz2[num])%md;
*/
laz2[num]=;
}
if(laz[num])
{
laz[lc]=(laz[lc]+laz[num])%md;
laz[rc]=(laz[rc]+laz[num])%md;
tree[lc]=(tree[lc]+(mid-l+)*laz[num]%md)%md;
tree[rc]=(tree[rc]+(r-mid)*laz[num]%md)%md;
laz[num]=;
}
}
void update(LL l,LL r,LL num)
{
if(L<=l&&r<=R)
{
tree[num]=(tree[num]+(r-l+)*x)%md;
laz[num]=(laz[num]+x)%md;
return;
}
pushdown(l,r,num);
if(L<=mid) update(l,mid,lc);
if(mid<R) update(mid+,r,rc);//if(mid+1<=R)//等价
/*important*/tree[num]=(tree[lc]+tree[rc])%md;
}
void update2(LL l,LL r,LL num)
{
if(L<=l&&r<=R)
{
tree[num]=(tree[num]*x)%md;
/*importaant*/laz[num]=(laz[num]*x)%md;/*important*/
laz2[num]=(laz2[num]*x)%md;
return;
}
pushdown(l,r,num);
if(L<=mid) update2(l,mid,lc);
if(mid<R) update2(mid+,r,rc);//if(mid+1<=R)//等价
/*important*/tree[num]=(tree[lc]+tree[rc])%md;
}
LL query(LL l,LL r,LL num)
{
if(L<=l&&r<=R) return tree[num];
pushdown(l,r,num);
LL ans=;
if(L<=mid) ans=(ans+query(l,mid,lc))%md;
if(mid<R) ans=(ans+query(mid+,r,rc))%md;
return ans;
}
int main()
{
LL i,t;
scanf("%lld%lld%lld",&n,&m,&md);
for(i=;i<=n;i++)
scanf("%lld",&a[i]);//不应该将laz2[]=1写在此处important
build(,n,);
for(i=;i<=m;i++)
{
scanf("%lld",&t);
if(t==)
{
scanf("%lld%lld%lld",&L,&R,&x);
update(,n,);
}
else if(t==)
{
scanf("%lld%lld",&L,&R);
printf("%lld\n",query(,n,)%md);
}
else
{
scanf("%lld%lld%lld",&L,&R,&x);
update2(,n,);
}
}
return ;
}
洛谷 P2023 [AHOI2009]维护序列 || 线段树加法和乘法运算的更多相关文章
- 洛谷P2023 [AHOI2009]维护序列(线段树区间更新,区间查询)
洛谷P2023 [AHOI2009]维护序列 区间修改 当我们要修改一个区间时,要保证 \(ax+b\) 的形式,即先乘后加的形式.当将区间乘以一个数 \(k\) 时,原来的区间和为 \(ax+b\) ...
- 洛谷 P2023 [AHOI2009]维护序列 题解
P2023 [AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列中 ...
- 洛谷 P2023 [AHOI2009]维护序列
P2023 [AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中 ...
- 【题解】洛谷P2023 [AHOI2009] 维护序列(线段树)
洛谷P2023:https://www.luogu.org/problemnew/show/P2023 思路 需要2个Lazy-Tag 一个表示加的 一个表示乘的 需要先计算乘法 再计算加法 来自你谷 ...
- [洛谷P2023] [AHOI2009]维护序列
洛谷题目链接:[AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列 ...
- [P2023][AHOI2009]维护序列(线段树)
题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一 ...
- 洛谷 2023 [AHOI2009]维护序列
洛谷 2023 [AHOI2009]维护序列 洛谷原题传送门 这个题也是一道经典的线段树模版(其实洛谷的模版二改一下输入顺序就能AC),其中包括区间乘法修改.区间加法修改.区间查询三个操作. 线段树的 ...
- BZOJ1798[Ahoi2009]维护序列——线段树
题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2 ...
- [AHOI2009]维护序列 (线段树)
题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一 ...
随机推荐
- Mac开发必备工具(二)—— iTerm 2
iTerm 2 简介 iTerm 2 is a terminal emulator for Mac OS X that does amazing things. iTerm 2 有很多能够提升效率的实 ...
- MYSQL进阶学习笔记四:MySQL存储过程之定义条件,处理过程及存储过程的管理!(视频序号:进阶_11,12)
知识点五:MySQL存储过程之定义条件和处理过程及存储过程的管理(11,12) 定义条件和处理: 条件的定义和处理可以用来定义在处理过程中遇到的问题时相应的处理步骤. DECLARE CONTINUE ...
- android 一个TextView设置多种颜色
时候一个文本框为了强调内容需要显示不同颜色,用以下代码可以轻松实现 方法一:(适用于颜色变化多的情况) //为文本框设置多种颜色 textView=(TextView)findViewById(R ...
- hdu acm 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2191 题目意思:有 资金 n 和 m 种类型的大米,对第 i 种类型的大米,价格.数量.袋数分别是: ...
- codeforces 437A. The Child and Homework 解题报告
题目链接:http://codeforces.com/problemset/problem/437/A 题目意思:给出四个选项A.B.C.D选项的内容描述,要求选出符合以下条件的一项. (1)如果某个 ...
- Android自定义控件实现带有清除按钮的EditText
首先声明我也是参考了别人的思路,只是稍微做了下修改,增加显示密码与隐藏密码,没有输入字符串时让EditText进行抖动,废话少说这里附上效果图 效果很赞有木有 那么怎么实现这种效果呢?那就跟着我一起来 ...
- hash与map的区别联系应用(转)
一,hashtable原理: 哈希表又名散列表,其主要目的是用于解决数据的快速定位问题.考虑如下一个场景. 一列键值对数据,存储在一个table中,如何通过数据的关键字快速查找相应值呢?不要告诉我一个 ...
- AtCoder Beginner Contest 057
A题 分析:24进制转换 #include<iostream> using namespace std; int main() { int a,b; while(cin>>a& ...
- bzoj1017 [JSOI2008]魔兽地图DotR——DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1017 好难想的状态啊!f[i][j][k]表示i号物品有j个向上贡献,一共花了k钱的最大力量 ...
- WebDev.WebServer40.EXE命令使用
"C:\Program Files (x86)\Common Files\microsoft shared\DevServer\10.0\WebDev.WebServer40.EXE&quo ...