[HNOI2016]序列(莫队,RMQ)
[HNOI2016]序列(莫队,RMQ)
一眼看不出来怎么用数据结构维护
然后还没修改
所以考虑莫队
以$(l,r-1) -> (l,r)$为例
对答案的贡献是$\Sigma_{i=l}^{r}minval(a[i:r])$
考虑维护前缀和
先用单调栈扫出$w[i]$作为最小值的左边界右边界$l_i,r_i$
然后回到上面的例子贡献就是$frontsum_{r}-frontsum_{rmqmin(l,r)}+w[rmqmin(l,r)]*(rmqmin(l,r)-l+1)$
完结...等等我好像忘了点啥
$frontsum_{i}$指的是从i向前拓展的i个包含i的子区间的区间最小值的和,也是可以用单调栈求出来的
时间复杂度略
#include<cstdio>
#include<cmath>
#include<algorithm>
using std::sort;
typedef long long lint;
const int N=100011;
template<typename tp>void read(tp &kk){
#define ak *
tp phy=0,ioi=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')ioi=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){phy=phy*10+ch-'0';ch=getchar();}
kk=phy ak ioi;
}
int n,m,bl[N];
lint w[N];
int bsize; int lg[N];
int lgl[N][17];
void is()
{
for(int i=2;i<=n;i++) lg[i]=lg[i>>1]+1;
for(int i=1;i<=n;i++) lgl[i][0]=i;
for(int k=1;k<=lg[n];k++)
{
for(int i=1;i-1+(1<<k)<=n;i++)
{
lgl[i][k]=w[lgl[i][k-1]]<w[lgl[i+(1<<(k-1))][k-1]]?lgl[i][k-1]:lgl[i+(1<<(k-1))][k-1];
}
}
}
int rmq(int l,int r){
return w[lgl[l][lg[r-l+1]]]<
w[lgl[r-(1<<lg[r-l+1])+1][lg[r-l+1]]]?
lgl[l][lg[r-l+1]]:
lgl[r-(1<<lg[r-l+1])+1][lg[r-l+1]];
} int li[N],ri[N];
int st[N],hop;
void rkk()
{
for(int i=1;i<=n;i++)
{
while(hop&&w[st[hop]]>w[i])
ri[st[hop]]=i-1,hop--;
st[++hop]=i;
if(i==n)
while(hop) ri[st[hop]]=i,hop--;
}
for(int i=n;i;i--)
{
while(hop&&w[st[hop]]>w[i])
li[st[hop]]=i+1,hop--;
st[++hop]=i;
if(i==1)
while(hop) li[st[hop]]=i,hop--;
}
}
lint fsum[N],bsum[N];
void baka()
{
for(int i=1;i<=n;i++)
fsum[i]=fsum[li[i]-1]+w[i]*(i-li[i]+1);
for(int i=n;i;i--)
bsum[i]=bsum[ri[i]+1]+w[i]*(ri[i]-i+1);
} struct ques
{
int l,r,id;
bool friend operator < (ques a,ques b)
{
if(bl[a.l]!=bl[b.l]) return bl[a.l]<bl[b.l];
return bl[a.r]<bl[b.r];
}
}q[N]; lint prt[N],tmp; int main()
{
read(n),read(m),bsize=ceil(sqrt(n));
for(int i=1;i<=n;i++) read(w[i]),bl[i]=(i-1)/bsize+1;
rkk();
is();
baka();
for(int i=1;i<=m;i++) read(q[i].l),read(q[i].r),q[i].id=i;
sort(q+1,q+1+m);
int l=1,r=1;tmp=w[1];
for(int i=1;i<=m;i++)
{
while(r<q[i].r){r++;tmp+=fsum[r]-fsum[rmq(l,r)]+((rmq(l,r)-l+1)*w[rmq(l,r)]);}
while(l>q[i].l){l--;tmp+=bsum[l]-bsum[rmq(l,r)]+((r-rmq(l,r)+1)*w[rmq(l,r)]);}
while(r>q[i].r){tmp-=fsum[r]-fsum[rmq(l,r)]+((rmq(l,r)-l+1)*w[rmq(l,r)]);r--;}
while(l<q[i].l){tmp-=bsum[l]-bsum[rmq(l,r)]+((r-rmq(l,r)+1)*w[rmq(l,r)]);l++;}
prt[q[i].id]=tmp;
}
for(int i=1;i<=m;i++) printf("%lld\n",prt[i]);
return 0;
}
[HNOI2016]序列(莫队,RMQ)的更多相关文章
- BZOJ.4540.[HNOI2016]序列(莫队/前缀和/线段树 单调栈 RMQ)
BZOJ 洛谷 ST表的一二维顺序一定要改过来. 改了就rank1了哈哈哈哈.自带小常数没办法. \(Description\) 给定长为\(n\)的序列\(A_i\).\(q\)次询问,每次给定\( ...
- BZOj 4540: [Hnoi2016]序列 [莫队 st表 预处理]
4540: [Hnoi2016]序列 题意:询问区间所有子串的最小值的和 不强制在线当然上莫队啦 但是没想出来,因为不知道该维护当前区间的什么信息,维护前后缀最小值的话不好做 想到单调栈求一下,但是对 ...
- 【BZOJ4540】[Hnoi2016]序列 莫队算法+单调栈
[BZOJ4540][Hnoi2016]序列 Description 给定长度为n的序列:a1,a2,…,an,记为a[1:n].类似地,a[l:r](1≤l≤r≤N)是指序列:al,al+1,…,a ...
- [BZOJ4540][HNOI2016]序列 莫队
4540: [Hnoi2016]序列 Time Limit: 20 Sec Memory Limit: 512 MB Description 给定长度为n的序列:a1,a2,…,an,记为a[1:n ...
- [bzoj4540][Hnoi2016][序列] (莫队算法+单调栈+st表)
Description 给定长度为n的序列:a1,a2,…,an,记为a[1:n].类似地,a[l:r](1≤l≤r≤N)是指序列:al,al+1,…,ar-1,ar.若1≤l≤s≤t≤r≤n,则称a ...
- 洛谷P3246 [HNOI2016]序列 [莫队]
传送门 思路 看到可离线.无修改.区间询问,相信一定可以想到莫队. 然而,莫队怎么转移是个大问题. 考虑\([l,r]\rightarrow[l,r+1]\)时答案会怎样变化?(左端点变化时同理) \ ...
- bzoj 4540: [Hnoi2016]序列 莫队
题目: 给定长度为n的序列:a1,a2,-,an,记为a[1:n].类似地,a[l:r](1≤l≤r≤N)是指序列:al,al+1,-,ar- 1,ar.若1≤l≤s≤t≤r≤n,则称a[s:t]是a ...
- BZOJ 4540 [Hnoi2016]序列 | 莫队 详细题解
传送门 BZOJ 4540 题解 --怎么说呢--本来想写线段树+矩阵乘法的-- --但是嘛--yali的机房太热了--困--写不出来-- 于是弃疗,写起了莫队.(但是我连莫队都想不出来!) 首先用单 ...
- 【BZOJ4540】【HNOI2016】序列 [莫队][RMQ]
序列 Time Limit: 20 Sec Memory Limit: 512 MB[Submit][Status][Discuss] Description 给定长度为n的序列:a1,a2,…,a ...
随机推荐
- Solution -「CF 232E」Quick Tortoise
\(\mathcal{Description}\) Link. 在一张 \(n\times m\) 的网格图中有空格 . 和障碍格 #,\(q\) 次询问,每次查询从 \((x_1,y_1)\ ...
- 自学linux(修改中文)STEP2
登录身份 最好用普通身份登录,而不是root用户,因为root用户权限太高,容易引起安全问题. 不显示中文 安装系统后,在图形化界面设置中文还是不生效.查询资料后如下: 1. 查看 linux 系统下 ...
- Spring AOP基础概念及自定义注解式AOP初体验
对AOP的理解开始是抽象的,看到切点的匹配方式其实与正则表达式性质大致一样就基本了解AOP是基本是个什么作用了.只是整个概念更抽象,需要具化理解.下图列表是AOP相关概念解释,可能也比较抽象^_^ 比 ...
- JVM性能调优与实战进阶篇-上
ZGC 诞生原因 Java生态非常强大,但还不够,有些场景仍处于劣势,而ZGC的出现可以让Java语言抢占其他语言的某些特定领域市场.比如 谷歌主导的Android手机系统显示卡顿. 证券交易市场,实 ...
- kali linux 中python2不带pip的解决方法
在使用kali2020版本时,发现pip只能安装python3的模块,没办法安装python2模块,但是我有需要用到python2来运行脚本,在此贴出解决办法 https://bootstrap.py ...
- [BACKUP] Visual Studio Code 配置
0 VSCode 便携模式:https://code.visualstudio.com/docs/editor/portable#_enable-portable-mode 1. 字体 FiraCod ...
- 『无为则无心』Python基础 — 61、Python中的迭代器
目录 1.迭代的概念 2.迭代器的概念 3.可迭代的对象(Iterable) 4.迭代器对象(Iterator) 5.迭代器的使用体验 (1)基本用法 (2)实际应用 1.迭代的概念 (1)什么是迭代 ...
- 【Windows 访问控制】八、安全主体和安全对象
安全主体(security principal)? 安全主体是任何可通过操作系统进行身份验证的实体,例如用户帐户.计算机帐户.在用户或计算机帐户的安全上下文中运行的线程或进程,或者这些帐户的安全组. ...
- windows 应用商店常用软件
QuickLook 这个应用可以让你,用空格键查看几乎任何文件的信息. 例如快速查看图片,播放视频,阅读 PDF 等等,支持的格式多到吓人. Python 没错,就是那个非常火的编程语言,Pytho ...
- 由浅入深---MyBatis的全局配置文件
从我开始接触代码,我就很怕写配置文件,一般的配置文件我都是直接从上一个项目复制到这个项目来改改,可能有部分同学也有我这种痛吧: 我目前一般的做法,先去找找例子(从网上,从github,从官网)之后再改 ...