LOJ 6057 - [HNOI2016]序列 加强版再加强版
Description
给定一个长度为 \(n\le 3*10^6\) 的序列
\(q\le 10^7\) 次询问每次求区间 \([l,r]\) 的所有子区间的最小值的和
询问随机
Solution
考虑求出区间的最小值, 设在位置 \(p\)
考虑 \([l, p)\) 和 \((p, r]\) 的答案
\([l, p) = [l, n] - [p, n] - (左端点在[l, p) 右端点在[p, n] 的)\)
因为 \([l, p)\) 都比 \(p\) 小
所以该部分为 \((p-l) * 左端点在p的答案\)
区间最小值可以用rmq求
正常的O(n)-O(1) rmq需要转成树, 然后变成 \(\pm 1\) 的, 然后分块块内还要预处理, 常数很大
注意到这题询问随机, 询问到块内的几率很小, 所以可以把块内的处理改成暴力
块边缘维护前后缀min即可
Code
#include <bits/stdc++.h>
using namespace std;
#define ri rd<int>
#define rep(i, a, b) for (int i = (a), _ = (b); i <= _; ++i)
#define per(i, a, b) for (int i = (a), _ = (b); i >= _; --i)
#define For(i, a, b) for (int i = (a), _ = (b); i < _; ++i)
const int maxN = 3e6 + 7;
const int INF = 1e9 + 7;
typedef long long LL;
const LL O = 1e9 + 7;
template<class T> T rd() {
bool f = 1; char c = getchar(); for (; !isdigit(c); c = getchar()) if (c == '-') f = 0;
T x = 0; for (; isdigit(c); c = getchar()) x = x * 10 + c - '0'; return f ? x : -x;
}
int n, m;
int a[maxN];
namespace IO {
int A, B, C, P;
LL lastAns;
inline int rnd() {
return A = (A * B + (C ^ (int)(lastAns & 0x7fffffffLL)) % P) % P;
}
void init() {
A = ri(), B = ri(), C = ri(), P = ri();
lastAns = 0;
}
}
namespace RMQ {
const int maxL = 3e5 + 7;
const int B = 12;
struct Node {
int l, r, v;
int pre[12], suf[12];
}a[maxL];
int st[maxL][20];
int ln[maxL];
int bl[maxN];
void gmin(int &x, int y) {
if (::a[y] < ::a[x]) x = y;
}
int ggmin(int x, int y) {
return ::a[x] < ::a[y] ? x : y;
}
void init() {
rep (i, 1, n) {
int &t = bl[i] = i / B;
int &v = st[t][0];
if (a[t].l == 0) {
a[t].l = i;
v = i;
}
a[t].r = i;
gmin(v, i);
}
int T = bl[n];
rep (j, 0, T) {
Node &t = a[j];
int l = t.l, r = t.r;
t.pre[0] = l;
rep (i, l+1, r) t.pre[i-l] = ggmin(t.pre[i-l-1], i);
t.suf[0] = r;
per (i, r-1, l) t.suf[r-i] = ggmin(t.suf[r-i-1], i);
}
rep (i, 2, T) ln[i] = ln[i >> 1] + 1;
per (i, T, 0) {
rep (j, 1, ln[T-i+1])
st[i][j] = ggmin(st[i][j-1], st[i+(1<<(j-1))][j-1]);
}
}
int eval(int l, int r) {
int len = ln[r-l+1];
return ggmin(st[l][len], st[r-(1<<len)+1][len]);
}
int get(int l, int r) {
int res = l;
if (bl[l] == bl[r]) {
rep (i, l, r) gmin(res, i);
return res;
}
int u = bl[l], v = bl[r];
gmin(res, a[u].suf[a[u].r - l]);
gmin(res, a[v].pre[r - a[v].l]);
if (u+1 < v) gmin(res, eval(u+1, v-1));
return res;
}
}
namespace Solve {
LL pre[maxN], suf[maxN];
void init() {
static int stack[maxN], Top;
stack[Top = 0] = 0;
LL res = 0;
rep (i, 1, n) {
for (; Top && a[stack[Top]] >= a[i]; --Top)
res -= 1LL * a[stack[Top]] * (stack[Top] - stack[Top-1]);
stack[++Top] = i;
res += 1LL * a[i] * (stack[Top] - stack[Top-1]);
pre[i] = res;
}
res = 0;
per (i, n, 1) {
for (; Top && a[stack[Top]] >= a[i]; --Top)
res -= 1LL * a[stack[Top]] * (stack[Top-1] - stack[Top]);
stack[++Top] = i;
res += 1LL * a[i] * (stack[Top-1] - stack[Top]);
suf[i] = res;
}
rep (i, 1, n) pre[i] += pre[i-1];
per (i, n, 1) suf[i] += suf[i+1];
}
LL getr(int l, int r) {
return suf[l] - suf[r] - 1LL * (r-l) * (suf[r] - suf[r+1]);
}
LL getl(int l, int r) {
return pre[r] - pre[l] - 1LL * (r-l) * (pre[l] - pre[l-1]);
}
}
LL get(int l, int r) {
int p = RMQ::get(l, r);
LL res = 1LL * (p-l+1) * (r-p+1) * a[p];
if (l < p) res += Solve::getr(l, p);
if (p < r) res += Solve::getl(p, r);
return res;
}
int main() {
#ifndef ONLINE_JUDGE
freopen("a.in", "r", stdin);
#endif
n = ri(), m = ri();
rep (i, 1, n) a[i] = ri();
IO::init();
RMQ::init();
Solve::init();
LL res = 0;
rep (i, 1, m) {
int l = IO::rnd() % n + 1, r = IO::rnd() % n + 1;
if (l > r) std::swap(l, r);
LL &tp = IO::lastAns = get(l, r);
res += tp % O;
}
printf("%lld\n", (res % O + O) % O);
return 0;
}
LOJ 6057 - [HNOI2016]序列 加强版再加强版的更多相关文章
- P6604 [HNOI2016]序列 加强版
*I. P6604 [HNOI2016]序列 加强版 摘自学习笔记 简单树论 笛卡尔树部分例题 I. 和 P6503 比较类似.我们设 \(f_i\) 表示全局以 \(i\) 结尾的子区间的最小值之和 ...
- [BZOJ4540][HNOI2016]序列 莫队
4540: [Hnoi2016]序列 Time Limit: 20 Sec Memory Limit: 512 MB Description 给定长度为n的序列:a1,a2,…,an,记为a[1:n ...
- [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]& ...
- 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 序列 【莫队+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 ...
随机推荐
- Uber:中国市场两年内不考虑盈利,每年补贴10亿美金
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 网站的robots.txt文件
什么是robots.txt? robots.txt是一个纯文本文件,是爬虫抓取网站的时候要查看的第一个文件,一般位于网站的根目录下.robots.txt文件定义了爬虫在爬取该网站时存在的限制,哪些部分 ...
- 区分Oracle的数据库,实例,服务名,SID
文章摘自:http://www.zhetao.com/content240 感谢分享O(∩_∩)O~ 在实际的开发应用中,关于Oracle数据库,经常听见有人说建立一个数据库,建立一个Instance ...
- leetcode笔记--6 Add Digits
question: Given a non-negative integer num, repeatedly add all its digits until the result has only ...
- html5学得好不好,看掌握多少标签
html5学得好不好,看掌握多少标签 已回复 会员ID:wi701329 保密 62岁 时间:2016-06-28 06:52:49 html5你了解了多少?如果你还是入门阶段的话,或者还是一知半解的 ...
- Unity3d脚本生命周期
如图: 测试脚本: using UnityEngine; public class Test2 : MonoBehaviour { void Awake() { Debug.Log("Awa ...
- 「日常训练」「小专题·图论」Domino Effect(1-5)
题意 分析 这题几乎就是一条dijkstra的问题.但是,如何考虑倒在中间? 要意识到这题求什么:单源最短路的最大值.那么有没有更大的?倒在中间有可能会使它更大. 但是要注意一个问题:不要把不存在的边 ...
- Fast-RCNN论文总结整理
此篇博客写作思路是一边翻译英文原文一边总结博主在阅读过程中遇到的问题及一些思考,因为博主本人阅读英文论文水平不高,所以还请大家在看此篇博客的过程中带着批判的眼神阅读!小墨镜带好,有什么不对的地方请在留 ...
- Spring Security 5.0.x 参考手册 【翻译自官方GIT-2018.06.12】
源码请移步至:https://github.com/aquariuspj/spring-security/tree/translator/docs/manual/src/docs/asciidoc 版 ...
- hadoop自定义数据类型
统计某手机数据库的每个手机号的上行数据包数量和下行数据包数量 数据库类型如下: 数据库内容如下: 下面自定义类型SimLines,类似于平时编写的model import java.io.DataIn ...