P3373 【模板】线段树 2
线段树的模板,但是还应注意维护乘标记,乘法的优先级大于加法,一定记得还要取模。
#include<bits/stdc++.h>
using namespace std;
const int maxn=;
struct sege_tree
{
int l;
int r;
long long lazymul;
long long lazyadd;
long long v;
}tree[*maxn];
int a[maxn];
long long p,ans;
int n,m,opt,l,r;
long long t;
void build(int now,int l,int r)
{
tree[now].l=l;
tree[now].r=r;
tree[now].lazymul=;
tree[now].lazyadd=;
if(l==r)
{
tree[now].v=a[l];
return;
}
else
{
int mid=(l+r)>>;
build(now*,l,mid);
build(now*+,mid+,r);
tree[now].v=tree[now*].v+tree[now*+].v;
}
tree[now].v%=p;
return;
}
void pushdown(int now,int l,int r)//标记下传
{
int mid=(l+r)>>;
tree[now*].v=(tree[now*].v*tree[now].lazymul+tree[now].lazyadd*(mid-l+))%p;
tree[now*+].v=(tree[now*+].v*tree[now].lazymul+tree[now].lazyadd*(r-mid))%p;
tree[now*].lazymul=(tree[now*].lazymul*tree[now].lazymul)%p;
tree[now*+].lazymul=(tree[now*+].lazymul*tree[now].lazymul)%p;
tree[now*].lazyadd=(tree[now*].lazyadd*tree[now].lazymul+tree[now].lazyadd)%p;
tree[now*+].lazyadd=(tree[now*+].lazyadd*tree[now].lazymul+tree[now].lazyadd)%p;
tree[now].lazymul=;
tree[now].lazyadd=;
return;
}
void update1(int now,int stdl,int stdr,int l,int r,long long k)
{
if(l>stdr||r<stdl)
{
return;
}
if(l<=stdl&&r>=stdr)
{
tree[now].v=(tree[now].v*k)%p;
tree[now].lazymul=(tree[now].lazymul*k)%p;
tree[now].lazyadd=(tree[now].lazyadd*k)%p;
return;
}
pushdown(now,stdl,stdr);
int mid=(stdl+stdr)>>;
update1(now*,stdl,mid,l,r,k);
update1(now*+,mid+,stdr,l,r,k);
tree[now].v=(tree[now*].v+tree[now*+].v)%p;
return;
}
void update2(int now,int stdl,int stdr,int l,int r,long long k)
{
if(l>stdr||r<stdl)
{
return;
}
if(l<=stdl&&r>=stdr)
{
tree[now].lazyadd=(tree[now].lazyadd+k)%p;
tree[now].v=(tree[now].v+k*(stdr-stdl+))%p;
return;
}
pushdown(now,stdl,stdr);
int mid=(stdl+stdr)>>;
update2(now*,stdl,mid,l,r,k);
update2(now*+,mid+,stdr,l,r,k);
tree[now].v=(tree[now*].v+tree[now*+].v)%p;
}
long long query(int now,int stdl,int stdr,int l,int r)
{
if(stdl>r||stdr<l)
{
return ;
}
if(stdl>=l&&stdr<=r)
{
return tree[now].v;
}
pushdown(now,stdl,stdr);
int mid=(stdl+stdr)>>;
return (query(now*,stdl,mid,l,r)+query(now*+,mid+,stdr,l,r))%p;
}
int main()
{
cin>>n>>m>>p;
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
}
build(,,n);
while(m--)
{
scanf("%d",&opt);
if(opt==)
{
cin>>l>>r>>t;
update1(,,n,l,r,t);
}
else if(opt==)
{
cin>>l>>r>>t;
update2(,,n,l,r,t);
}
else
{
cin>>l>>r;
cout<<query(,,n,l,r)<<endl;
}
}
return ;
}
真的还需要耐心啊!
P3373 【模板】线段树 2的更多相关文章
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
- hdu 1754 I Hate It (模板线段树)
http://acm.hdu.edu.cn/showproblem.php?pid=1754 I Hate It Time Limit: 9000/3000 MS (Java/Others) M ...
- hdu3966 树链剖分点权模板+线段树区间更新/树状数组区间更新单点查询
点权树的模板题,另外发现树状数组也是可以区间更新的.. 注意在对链进行操作时方向不要搞错 线段树版本 #include<bits/stdc++.h> using namespace std ...
- 【线段树】【P3372】模板-线段树
百度百科 Definition&Solution 线段树是一种log级别的树形结构,可以处理区间修改以及区间查询问题.期望情况下,复杂度为O(nlogn). 核心思想见百度百科,线段树即将每个 ...
- 算法模板——线段树6(二维线段树:区域加法+区域求和)(求助phile)
实现功能——对于一个N×M的方格,1:输入一个区域,将此区域全部值作加法:2:输入一个区域,求此区域全部值的和 其实和一维线段树同理,只是不知道为什么速度比想象的慢那么多,求解释...@acphile ...
- 【洛谷 p3373】模板-线段树 2(数据结构--线段树)
题意:已知一个数列,你需要进行下面三种操作:1.将某区间每一个数加上x:2.将某区间每一个数乘上x:3.求出某区间每一个数的和. 解法:(唉 :-(,这题卡住我了......)对于加法和乘法的混合操作 ...
- 【洛谷 p3372】模板-线段树 1(数据结构--线段树)
题目:已知一个数列,你需要进行下面两种操作:1.将某区间每一个数加上x:2.求出某区间每一个数的和. 解法:如题,模版题.需要加上 lazy 标记,也就是我的 upd.lazy 标记的思路就是对一个结 ...
- hdu 1754 I Hate It (线段树、单点更新)(PS:ios::sync_with_stdio(false)可以加快cin、cout的读取写出速度)
I Hate ItTime Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- poj 3468 A Simple Problem with Integers 线段树 题解《挑战程序设计竞赛》
地址 http://poj.org/problem?id=3468 线段树模板 要背下此模板 线段树 #include <iostream> #include <vector> ...
- 线段树 扫描线 L - Atlantis HDU - 1542 M - City Horizon POJ - 3277 N - Paint the Wall HDU - 1543
学习博客推荐——线段树+扫描线(有关扫描线的理解) 我觉得要注意的几点 1 我的模板线段树的叶子节点存的都是 x[L]~x[L+1] 2 如果没有必要这个lazy 标志是可以不下传的 也就省了一个pu ...
随机推荐
- python使用魔法函数创建可切片类型
#!/usr/bin/env python # -*- coding: utf-8 -*- """ 可切片的对象 """ import nu ...
- Bootstrap 前端框架 遇到的问题 解决方案
bootstrap实现导航栏的响应式布局,当在小屏幕.手机屏幕浏览时自动折叠隐藏 直接放代码,更容易理解.下次可以套这个代码 <!DOCTYPE html> <html> &l ...
- vue-cli3安装过程
作为一个本来是java开发的搬运工,在公司前端人员缺乏的时候,就直接顶上来开发前台页面了(话说我已经很久很久没写java代码了(:′⌒`)) 好吧言归正传,刚开始弄前台就是vue,vue2还没弄熟,老 ...
- 1.2环境安装「深入浅出ASP.NET Core系列」
官网 在介绍安装环境之前,先介绍周边信息,比如微软net官网. https://www.microsoft.com/net 这个网站是学习微软技术栈比较权威的地方,包括环境下载,学习,架构,文档,社区 ...
- Cayley图数据库的简介及使用
图数据库 在如今数据库群雄逐鹿的时代中,非关系型数据库(NoSQL)已经占据了半壁江山,而图数据库(Graph Database)更是攻城略地,成为其中的佼佼者. 所谓图数据库,它应用图理论( ...
- 大数据时代的图表可视化利器——highcharts,D3和百度的echarts
大数据时代的图表可视化利器——highcharts,D3和百度的echarts https://blog.csdn.net/minidrupal/article/details/42153941 ...
- Spring Cloud 微服务开发系列整理
Spring Boot 系列精选 Spring Boot 自定义 starter Spring Boot 整合 mybatis-plus Spring Boot 整合 spring cache Spr ...
- Pipenv项目化你的python应用
目录 Pipenv 什么是pipenv 安装pipenv pipenv用法 使用pipenv开发项目 pipenv 结合 pyenv Pipenv 什么是pipenv Pipenv is a prod ...
- 【设计模式】桥接模式 Bridge Pattern
开篇还是引用吕振宇老师的那篇经典的文章<设计模式随笔-蜡笔与毛笔的故事>.这个真是太经典了,没有比这个例子能更好的阐明桥接模式了,这里我就直接盗来用了. 现在市面上卖的蜡笔很多,各种型号, ...
- oppo6.0系统设备(亲测有效)激活xposed框架的流程
对于喜欢研究手机的伙伴来说,常常会用到xposed框架以及种类繁多功能强大的模块,对于5.0以下的系统版本,只要手机能获得Root权限,安装和激活xposed框架是异常简易的,但随着系统版本的不断升级 ...