【HNOI2016】序列
题面
题解
设\([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】序列的更多相关文章
- BZOj 4540: [Hnoi2016]序列 [莫队 st表 预处理]
4540: [Hnoi2016]序列 题意:询问区间所有子串的最小值的和 不强制在线当然上莫队啦 但是没想出来,因为不知道该维护当前区间的什么信息,维护前后缀最小值的话不好做 想到单调栈求一下,但是对 ...
- 【LG3246】[HNOI2016]序列
[LG3246][HNOI2016]序列 题面 洛谷 题解 60pts 对于每个位置\(i\),单调栈维护它往左第一个小于等于它的位置\(lp_i\)以及往右第一个小于它的位置\(rp_i\). 那么 ...
- 4540: [Hnoi2016]序列
4540: [Hnoi2016]序列 https://www.lydsy.com/JudgeOnline/problem.php?id=4540 分析: 莫队+RMQ+单调栈. 考虑加入一个点后,区间 ...
- [BZOJ4540][HNOI2016]序列 莫队
4540: [Hnoi2016]序列 Time Limit: 20 Sec Memory Limit: 512 MB Description 给定长度为n的序列:a1,a2,…,an,记为a[1:n ...
- BZOJ4540 Hnoi2016 序列 【莫队+RMQ+单调栈预处理】*
BZOJ4540 Hnoi2016 序列 Description 给定长度为n的序列:a1,a2,-,an,记为a[1:n].类似地,a[l:r](1≤l≤r≤N)是指序列:al,al+1,-,ar- ...
- 【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] 序列(莫队 + ST表 + 单调队列)
4540: [Hnoi2016]序列 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1567 Solved: 718[Submit][Status] ...
- [HNOI2016]序列 CDQ+DP
[HNOI2016]序列 CDQ 链接 loj 思路 一个点最小变为l,最大变为r,不变的时候为v 那么j能在i前面就要满足. \(j<i\) \(r[j]<=v[i]\) \(v[j]& ...
- 题解-[HNOI2016]序列
题解-[HNOI2016]序列 [HNOI2016]序列 给定 \(n\) 和 \(m\) 以及序列 \(a\{n\}\).有 \(m\) 次询问,每次给定区间 \([l,r]\in[1,n]\),求 ...
- P6604 [HNOI2016]序列 加强版
*I. P6604 [HNOI2016]序列 加强版 摘自学习笔记 简单树论 笛卡尔树部分例题 I. 和 P6503 比较类似.我们设 \(f_i\) 表示全局以 \(i\) 结尾的子区间的最小值之和 ...
随机推荐
- 创建Filter类
1.Filter可认为是servlet的一种“加强版”,它主要用于对用户请求进行预处理,也可以对HttpServletresponse进行后处理,是个典型的处理链.Filter也可对用户请求生成响应, ...
- python实现简单的负载均衡
提到分发请求,相信大多数人首先会想到Nginx,Nginx作为一种多功能服务器,不仅提供了反向代理隐藏主机ip的能力,还拥有简单的缓存加速功能.当然Nginx最强大的功能还是分发请求,不仅提供了哈希, ...
- SqlServer为字段创建索引
语法:CREATE [索引类型] INDEX 索引名称ON 表名(列名) 创建索引实例: 聚簇索引 create clustered index index_name on table_name (c ...
- Oracle 当数据库的表没有drop操作就可以通过如下方式恢复表数据
--执行下列语句可查询出相关时间点 select * from sys.smon_scn_time order by time_dp desc; --执行下列语句可将某个时间点的数据恢复 insert ...
- CSS| text文本属性
注意:一般来说,可以为所有块级元素应用 text-indent,但无法将该属性应用于行内元素,图像之类的替换元素上也无法应用 text-indent 1) text-indent 取值: 5px/2 ...
- 【转】Java学习---HashMap和HashSet的内部工作机制
[原文]https://www.toutiao.com/i6593863882484220430/ HashMap和HashSet的内部工作机制 HashMap 和 HashSet 内部是如何工作的? ...
- MySQL主从复制日常管理维护篇
日常工作中,我们需要经常进行一些监控和管理维护工作,以便能及时发现一些复制中的问题,并尽快解决,以此来保证复制能够正常工作 1.查看从库状态 MySQL [(none)]> show slave ...
- 粗略的整改一下blog
一.先找个简约的模板:看个人喜好咯 二.页面定制CSS: 1.首先,查看主页源码,了解一下各个标签的id,引用的class等 2.通过操作相应的id,class,和标签,进行个性化.这里需要具备看懂和 ...
- Python3编写网络爬虫01-基本请求库urllib的使用
安装python后 自带urllib库 模块篇 分为几个模块如下: 1. urllib.request 请求模块 2. urllib.parse 分析模块 3. urllib.error 异常处理模块 ...
- File API
ES5 推出了一系列的 API: BLOB (二进制大对象) File (文件接口,基于 BLOB,但是增加了文件相关的方法,比如路径,大小) FileList (借助 <input type= ...