洛谷 P2023 维护序列 题解
注意一个细节,查询和更新都需要pushdown();
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,m,p;
int a[];
struct ha{
long long v;
long long mul;
long long add;
}tree[];
void build(int k,int l,int r)
{
tree[k].mul=;
tree[k].add=;
if(l==r){
tree[k].v=a[l];
}
else{
int mid=(l+r)/;
build(k<<,l,mid);
build(k<<|,mid+,r);
tree[k].v=tree[k<<].v+tree[k<<|].v;
}
tree[k].v%=p;
return;
}
void pushdown(int k,int l,int r)
{
int mid=(l+r)/;
tree[k<<].v=(tree[k<<].v*tree[k].mul+tree[k].add*(mid-l+))%p;
tree[k<<|].v=(tree[k<<|].v*tree[k].mul+tree[k].add*(r-mid))%p;
tree[k<<].mul=(tree[k<<].mul*tree[k].mul)%p;
tree[k<<|].mul=(tree[k<<|].mul*tree[k].mul)%p;
tree[k<<].add=(tree[k<<].add*tree[k].mul+tree[k].add)%p;
tree[k<<|].add=(tree[k<<|].add*tree[k].mul+tree[k].add)%p;
tree[k].mul=;
tree[k].add=;
return;
}
void muladd(int k,int l,int r,int x,int y,int goal)
{
if(y<l||x>r){
return;
}
if(x<=l&&r<=y){
tree[k].v=(tree[k].v*goal)%p;
tree[k].mul=(tree[k].mul*goal)%p;
tree[k].add=(tree[k].add*goal)%p;
return;
}
pushdown(k,l,r);
int mid=(l+r)/;
muladd(k<<,l,mid,x,y,goal);
muladd(k<<|,mid+,r,x,y,goal);
tree[k].v=(tree[k<<].v+tree[k<<|].v)%p;
return;
}
void addadd(int k,int l,int r,int x,int y,int goal)
{
if(x>r||y<l){
return;
}
if(x<=l&&y>=r){
tree[k].add=(tree[k].add+goal)%p;
tree[k].v=(tree[k].v+goal*(r-l+))%p;
return;
}
pushdown(k,l,r);
int mid=(l+r)/;
addadd(k<<,l,mid,x,y,goal);
addadd(k<<|,mid+,r,x,y,goal);
tree[k].v=(tree[k<<].v+tree[k<<|].v)%p;
return;
}
int ask(int k,int l,int r,int x,int y)
{
if(x>r||y<l){
return ;
}
if(x<=l&&y>=r){
return tree[k].v;
}
pushdown(k,l,r);
int mid=(l+r)/;
return (ask(k<<,l,mid,x,y)+ask(k<<|,mid+,r,x,y))%p;
}
signed main()
{
cin>>n>>p;
for(int i=;i<=n;i++){
cin>>a[i];
}
build(,,n);
cin>>m;
for(int i=;i<=m;i++){
int type;
cin>>type;
if(type==){
int x,y,v;
cin>>x>>y>>v;
muladd(,,n,x,y,v);
}
else if(type==){
int x,y,v;
cin>>x>>y>>v;
addadd(,,n,x,y,v);
}
else{
int x,y;
cin>>x>>y;
cout<<ask(,,n,x,y)<<endl;
}
}
}
洛谷 P2023 维护序列 题解的更多相关文章
- BZOJ 1500 洛谷2042维护序列题解
BZ链接 洛谷链接 这道题真是丧心病狂.... 应该很容易就可以看出做法,但是写代码写的....... 思路很简单,用一个平衡树维护一下所有的操作就好了,重点讲解一下代码的细节 首先如果按照常规写法的 ...
- 洛谷 P2023 维护序列——线段树
先上一波题目 https://www.luogu.org/problem/P2023 复习了一波线段树 题目涉及的操作有区间加 区间乘以及区间求和 tips:线段树在传标记的时候 优先传乘法标记再传加 ...
- 【题解】洛谷P2023 [AHOI2009] 维护序列(线段树)
洛谷P2023:https://www.luogu.org/problemnew/show/P2023 思路 需要2个Lazy-Tag 一个表示加的 一个表示乘的 需要先计算乘法 再计算加法 来自你谷 ...
- 洛谷P2023 [AHOI2009]维护序列(线段树区间更新,区间查询)
洛谷P2023 [AHOI2009]维护序列 区间修改 当我们要修改一个区间时,要保证 \(ax+b\) 的形式,即先乘后加的形式.当将区间乘以一个数 \(k\) 时,原来的区间和为 \(ax+b\) ...
- 洛谷 P1628 合并序列
洛谷 P1628 合并序列 题目传送门 题目描述 有N个单词和字符串T,按字典序输出以字符串T为前缀的所有单词. 输入格式 输入文件第一行包含一个正整数N: 接下来N行,每行一个单词,长度不超过100 ...
- 【洛谷P3960】列队题解
[洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m ...
- 洛谷 P1220 关路灯 题解
Description 有 $n$ 盏路灯,每盏路灯有坐标(单位 $m$)和功率(单位 $J$).从第 $c$ 盏路灯开始,可以向左或向右关闭路灯.速度是 $1m/s$.求所有路灯的最少耗电.输入保证 ...
- 洛谷P2832 行路难 分析+题解代码【玄学最短路】
洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座 ...
- 洛谷P2312 解方程题解
洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...
随机推荐
- POJ 3723 征兵问题(最小生成树算法的应用)
Conscription Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 15923 Accepted: 5510 Des ...
- HGOI 20190708 题解
Problem A 拿出勇气吧 幸运数字每一位是$4$或者$7$,现在给出一个数字每位数位上数的和为n,求出最小的幸运数n 对于100%的数据,$n\leq 10^6$ Sol : 显然本题要求数的长 ...
- CodeForces 1245D Shichikuji and Power Grid
cf题面 解题思路 比赛过程中想了一个贪心--把所有城市按照自建代价排序,排在第一的城市肯定自建,之后依次判断排在后面的城市要自建还是要连接前面的.这么做WA13了(第一次忘开long longWA4 ...
- Hexo + github pages + 阿里云绑定域名搭建个人博客
申请域名 万网购买的域名,地址:https://wanwang.aliyun.com/domain/com?spm=5176.8142029.388261.137.LoKzy7 控制台进行解析 控制台 ...
- [python 笔记] __iter__迭代器
可迭代对象和迭代器 https://blog.csdn.net/nightcharm/article/details/78964676 可迭代对象 对象里面含有__iter__()方法的实现,对象的_ ...
- Unity3D_(游戏)贪吃蛇
Unity制作贪吃蛇小游戏 玩家通过“WASD”控制小蛇上下左右移动,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,接着又出现食物,等待蛇来吃,如果蛇在移动中撞到墙或身体交叉蛇头撞倒自己身体游戏结束 可通 ...
- java 从txt文本中随机获取名字
代码: /* 获取随机文件文字 */ public static String random(String path) {//路径 String name = null; try { //把文本文件中 ...
- 剑指offer:把一个支付算转化为整数
1:首先,根据课本上的程序,是这样的: #include "stdafx.h" #include "iostream" using namespace std; ...
- 石川es6课程---1-2、ES6简介
石川es6课程---1-2.ES6简介 一.总结 一句话总结: 从ECMAScript的历史发展来看,太顺了的时候总会遇到一挫折,比如ecma4 1.ECMAScript 和 JavaScript关系 ...
- 怎样用 Bash 编程:语法和工具
让我们通过本系列文章来学习基本的 Bash 编程语法和工具,以及如何使用变量和控制运算符,这是三篇中的第一篇. Shell 是操作系统的命令解释器,其中 Bash 是我最喜欢的.每当用户或者系统管理员 ...