bzoj 4540: [Hnoi2016]序列【单调栈+线段树】
强烈安利:http://blog.csdn.net/qq_34637390/article/details/51313126
这篇讲标记讲的非常好,这个标记非常神奇……
首先last表示扫描到last这个点了,val[x]表示x到last中的最小值,sum[x]表示last分别等于1,2,3....last时的和(也就是所有val历史版本的和)
然后答案就是当前last扫到r,l到r之间所有sum的和(稍微画一下就理解了
然后考虑现在要挪动last,新的last的影响范围是他之前第一个比他小的位置(单调栈维护)到新last这一段,考虑对这一段的修改,就是把所有的val修改成a[last],sum加上原来的val
这里用abcd做lazytag,每次修改这样搞一下:(以下为截图
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=100005;
int n,m,a[N],top,s[N];
long long ans[N];
struct wen
{
int l,r,id;
}q[N];
bool cmp(const wen &a,const wen &b)
{
return a.r<b.r;
}
struct lazy
{
long long a,b,c,d;
lazy(long long A=0,long long B=0,long long C=0,long long D=0)
{
a=A,b=B,c=C,d=D;
}
lazy operator + (const lazy &y) const
{
return lazy(a*y.a,y.b+b*y.a,c+y.c*a,d+y.d+b*y.c);
}
};
struct qwe
{
int l,r;
long long val,sum;
lazy lz;
}t[N<<2];
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
void build(int ro,int l,int r)
{
t[ro].l=l,t[ro].r=r,t[ro].lz=lazy(1,0,0,0);
if(l==r)
return;
int mid=(l+r)>>1;
build(ro<<1,l,mid);
build(ro<<1|1,mid+1,r);
}
void add(int ro,lazy p)
{
t[ro].sum+=p.c*t[ro].val+p.d*(t[ro].r-t[ro].l+1);
t[ro].val=p.a*t[ro].val+p.b*(t[ro].r-t[ro].l+1);
t[ro].lz=t[ro].lz+p;
}
void pd(int ro)
{
if(t[ro].lz.a!=1||t[ro].lz.b||t[ro].lz.c||t[ro].lz.d)
{
add(ro<<1,t[ro].lz);
add(ro<<1|1,t[ro].lz);
t[ro].lz=lazy(1,0,0,0);
}
}
void update(int ro,int l,int r,lazy p)
{
if(t[ro].l==l&&t[ro].r==r)
{
add(ro,p);
return;
}
pd(ro);
int mid=(t[ro].l+t[ro].r)>>1;
if(r<=mid)
update(ro<<1,l,r,p);
else if(l>mid)
update(ro<<1|1,l,r,p);
else
{
update(ro<<1,l,mid,p);
update(ro<<1|1,mid+1,r,p);
}
t[ro].sum=t[ro<<1].sum+t[ro<<1|1].sum;
t[ro].val=t[ro<<1].val+t[ro<<1|1].val;
}
long long ques(int ro,int l,int r)
{
if(t[ro].l==l&&t[ro].r==r)
return t[ro].sum;
pd(ro);
int mid=(t[ro].l+t[ro].r)>>1;
if(r<=mid)
return ques(ro<<1,l,r);
else if(l>mid)
return ques(ro<<1|1,l,r);
else
return ques(ro<<1,l,mid)+ques(ro<<1|1,mid+1,r);
}
int main()
{
n=read(),m=read();
for(int i=1;i<=n;i++)
a[i]=read();
for(int i=1;i<=m;i++)
q[i].l=read(),q[i].r=read(),q[i].id=i;
sort(q+1,q+1+m,cmp);
build(1,1,n);
for(int i=1,j=1;i<=n;i++)
{
while(top&&a[s[top]]>=a[i])
top--;
update(1,s[top]+1,i,lazy(0,a[i],0,0));
add(1,lazy(1,0,1,0));
s[++top]=i;
for(;j<=m&&q[j].r==i;j++)
ans[q[j].id]=ques(1,q[j].l,q[j].r);
}
for(int i=1;i<=m;i++)
printf("%lld\n",ans[i]);
return 0;
}
bzoj 4540: [Hnoi2016]序列【单调栈+线段树】的更多相关文章
- 洛谷P4198 楼房重建 单调栈+线段树
正解:单调栈+线段树 解题报告: 传送门! 首先考虑不修改的话就是个单调栈板子题昂,这个就是 然后这题的话,,,我怎么记得之前考试好像有次考到了类似的题目昂,,,?反正我总觉着这方法似曾相识的样子,, ...
- 2018宁夏邀请赛 L Continuous Intervals(单调栈+线段树)
2018宁夏邀请赛 L Continuous Intervals(单调栈+线段树) 传送门:https://nanti.jisuanke.com/t/41296 题意: 给一个数列A 问在数列A中有多 ...
- BZOj 4540: [Hnoi2016]序列 [莫队 st表 预处理]
4540: [Hnoi2016]序列 题意:询问区间所有子串的最小值的和 不强制在线当然上莫队啦 但是没想出来,因为不知道该维护当前区间的什么信息,维护前后缀最小值的话不好做 想到单调栈求一下,但是对 ...
- BZOJ.4540.[HNOI2016]序列(莫队/前缀和/线段树 单调栈 RMQ)
BZOJ 洛谷 ST表的一二维顺序一定要改过来. 改了就rank1了哈哈哈哈.自带小常数没办法. \(Description\) 给定长为\(n\)的序列\(A_i\).\(q\)次询问,每次给定\( ...
- BZOJ 4540 [Hnoi2016]序列 (单调栈 + ST表 + 莫队算法)
题目链接 BZOJ4540 考虑莫队算法. 这题难在$[l, r]$到$[l, r+1]$的转移. 根据莫队算法的原理,这个时候答案应该加上 $cal(l, r+1) + cal(l+1, r+1) ...
- 【bzoj4540】[Hnoi2016]序列 单调栈+离线+扫描线+树状数组区间修改区间查询
题目描述 给出一个序列,多次询问一个区间的所有子区间最小值之和. 输入 输入文件的第一行包含两个整数n和q,分别代表序列长度和询问数.接下来一行,包含n个整数,以空格隔开,第i个整数为ai,即序列第i ...
- BZOJ 4540 [Hnoi2016]序列 | 莫队 详细题解
传送门 BZOJ 4540 题解 --怎么说呢--本来想写线段树+矩阵乘法的-- --但是嘛--yali的机房太热了--困--写不出来-- 于是弃疗,写起了莫队.(但是我连莫队都想不出来!) 首先用单 ...
- The Preliminary Contest for ICPC China Nanchang National Invitational I. Max answer (单调栈+线段树)
题目链接:https://nanti.jisuanke.com/t/38228 题目大意:一个区间的值等于该区间的和乘以区间的最小值.给出一个含有n个数的序列(序列的值有正有负),找到该序列的区间最大 ...
- 网络赛 I题 Max answer 单调栈+线段树
题目链接:https://nanti.jisuanke.com/t/38228 题意:在给出的序列里面找一个区间,使区间最小值乘以区间和得到的值最大,输出这个最大值. 思路:我们枚举每一个数字,假设是 ...
随机推荐
- 谈谈APP架构选型:React Native还是HBuilder
原文链接 导读:最近公司的一款新产品APP要进行研发,老大的意思想用H5来做混合APP以达到高效敏捷开发的目的.我自然就开始进行各种技术选型的调研,这里重点想说的是我最后挑选出的2款hybrid ap ...
- The Bottom of a Graph
poj——The Bottom of a Graph Time Limit: 3000MS Memory Limit: 65536K ...
- [Bzoj4817] [Sdoi2017]树点涂色 (LCT神题)
4817: [Sdoi2017]树点涂色 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 629 Solved: 371[Submit][Status ...
- 学习日常笔记<day14>自定义标签
1自定义标签 1.1第一个自定义标签开发步骤 1)编写一个普通的java类,继承SimpleTagSupport类,叫标签处理器类 /** * 标签处理器类 * @author APPle * 1)继 ...
- Java中的重写
以下内容引用自http://wiki.jikexueyuan.com/project/java/overriding.html: 如果一个类从它的父类继承了一个方法,如果这个方法没有被标记为final ...
- IT桔子 - 千里马俱乐部
IT桔子 - 千里马俱乐部 浙江
- intelliJ IDEA工具快捷键
F9 resume programe 恢复程序 Alt+F10 show execution point 显示执行断点 F8 Step Ove ...
- 第三方APP集成微信登陆功能详解
授权后接口调用(UnionID) 通过code获取access_token 接口说明 通过code获取access_token的接口. 请求说明 http请求方式: GET https://api.w ...
- [scrapy]实例:爬取jobbole页面
工程概览: 创建工程 scrapy startproject ArticleSpider 创建spider cd /ArticleSpider/spiders/ 新建jobbole.py # -*- ...
- 为RAC私有网络配置网卡Bonding
在RAC的安装部署过程中.并不不过简单的安装完毕了事.整个安装过程要考虑可能出现的单点问题,当中比較重要的是私有网络. 私有网络是RAC节点间通信的通道.包含节点间的网络心跳信息.Cache fusi ...