题面

题解

设\([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. C#DateTime.ToString 格式化时间字符串和数值类型转换为字符串

    我们经常会遇到对时间进行转换,达到不同的显示效果,默认格式为:2006-6-6 14:33:34,如果要换成200606,06-2006,2006-6-6或更多的格式该怎么办呢?这里将要用到:Date ...

  2. 分享几款常用的MySQL管理工具

    MySQL数据库以体积小.速度快.总体拥有成本低等优点,深受广大中小企业的喜爱,像我们常见的MySQL管理工具都有那些呢?下面给大家推荐六个常用的MySQL管理工具!      phpMyAdmin  ...

  3. 如何监视 Azure 中的虚拟机

    通过收集.查看和分析诊断与日志数据,可以利用很多机会来监视 VM. 若要执行简单的 VM 监视,可以在 Azure 门户中使用 VM 的“概述”屏幕. 可以使用扩展在 VM 上配置诊断以收集更多指标数 ...

  4. [SQLSERVER] [RESTORE] 逐步恢复日志备份并使用只读模式查看

    执行: USE master GO RESTORE DATABASE MYDB FROM DISK = N'FULL_BACKUP.bak' WITH REPLACE, STANDBY = N'STA ...

  5. vscode对Vue文件的html部分格式化失效问题解决办法

    使用vscode编辑vue文件时发现突然格式化代码不会对<template> </template>之间的html生效了,解决办法很简单 文件 --> 首选项 ---&g ...

  6. Zabbix 添加主机,获取模板templateID

    添加一个Host Name=Mail CAS_1.1,IP=10.16.3.4的主机,并加入组groupID=30,连接模板templateID=10132. # -*- coding: UTF-8 ...

  7. Win7 user profile cant logon

    1.local user:testlb1 1234@cat can login safe model 1.重新启动计算机开机时连续点击F8,选择进入安全模式.2.开始-在搜索栏中输入services. ...

  8. Java MySQL数据类型对照

    Java MySQL数据类型对照 类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) 描述             varchar L+N VARCHAR java.lang.S ...

  9. 模拟的confirm

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title> ...

  10. SDN 第二次上机作业

    SDN第二次上机作业 1.控制器floodlight所示可视化图形拓扑的截图,及主机拓扑连通性检测截图 拓扑 连通性 2.利用字符界面下发流表,使得'h1'和'h2' ping 不通 流表截图 连通性 ...