http://www.lydsy.com/JudgeOnline/problem.php?id=4540 (题目链接)

题意

  给出$n$个数的序列,$m$个询问,每次询问一段区间$[l,r]$,问$[l,r]$中的不同子序列的最小值之和。

Solution

  右转题解→_→:jump

  处理处前缀和和后缀和以后,ST表维护区间最小值, 对于一段区间,求出它的区间最小值,跳$last$或者是$next$到此终止,我们就求出了终止位置。莫队转移过程脑补一下就就好了。

细节

  LL

代码

// bzoj4540
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define inf (1ll<<60)
#define MOD 1000000007
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std; const int maxn=100010;
int a[maxn],pos[maxn],next[maxn],last[maxn];
int ST[maxn][30],Log[maxn],st[maxn],bin[30],n,m,top,block;
LL prefix[maxn],suffix[maxn],ans[maxn],sum;
struct ask {int l,r,id;}q[maxn]; bool cmp(ask a,ask b) {return pos[a.l]==pos[b.l] ? a.r<b.r : pos[a.l]<pos[b.l];}
int mina(int x,int y) {return a[x]>a[y] ? y : x;} int query(int l,int r) {
int k=Log[r-l+1];
return mina(ST[l][k],ST[r-bin[k]+1][k]);
}
void updater(int l,int r,int op) {
int mn=query(l,r);
sum+=(LL)op*(prefix[r]-prefix[mn]+(LL)a[mn]*(mn-l+1));
}
void updatel(int l,int r,int op) {
int mn=query(l,r);
sum+=(LL)op*(suffix[l]-suffix[mn]+(LL)a[mn]*(r-mn+1));
}
int main() {
bin[0]=1;for (int i=1;i<=20;i++) bin[i]=bin[i-1]<<1;
scanf("%d%d",&n,&m);block=(int)sqrt(n);
for (int i=1;i<=n;i++) scanf("%d",&a[i]),ST[i][0]=i;
for (int i=1;i<=m;i++) scanf("%d%d",&q[i].l,&q[i].r),q[i].id=i;
for (int i=1;i<=n;i++) pos[i]=(i-1)/block+1;
for (int i=1;i<=n;i++) {
while (top && a[st[top]]>a[i]) next[st[top--]]=i;
last[i]=st[top];st[++top]=i;
}
for (int i=1;i<=n;i++) prefix[i]=(LL)(i-last[i])*a[i]+prefix[last[i]];
for (int i=n;i>=1;i--) suffix[i]=(LL)(next[i]-i)*a[i]+suffix[next[i]];
for (int i=2;i<=n;i++) Log[i]=Log[i>>1]+1;
for (int j=1;j<=20;j++)
for (int i=1;i+bin[j]<=n+1;i++)
ST[i][j]=mina(ST[i][j-1],ST[i+bin[j-1]][j-1]);
sort(q+1,q+1+m,cmp);sum=0;
for (int l=1,r=0,i=1;i<=m;i++) {
for (;r<q[i].r;r++) updater(l,r+1,1);
for (;l>q[i].l;l--) updatel(l-1,r,1);
for (;r>q[i].r;r--) updater(l,r,-1);
for (;l<q[i].l;l++) updatel(l,r,-1);
ans[q[i].id]=sum;
}
for (int i=1;i<=m;i++) printf("%lld\n",ans[i]);
return 0;
}

  

【bzoj4540】 Hnoi2016—序列的更多相关文章

  1. BZOJ4540 Hnoi2016 序列 【莫队+RMQ+单调栈预处理】*

    BZOJ4540 Hnoi2016 序列 Description 给定长度为n的序列:a1,a2,-,an,记为a[1:n].类似地,a[l:r](1≤l≤r≤N)是指序列:al,al+1,-,ar- ...

  2. [BZOJ4540][HNOI2016]序列 莫队

    4540: [Hnoi2016]序列 Time Limit: 20 Sec  Memory Limit: 512 MB Description 给定长度为n的序列:a1,a2,…,an,记为a[1:n ...

  3. [Bzoj4540][Hnoi2016] 序列(莫队 + ST表 + 单调队列)

    4540: [Hnoi2016]序列 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1567  Solved: 718[Submit][Status] ...

  4. BZOJ4540 [Hnoi2016]序列

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  5. [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 ...

  6. [luogu3246][bzoj4540][HNOI2016]序列【莫队+单调栈】

    题目描述 给定长度为n的序列:a1,a2,...,an,记为a[1:n].类似地,a[l:r](1<=l<=r<=N)是指序列:al,al+1,...,ar-1,ar.若1<= ...

  7. BZOJ4540 [Hnoi2016]序列 【莫队 + ST表 + 单调栈】

    题目 给定长度为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[ ...

  8. 【BZOJ4540】[Hnoi2016]序列 莫队算法+单调栈

    [BZOJ4540][Hnoi2016]序列 Description 给定长度为n的序列:a1,a2,…,an,记为a[1:n].类似地,a[l:r](1≤l≤r≤N)是指序列:al,al+1,…,a ...

  9. BZOj 4540: [Hnoi2016]序列 [莫队 st表 预处理]

    4540: [Hnoi2016]序列 题意:询问区间所有子串的最小值的和 不强制在线当然上莫队啦 但是没想出来,因为不知道该维护当前区间的什么信息,维护前后缀最小值的话不好做 想到单调栈求一下,但是对 ...

  10. 【LG3246】[HNOI2016]序列

    [LG3246][HNOI2016]序列 题面 洛谷 题解 60pts 对于每个位置\(i\),单调栈维护它往左第一个小于等于它的位置\(lp_i\)以及往右第一个小于它的位置\(rp_i\). 那么 ...

随机推荐

  1. 前端基础之CSS(总结)

    css学什么?? 主要学习选择器和属性,选择器是去找到标签的位置,属性是给标签增加需要的样式. CSS选择器 1.基本选择器: 1.标签选择器 2.ID选择器 3.类选择器(class="c ...

  2. 基于Eclipse下的python图像识别菜鸟版(利用pytesseract以及tesseract)

    这是我注册博客后写的第一篇博客,希望对有相关问题的朋友有帮助. 在图像识别前,首先我们要做好准备工作. 运行环境:windows7及以上版本 运行所需软件:(有基础的可以跳过这一段)eclipse,p ...

  3. [linux] tmux终端复用神器 [转载]

    转载https://www.cnblogs.com/kevingrace/p/6496899.html Tmux是一个优秀的终端复用软件,类似GNU Screen,但来自于OpenBSD,采用BSD授 ...

  4. 奔跑吧DKY——团队Scrum冲刺阶段博客汇总

    第一周:团队展示 团队选题 需求规格说明书 第二周:完善需求规格说明书.制定团队编码规范.通过团队项目数据库设计 奔跑吧DKY--团队Scrum冲刺阶段-Day 1-领航 奔跑吧DKY--团队Scru ...

  5. 07慕课网《进击Node.js基础(一)》HTTP小爬虫

    获取HTML页面 var http = require('http') var url='http://www.imooc.com/learn/348' http.get(url,function(r ...

  6. mysql 性能分析及explain用法

    转载自http://blog.sina.com.cn/s/blog_4586764e0100o9s1.html 使用explain语句去查看分析结果 如   explain select * from ...

  7. KEIL C51代码优化详细分析

    阅读了<单片机与嵌入式系统应用>2005年第10期杂志<经验交流>栏目的一篇文章<Keil C51对同一端口的连续读取方法>(原文)后,笔者认为该文并未就此问题进行 ...

  8. *** error 65: access violation at C:0x001B : no 'execute/read' permission

    转自:http://blog.csdn.net/chenqiai0/article/details/7827071 很多人在进行串口调试的时候会遇到这个问题,请大家略看我的代码,解决方法在其中 //实 ...

  9. 笔记:EF出现列名 'Discriminator' 无效、类没有加入数据库上下文也被数据迁移生成表

    笔记: EF出现列名 'Discriminator' 无效: 类没有加入数据库上下文也被数据迁移生成表: 出现该问题一般是使用了某个基类继承了实体类: 原因是code first的POCO实体对象的继 ...

  10. 模拟alert,confirm 阻塞状态

    /*** * 模拟alert弹窗 * content 为弹框显示的内容 * 确定按钮对应的下面取消关闭显示框 * **/function oAlert(content) { var oWrap = $ ...