题面

题解

设\([l, r]\)的最小值的位置为\(p\),那么对于左端点在区间\([l, p]\),右端点在区间\([p, r]\)的区间最小值都为\(a[p]\)。

这一部分的贡献就是\(a[p] \times (p - l + 1) \times (r - p + 1)\)

设\(f_i = f_{\mathrm{pre}_i} + a_i \times (i - \mathrm{pre}_i)\),于是我们可以发现\(f_{r + 1} - f_p\)就是以\(r + 1\)为右端点,左端点为\([p + 1, r + 1]\)的答案。

但是我们这里要考虑左端点为\((p, x]\),右端点为\([x, r]\)的全部答案。

对于点\(r\),所有以\(r\)为右端点,左端点在\((p, r]\)的答案为\(f_r - f_p\)。

对于点\(r - 1\),所有以\(r - 1\)为右端点,左端点在\((p, r - 1]\)的答案为\(f_{r - 1} - f_p\)

\(\cdots\)

对于点\(p + 1\),所有以\(p + 1\)为右端点,左端点在\((p, p + 1]\)的区间答案为\(f_{p + 1} - f_p\)

求个和,就是\((\sum_{i = p + 1} ^ r f_i) - f_p \times(r - p)\)。

设\(g_i = \sum_{j = 1} ^ i f_j\),那么答案就是\(g_r - g_p - f_p \times (r - p)\)。

同样\(p\)左边的情况是类似的。

时间复杂度\(\mathrm{O}(n\log_2 n)\)

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#define RG register
#define clear(x, y) memset(x, y, sizeof(x)) namespace IO
{
const int BUFSIZE = 1 << 20;
char ibuf[BUFSIZE], *is = ibuf, *it = ibuf;
inline char getchar() { if (is == it) it = (is = ibuf) + fread(ibuf, 1, BUFSIZE, stdin); return *is++; }
} inline int read()
{
int data = 0, w = 1;
char ch = IO::getchar();
while(ch != '-' && (ch < '0' || ch > '9')) ch = IO::getchar();
if(ch == '-') w = -1, ch = IO::getchar();
while(ch >= '0' && ch <= '9') data = data * 10 + (ch ^ 48), ch = IO::getchar();
return data * w;
} const int maxn(1e5 + 10), INF(0x3f3f3f3f), LogN(17);
int n, m, f[LogN][maxn], a[maxn], pre[maxn], suc[maxn];
long long fl[maxn], fr[maxn], gl[maxn], gr[maxn];
int Log[maxn], stk[maxn], top;
inline int min(int x, int y) { return a[x] < a[y] ? x : y; }
inline int query(int l, int r)
{
int k = Log[r - l + 1];
return min(f[k][l], f[k][r - (1 << k) + 1]);
} int main()
{
n = read(), m = read(); a[0] = a[n + 1] = INF, Log[0] = -1;
for(RG int i = 1; i <= n; i++)
a[f[0][i] = i] = read(), Log[i] = Log[i >> 1] + 1;
for(RG int i = 1; i <= Log[n]; i++)
for(RG int j = 1; j <= n - (1 << (i - 1)) + 1; j++)
f[i][j] = min(f[i - 1][j], f[i - 1][j + (1 << (i - 1))]);
for(RG int i = 1; i <= n; i++)
{
while(top && a[stk[top]] > a[i]) suc[stk[top--]] = i;
pre[i] = stk[top], stk[++top] = i;
}
while(top) pre[stk[top]] = stk[top - 1], suc[stk[top--]] = n + 1;
for(RG int i = 1; i <= n; i++)
fr[i] = 1ll * a[i] * (i - pre[i]) + fr[pre[i]],
gr[i] = gr[i - 1] + fr[i];
for(RG int i = n; i; i--)
fl[i] = 1ll * a[i] * (suc[i] - i) + fl[suc[i]],
gl[i] = gl[i + 1] + fl[i];
while(m--)
{
int l = read(), r = read(), p = query(l, r);
printf("%lld\n", 1ll * (p - l + 1) * (r - p + 1) * a[p]
+ gr[r] - gr[p] - fr[p] * (r - p)
+ gl[l] - gl[p] - fl[p] * (p - l));
}
return 0;
}

【HNOI2016】序列的更多相关文章

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

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

  2. 【LG3246】[HNOI2016]序列

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

  3. 4540: [Hnoi2016]序列

    4540: [Hnoi2016]序列 https://www.lydsy.com/JudgeOnline/problem.php?id=4540 分析: 莫队+RMQ+单调栈. 考虑加入一个点后,区间 ...

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

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

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

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

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

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

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

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

  8. [HNOI2016]序列 CDQ+DP

    [HNOI2016]序列 CDQ 链接 loj 思路 一个点最小变为l,最大变为r,不变的时候为v 那么j能在i前面就要满足. \(j<i\) \(r[j]<=v[i]\) \(v[j]& ...

  9. 题解-[HNOI2016]序列

    题解-[HNOI2016]序列 [HNOI2016]序列 给定 \(n\) 和 \(m\) 以及序列 \(a\{n\}\).有 \(m\) 次询问,每次给定区间 \([l,r]\in[1,n]\),求 ...

  10. P6604 [HNOI2016]序列 加强版

    *I. P6604 [HNOI2016]序列 加强版 摘自学习笔记 简单树论 笛卡尔树部分例题 I. 和 P6503 比较类似.我们设 \(f_i\) 表示全局以 \(i\) 结尾的子区间的最小值之和 ...

随机推荐

  1. Visual Studio 2012 Update 1 离线升级包(相当于VS2012 SP1离线补丁包)

    Visual Studio 2012 Update 1 发布也有一段时间了,吾乐吧尝试了好几次在线升级,但是网络不给力啊,结果都失败了.于是一直都想找到官方提供的VS2012 SP1完整离线升级包,不 ...

  2. c# 为什么要使用Array、ArrayList、List?

    c#也是一直在进化的,从数组进化到ArrayList,再进化到泛型就是个例子. static void Main(string[] args) { //数组的增删改查 //定义数组 ] { ,,,, ...

  3. Azure 门户中基于角色的访问控制入门

    面向安全的公司应侧重于向员工提供他们所需的确切权限. 权限过多,可能会向攻击者公开帐户. 权限太少意味着员工无法有效地完成其工作. Azure 基于角色的访问控制 (RBAC) 可通过为 Azure ...

  4. Windows Server查看和记录远程登录信息的方法

    前两天我的一台Windows Server 2012R2的服务器中了传说中的cryptowall病毒,所有数据文件都被加密,需要我支付1个比特币才能解码.幸好服务器上没什么重要的文件,还好我没钱,我选 ...

  5. 入坑Vue

    长期的后端数据开发着实有些枯燥无趣,项目完工,闲暇之际,最近一直在研究前端方面的东西,不得感叹,前端技术发展速度快的让人有些目不暇接,从jQuery开启的插件化时代,几乎许多网站都被jQuery支配, ...

  6. Mysql binlog 无法删除(purge命令无法删除)

    1.版本 1)操作系统 cat /etc/issueCentOS release 6.6 (Final)Kernel \r on an \m cat /proc/versionLinux versio ...

  7. [luogu P4230]连环病原体

    [luogu P4230] 连环病原体 题意 给定一个长度为 \(n\) 的边序列, 当这个序列的一个子区间内的边都加入图中时产生了环则称其为"加强区间", 求序列中的每条边在多少 ...

  8. DevExpress10、RichEditControl

    1.概述 传统.NET界面也有一个RichTextBox控件,一个富文本控件,可存储图片文字,有自己的文件格式RTF. 在DevExpress控件组里面也有一个同等的控件,RichEditContro ...

  9. SDN 第三次上机作业

    SDN 第三次上机作业 1.创建拓扑 2.利用OVS命令下发流表,实现vlan功能 3.利用OVS命令查看流表 s1: s2: 4.验证性测试 5.Wireshark 抓包验证

  10. 1.数据结构&算法的引言+时间复杂度

    一.什么是计算机科学? 首先明确的一点就是计算机科学不仅仅是对计算机的研究,虽然计算机在科学发展的过程中发挥了重大的作用,但是它只是一个工具,一个没有灵魂的工具而已.所谓的计算机科学实际上是对问题.解 ...