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 题意:在给出的序列里面找一个区间,使区间最小值乘以区间和得到的值最大,输出这个最大值. 思路:我们枚举每一个数字,假设是 ...
随机推荐
- Codeforces 658C Bear and Forgotten Tree 3【构造】
题目链接: http://codeforces.com/contest/658/problem/C 题意: 给定结点数,树的直径(两点的最长距离),树的高度(1号结点距离其他结点的最长距离),写出树边 ...
- Python高级进阶(一)Python框架之Django入门
传说中的Django Django由来 Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的框架模式,即模型M,视图V和控制器C.它最初是被开发来用于管理劳伦斯出版集团旗下 ...
- 集群架构和CentOS7安装RabbitMQ集群(单机版)
1. 集群架构 1.1 四种内部元数据 队列元数据.交换器元数据.绑定元数据.vhost元数据. 单一节点中:会将数据存储到内存,同时将持久化元数据保存到硬盘. 集群中: 存储到磁盘上.内存中. 集群 ...
- codeforces 301 E. Infinite Inversions
题目: time limit per test 2 seconds memory limit per test 256 megabytes input standard input output ...
- [开源]OSharpNS - .net core 快速开发框架 - 简介
什么是OSharp OSharpNS全称OSharp Framework with .NetStandard2.0,是一个基于.NetStandard2.0开发的一个.NetCore快速开发框架.这个 ...
- 电脑控制手机的另一选择——android vnc server
近来发现的Android上的原生VNC Server,就是说只要手机上安装并运行这个软件,即可实现电脑上查看并控制手机了. 首先是手机端. 1)下载androidvncserver: http://c ...
- XMLHttpRequest对象解读
<!DOCTYPE html> <html> <body> <script> function reqListener () { console.log ...
- 设计模式之解释器模式(Interpreter)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET MVC 学习笔记-6.异步控制器 ASP.NET MVC 学习笔记-5.Controller与View的数据传递 ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用 ASP.NET MVC 学习笔记-3.面向对象设计原则
ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET程序中的web.config文件中,在appSettings这个配置节中能够保存一些配置,比如, 1 <appSettin ...
- iOS 开发小常识 开发笔记
一 自定义push方法 /* 参数说明 * controllerName : push的目标页 例:@“testcontroll” ---注意不带.h * isNibPage ...