首先,如果我知道[l,r],要转移到[l,r+1]的时候,就是加上以r+1为右端点,[l,r+1]为左端点的区间的最小值,其他情况和这个类似

考虑这玩意怎么求

右端点固定的话,我左端点越往左走,这个最小值一定是越来越小

找到[l,r+1]范围内的最小值mi,那么在mi前面的第一个比mi小的位置(记为L[mi]),一定在这个范围外

而且相同的左端点,以这个位置为右端点和以r+1为右端点,区间的最小值是相同的(都是这个数)

所以可以只记f[i]表示以i为右端点,左端点在[1,i]的最小值的和

再问[l,r+1]的话,那就是f[r+1]-f[L[mi]]再减掉左端点在[L[mi]+1,l-1]这个范围内的,而这些的最小值都是mi

这个L用单调栈来求,mi用rmq来求

其他的转移同理

 #include<bits/stdc++.h>
#define CLR(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pa;
const int maxn=1e4+,maxm=1e5+; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} int N,NN,M,a[maxn];
int stk[maxn],sh;
int L[maxn],R[maxn];
pa rmq[maxn][];
ll f[maxn],g[maxn];
struct Node{
int l,r,i;
}que[maxm];
ll ans[maxm]; inline bool cmp(Node a,Node b){
return a.l/NN==b.l/NN?a.r<b.r:a.l<b.l;
} inline pa getmin(int l,int r){
int m=log2(r-l+);
return min(rmq[l][m],rmq[r-(<<m)+][m]);
} inline void add(ll &n,int i,int bnd,int v){
if(bnd<=i){
pa p=getmin(bnd,i);
n+=v*(f[i]-f[L[p.second]]-1ll*p.first*(bnd-L[p.second]-));
}else{
pa p=getmin(i,bnd);
n+=v*(g[i]-g[R[p.second]]-1ll*p.first*(R[p.second]-bnd-));
}
} int main(){
//freopen("","r",stdin);
int i,j,k;
N=rd(),M=rd();NN=sqrt(N);
for(i=;i<=N;i++) a[i]=rd();
for(i=N;i;i--){
rmq[i][]=make_pair(a[i],i);
for(j=;(i+(<<j)-)<=N;j++)
rmq[i][j]=min(rmq[i][j-],rmq[i+(<<(j-))][j-]);
}
for(i=;i<=N;i++){
while(sh&&a[stk[sh]]>a[i]){
R[stk[sh--]]=i;
}stk[++sh]=i;
}sh=;
for(i=N;i;i--){
while(sh&&a[stk[sh]]>a[i]){
L[stk[sh--]]=i;
}stk[++sh]=i;
}
for(i=;i<=N;i++){
f[i]=f[L[i]]+1ll*(i-L[i])*a[i];
}
for(i=N;i;i--){
if(!R[i]) R[i]=N+;
g[i]=g[R[i]]+1ll*(R[i]-i)*a[i];
} for(i=;i<=M;i++){
que[i].l=rd(),que[i].r=rd(),que[i].i=i;
}
sort(que+,que+M+,cmp);
int l=,r=;ll n=;
for(i=;i<=M;i++){
while(r<que[i].r) add(n,++r,l,);
while(r>que[i].r) add(n,r--,l,-);
while(l<que[i].l) add(n,l++,r,-);
while(l>que[i].l) add(n,--l,r,);
ans[que[i].i]=n;
}
for(i=;i<=M;i++)
printf("%lld\n",ans[i]);
return ;
}
/*
9 2
1 7 5 2 6 4 3 5 8
1 6
3 8
*/

bzoj4540 序列 (单调栈+莫队+rmq)的更多相关文章

  1. [HNOI2016]序列(莫队,RMQ)

    [HNOI2016]序列(莫队,RMQ) 洛谷  bzoj 一眼看不出来怎么用数据结构维护 然后还没修改 所以考虑莫队 以$(l,r-1) -> (l,r)$为例 对答案的贡献是$\Sigma_ ...

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

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

  3. luogu 3246 莫队+RMQ+单调栈

    hnoi 2016 标签:题解 莫队 考虑左端点左移以及右端点右移产生的贡献 这样就可以由 \([l, r]\) 转移到另外的 \(4\) 个区间 \(f_{l, r}\) 表示右端点在 \(r\), ...

  4. 【bzoj4540】[Hnoi2016]序列 单调栈+离线+扫描线+树状数组区间修改区间查询

    题目描述 给出一个序列,多次询问一个区间的所有子区间最小值之和. 输入 输入文件的第一行包含两个整数n和q,分别代表序列长度和询问数.接下来一行,包含n个整数,以空格隔开,第i个整数为ai,即序列第i ...

  5. Bad Hair Day [POJ3250] [单调栈 或 二分+RMQ]

    题意Farmer John的奶牛在风中凌乱了它们的发型……每只奶牛都有一个身高hi(1 ≤ hi ≤ 1,000,000,000),现在在这里有一排全部面向右方的奶牛,一共有N只(1 ≤ N ≤ 80 ...

  6. 【BZOJ3809/3236】Gty的二逼妹子序列 [Ahoi2013]作业 莫队算法+分块

    [BZOJ3809]Gty的二逼妹子序列 Description Autumn和Bakser又在研究Gty的妹子序列了!但他们遇到了一个难题. 对于一段妹子们,他们想让你帮忙求出这之内美丽度∈[a,b ...

  7. 【bzoj3809/bzoj3236】Gty的二逼妹子序列/[Ahoi2013]作业 莫队算法+分块

    原文地址:http://www.cnblogs.com/GXZlegend/p/6805252.html bzoj3809 题目描述 Autumn和Bakser又在研究Gty的妹子序列了!但他们遇到了 ...

  8. wannafly 练习赛10 f 序列查询(莫队,分块预处理,链表存已有次数)

    链接:https://www.nowcoder.net/acm/contest/58/F 时间限制:C/C++ 5秒,其他语言10秒 空间限制:C/C++ 262144K,其他语言524288K 64 ...

  9. P2659 美丽的序列 (单调栈)

    题目链接 Solution 直接考虑单调栈处理出每一个点作为最小值的区间长度. 然后 \(O(n)\) 找一遍最大值即可. 记得开 long long,以及要注意 \(0\) 的问题. Code #i ...

随机推荐

  1. Linux 环境变量梳理

    Linux中的环境变量有两种:全局变量和局部变量: 定义.访问.删除局部变量 查看全局变量 可以使用printenv或者env命令来打印所有的全局变量. 访问某一项全局变量,可以使用printenv ...

  2. ntpd、ntpdate、hwclock的区别

    hwclock --systohc 使用ntpdate更新系统时间 - 潜龙勿用 - CSDN博客https://blog.csdn.net/suer0101/article/details/7868 ...

  3. MySQL之数据导入导出

    日常开发中,经常会涉及到对于数据库中数据的导入与导出操作,格式也有很多: TXT,CSV,XLS,SQL等格式,所以,在此总结一下,省的总是百度查询. 一 导出 1) 常用的方式就是使用现成的工具例如 ...

  4. Jmeter使用笔记之html报告扩展(一)

    题记:在用loadrunner的时候可以生成一个HTML的报告,并且里面包含各种图表,各种详细的数据.而在使用Jmeter测试完后并不能直接生成Html 的报告(无论是用GUI还是命令行启动). 经过 ...

  5. ES6/ES2015的一些特性的简单使

    1.一些常用的ES6的特性: let, const, class, extends, super, arrow functions, template string, destructuring, d ...

  6. 【Spring】——声明式事务配置详解

    项目中用到了spring的事务: @Transactional(rollbackFor = Exception.class, transactionManager = "zebraTrans ...

  7. vscode git设置

    vscode只能打开一下界面: 在setting.path增加git.path选项,再使用linux的方法配置路径,就是使用D:/../bin/git.exe而不是\\ 重启vscode,git设置即 ...

  8. 只要访问url地址 那么容器就会根据地址进行对象的创建

    只要访问url地址 那么容器就会根据地址进行对象的创建

  9. 错误代码 0x800700b7 配置错误定义了重复的“system.web.extensions/scripting/scriptResourceHandler”节

    如果是运行VS时就报错,改个端口号就可以解决问题,改完以下两个地方重新运行

  10. HTML5-Input

    HTML5拥有多个新的表单输入类型,这些新特性提供了更好的输入控制和验证(有的浏览器不支持) color.date.datetime.datetime-local.email.month.number ...