【题解】HNOI2016序列
也想了有半天,没有做出来……实际上做法确实也是十分精妙的。这里推荐一个blog,个人认为这位博主讲得挺好了:Sengxian's Blog;
感觉启示是:首先要加强对莫队算法 & ST表的熟练程度。 在想与数列有关的问题的时候,要尽量多在草稿纸上手玩几组数据,观察其中的联系,应该可以观察到许多有用的性质。
不过这题还有一个地方:网上的题解基本上都是先移动了右指针,后移动左指针;如果反过来,竟然被卡到只有10分。具体的原因我也不知道,但我猜想是不是由于r 和 l 的左右颠倒导致程序出现了一些问题,所以特判了一下,保证左指针永远在右指针的左侧。
#include <bits/stdc++.h>
using namespace std;
#define maxn 200000
#define int long long
int n, q, B = 316, a[maxn];
int ans, Ans[maxn];
int top, S[maxn], Log[maxn];
int LS[maxn], RS[maxn]; struct ques
{
int l, r, id, bel;
ques(int L = 0, int R = 0, int idx = 0)
{ l = L, r = R, id = idx, bel = (l / B) + 1; }
bool operator < (const ques &q)
const{
return (bel < q.bel || (bel == q.bel && r < q.r));
}
}Q[maxn]; int read()
{
int x = 0, k = 1;
char c;
c = getchar();
while(c < '0' || c > '9') { if(c == '-') k = -1; c = getchar(); }
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * k;
} namespace RMQ
{
int ST[maxn][20];
int cmp(const int &i, const int &j) { return a[i] < a[j] ? i : j; }
void Work()
{
for(int i = 2; i <= n; i ++) Log[i] = Log[i >> 1] + 1;
for(int i = 1; i <= n; i ++) ST[i][0] = i;
for(int j = 1, k = 1 << j; k <= n; j ++, k = 1 << j)
for(int i = 1; k + i - 1 <= n; i ++)
ST[i][j] = cmp(ST[i][j - 1], ST[i + (k >> 1)][j - 1]);
}
int Get_min(int l, int r)
{
int k = Log[r - l + 1];
return cmp(ST[l][k], ST[r - (1 << k) + 1][k]);
}
} void Get_Sum(int *LS)
{
S[top = 0] = 0;
for(int i = 1; i <= n; i ++)
{
while(top && a[S[top]] >= a[i]) top --;
LS[i] = LS[S[top]] + (i - S[top]) * a[i];
S[++ top] = i;
}
} int Go_Right(int l, int r)
{
int pos = RMQ :: Get_min(l, r);
return (pos - l + 1) * a[pos] + LS[r] - LS[pos];
} int Go_Left(int l, int r)
{
int pos = RMQ :: Get_min(l, r);
return (r - pos + 1) * a[pos] + RS[l] - RS[pos];
} signed main()
{
n = read(), q = read(), B = sqrt(n) + 1;
for(int i = 1; i <= n; i ++) a[i] = read();
RMQ :: Work();
for(int i = 1; i <= q; i ++)
{
int x = read(), y = read();
Q[i] = ques(x, y, i);
}
sort(Q + 1, Q + 1 + q);
a[0] = -2e9; Get_Sum(LS); reverse(a + 1, a + 1 + n);
Get_Sum(RS); reverse(a + 1, a + 1 + n);
reverse(RS + 1, RS + 1 + n);
int l = 1, r = 1; ans = a[1];
for(int i = 1; i <= q; i ++)
{
if(Q[i].l > r)
{
while(r < Q[i].r) ans += Go_Right(l, r + 1), r ++;
while(r > Q[i].r) ans -= Go_Right(l, r), r --;
while(l < Q[i].l) ans -= Go_Left(l, r), l ++;
while(l > Q[i].l) ans += Go_Left(l - 1, r), l --;
}
else
{
while(l < Q[i].l) ans -= Go_Left(l, r), l ++;
while(l > Q[i].l) ans += Go_Left(l - 1, r), l --;
while(r < Q[i].r) ans += Go_Right(l, r + 1), r ++;
while(r > Q[i].r) ans -= Go_Right(l, r), r --;
}
Ans[Q[i].id] = ans;
}
for(int i = 1; i <= q; i ++) printf("%lld\n", Ans[i]);
return 0;
}
【题解】HNOI2016序列的更多相关文章
- 题解-[HNOI2016]序列
题解-[HNOI2016]序列 [HNOI2016]序列 给定 \(n\) 和 \(m\) 以及序列 \(a\{n\}\).有 \(m\) 次询问,每次给定区间 \([l,r]\in[1,n]\),求 ...
- 【LG3246】[HNOI2016]序列
[LG3246][HNOI2016]序列 题面 洛谷 题解 60pts 对于每个位置\(i\),单调栈维护它往左第一个小于等于它的位置\(lp_i\)以及往右第一个小于它的位置\(rp_i\). 那么 ...
- [BZOJ4540][HNOI2016]序列 莫队
4540: [Hnoi2016]序列 Time Limit: 20 Sec Memory Limit: 512 MB Description 给定长度为n的序列:a1,a2,…,an,记为a[1:n ...
- 【BZOJ4540】[Hnoi2016]序列 莫队算法+单调栈
[BZOJ4540][Hnoi2016]序列 Description 给定长度为n的序列:a1,a2,…,an,记为a[1:n].类似地,a[l:r](1≤l≤r≤N)是指序列:al,al+1,…,a ...
- BZOj 4540: [Hnoi2016]序列 [莫队 st表 预处理]
4540: [Hnoi2016]序列 题意:询问区间所有子串的最小值的和 不强制在线当然上莫队啦 但是没想出来,因为不知道该维护当前区间的什么信息,维护前后缀最小值的话不好做 想到单调栈求一下,但是对 ...
- 4540: [Hnoi2016]序列
4540: [Hnoi2016]序列 https://www.lydsy.com/JudgeOnline/problem.php?id=4540 分析: 莫队+RMQ+单调栈. 考虑加入一个点后,区间 ...
- 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] 序列(莫队 + 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]& ...
- P6604 [HNOI2016]序列 加强版
*I. P6604 [HNOI2016]序列 加强版 摘自学习笔记 简单树论 笛卡尔树部分例题 I. 和 P6503 比较类似.我们设 \(f_i\) 表示全局以 \(i\) 结尾的子区间的最小值之和 ...
随机推荐
- CC2541工程优化等级的问题
1. 调试工程的时候发现,优化等级稍微调高一级,就容易出问题,只能用None,其他等级会出现数据丢失的现象.
- Awesome Django
Awesome Django If you find Awesome Django useful, please consider donating to help maintain it. ...
- 开胃小菜——impress.js代码详解
README 友情提醒,下面有大量代码,由于网页上代码显示都是同一个颜色,所以推荐大家复制到自己的代码编辑器中看. 今天闲来无事,研究了一番impress.js的源码.由于之前研究过jQuery,看i ...
- 新买的 SSD 固态硬盘竟然是坏的,我傻了啊!
1. 今天早上上班路上在网上下单了一个 1 T 的 SSD 固态硬盘,晚上 7 点半左右送到手后迫不及待想替换掉原来的机械硬盘,在这个新硬盘上装系统,玩起来. 2. 拆开包装,先用移动硬盘接口检查下新 ...
- WPF Issues
Grid row height is star, but the height setting does not work in a prism:region Problem: My original ...
- 「日常训练」Kefa and Park(Codeforces Round #321 Div. 2 C)
题意与分析(CodeForces 580C) 给你一棵树,然后每个叶子节点会有一家餐馆:你讨厌猫(waht?怎么会有人讨厌猫),就不会走有连续超过m个节点有猫的路.然后问你最多去几家饭店. 这题我写的 ...
- hdu1312Red and Black(迷宫dfs,一遍)
Red and Black Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- 如何往eclipse中导入maven项目
现在公司中大部分项目可能都是使用maven来构建,假如现在摆在你面前有一个maven的项目,如果你要学习它,如何将它导入到像eclipse这样的集成开发工具中呢,以项目public_class_1为例 ...
- Python 的非正式介绍
在下面的例子中,通过提示符 (>>> 与 ...) 的出现与否来区分输入和输出:如果你想复现这些例子,当提示符出现后,你必须在提示符后键入例子中的每一个词:不以提示符开头的那些行是解 ...
- Bootstrap框架(图标)
Glyphicons 字体图标 所有可用的图标 包括250多个来自 Glyphicon Halflings 的字体图标.Glyphicons Halflings 一般是收费的,但是他们的作者允许 Bo ...