bzoj 4540 [HNOI 2016] 序列 - 莫队算法 - Sparse-Table - 单调栈
题目传送门
题目大意
给定一个长度为$n$的序列。询问区间$[l, r]$的所有不同的子序列的最小值的和。
这里的子序列是连续的。两个子序列不同当且仅当它们的左端点或右端点不同。
不会直接上神奇数据结构的做法。
考虑莫队。当在一段右边加入一个数后,考虑它产生的贡献。
首先找到加入后这一段的最小值,那么左端点在它的左侧的时候这个最小值做出贡献。
对于它右边到新加入的数新造成的贡献用同样的方法计算,期望下多带个$log$,然后题目没说数据随机。
考虑右边这一部分其实被算重了许多次,因为最小值右边的分段情况比较固定。因为每个"最小值"有一个固定的“恶势力”范围。这个东西可以用前缀和再加上单调栈预处理。
求最小的任务就交给st表好了。
Code
/**
* bzoj
* Problem#4540
* Accepted
* Time: 10024ms
* Memory: 34932k
*/
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstdio>
#ifndef WIN32
#define Auto "%lld"
#else
#define Auto "%I64d"
#endif
using namespace std;
typedef bool boolean;
);
, bzmax = ;
#define pii pair<int, int>
#define fi first
#define sc second
typedef class SparseTable {
public:
int n;
int *ar;
int log2[N];
pii bz[N][bzmax];
SparseTable() { }
SparseTable(int n, int* ar):n(n) {
log2[] = ;
; i <= n; i++)
log2[i] = log2[i >> ] + ;
; i < n; i++)
bz[i][] = min(pii(ar[i], i), pii(ar[i + ], i + ));
; j < bzmax; j++)
; i + ( << j) <= n + ; i++)
bz[i][j] = min(bz[i][j - ], bz[i + ( << (j - ))][j - ]);
}
int query(int l, int r) {
if (l == r) return l;
int l2 = log2[r - l];
<< l2)][l2]).sc;
}
}SparseTable;
;
#define ll long long
typedef class Query {
public:
int l, r, id;
ll res;
Query() { }
boolean operator < (Query b) const {
if (l / cs != b.l / cs) return l / cs < b.l / cs;
return r < b.r;
}
}Query;
int n, m;
;
Query *qs;
SparseTable st;
ll *pl, *pr;
int *ar;
pii *sta;
inline void init() {
scanf("%d%d", &n, &m);
pl = )];
pr = )];
ar = )];
sta = )];
qs = )];
; i <= n; i++)
scanf("%d", ar + i);
st = SparseTable(n, ar);
; i <= m; i++)
scanf("%d%d", &qs[i].l, &qs[i].r), qs[i].id = i;
}
inline void prepare() {
sta[++tp] = pii(, -inf);
pl[] = , pr[n + ] = ;
; i <= n; i++) {
while (tp && sta[tp].sc >= ar[i])
tp--;
pl[i] = pl[sta[tp].fi] + (i - sta[tp].fi) * 1ll * ar[i];
sta[++tp] = pii(i, ar[i]);
}
sta[tp = ] = pii(n + , -inf);
for (int i = n; i; i--) {
while (tp && sta[tp].sc >= ar[i])
tp--;
pr[i] = pr[sta[tp].fi] + (sta[tp].fi - i) * 1ll * ar[i];
sta[++tp] = pii(i, ar[i]);
}
}
ll res = ;
inline void solve() {
sort(qs + , qs + m + );
;
, p; sid <= n / cs && c <= m; sid++) {
, mdzzr = ;
res = ;
for ( ; c <= m && qs[c].l / cs == sid; c++) {
while (mdzzr < qs[c].r) {
p = st.query(mdzzl, ++mdzzr);
res += (p - mdzzl + ) * 1ll * ar[p] + pl[mdzzr] - pl[p];
}
while (mdzzl < qs[c].l) {
p = st.query(mdzzl, mdzzr);
res -= (mdzzr - p + ) * 1ll * ar[p] + pr[mdzzl] - pr[p];
mdzzl++;
}
while (mdzzl > qs[c].l) {
p = st.query(--mdzzl, mdzzr);
res += (mdzzr - p + ) * 1ll * ar[p] + pr[mdzzl] - pr[p];
}
qs[c].res = res;
}
}
; i <= m; i++)
while (qs[i].id != i)
swap(qs[i], qs[qs[i].id]);
; i <= m; i++)
printf(Auto"\n", qs[i].res);
}
int main() {
init();
prepare();
solve();
;
}
bzoj 4540 [HNOI 2016] 序列 - 莫队算法 - Sparse-Table - 单调栈的更多相关文章
- BZOJ 3809 Gty的二逼妹子序列 莫队算法+分块
Description Autumn和Bakser又在研究Gty的妹子序列了!但他们遇到了一个难题. 对于一段妹子们,他们想让你帮忙求出这之内美丽度∈[a,b]的妹子的美丽度的种类数. 为了方便,我们 ...
- BZOJ 3236 AHOI 2013 作业 莫队算法
题目大意:给出一些数,问在一个区间中不同的数值有多少种,和在一个区间中不同的数值有多少个. 思路:因为没有改动,所以就想到了莫队算法.然后我写了5K+的曼哈顿距离最小生成树,然后果断T了.(100s的 ...
- BZOJ 3289: Mato的文件管理[莫队算法 树状数组]
3289: Mato的文件管理 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 2399 Solved: 988[Submit][Status][Di ...
- [bzoj4540][Hnoi2016][序列] (莫队算法+单调栈+st表)
Description 给定长度为n的序列:a1,a2,…,an,记为a[1:n].类似地,a[l:r](1≤l≤r≤N)是指序列:al,al+1,…,ar-1,ar.若1≤l≤s≤t≤r≤n,则称a ...
- 【BZOJ4540】[Hnoi2016]序列 莫队算法+单调栈
[BZOJ4540][Hnoi2016]序列 Description 给定长度为n的序列:a1,a2,…,an,记为a[1:n].类似地,a[l:r](1≤l≤r≤N)是指序列:al,al+1,…,a ...
- bzoj 5301: [Cqoi2018]异或序列 (莫队算法)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=5301 题面; 5301: [Cqoi2018]异或序列 Time Limit: 10 Sec ...
- bzoj 3757 苹果树(树上莫队算法)
[题意] 有若干个询问,询问路径u,v上的颜色总数,另外有要求a,b,意为将a颜色看作b颜色. [思路] vfk真是神系列233. Quote: 用S(v, u)代表 v到u的路径上的结点的集合. 用 ...
- BZOJ 4540 [Hnoi2016]序列 (单调栈 + ST表 + 莫队算法)
题目链接 BZOJ4540 考虑莫队算法. 这题难在$[l, r]$到$[l, r+1]$的转移. 根据莫队算法的原理,这个时候答案应该加上 $cal(l, r+1) + cal(l+1, r+1) ...
- bzoj 3809 Gty的二逼妹子序列(莫队算法,块状链表)
[题意] 回答若干个询问,(l,r,a,b):区间[l,r]内权值在[a,b]的数有多少[种]. [思路] 考虑使用块状链表实现莫队算法中的插入与删除. 因为权值处于1..n之间,所以我们可以建一个基 ...
随机推荐
- React对比Vue(02 绑定属性,图片引入,数组循环等对比)
import React, { Component } from 'react'; import girl from '../assets/images/1.jpg' //这个是全局的不要this.s ...
- mongodb对数组元素及内嵌文档进行增删改查操作(转)
from:https://my.oschina.net/132722/blog/168274 比如我有一个user类,他包含一个标签属性,这个标签是一个数组,数组里面的元素是内嵌文档,格式如下: &l ...
- 如何使用Apache log4net库与ASP.NET MVC 5日志记录
在运行软件程序的时候,跟踪和监控日志是一种记录过程的好方法. 简介: 在运行软件程序的时候,跟踪和监控日志是一种记录过程的好方法.尤其在应用程序出错的时候,日志是我们最需要的文件.不管是在web,wi ...
- MYSQL5.6.X 非在线安装版(解压版)安装过程
一.卸载以前旧版本(本人5.5版本) 1.关闭MySQL服务 以管理员身份运行cmd,执行以下命令: net stop mysql 或者右键我的电脑,在管理——服务——停止MySQL 2.卸载MySQ ...
- SQL中的关联更新和关联删除
在SQL中,经常用到关联查询,比如select a.* from A a inner join B b on a.PId=b.FId where 条件,SQL中也支持类似的关联更新和关联删除. 关联更 ...
- C语言---变量与函数
一个C程序是由一个或多个程序模块组成的,每一个程序模块作为一个源程序文件,一个源程序文件是一个编译单元. 源程序文件分为库函数和用户自己定义的函数,以及有参函数.无参函数. 函数调用的过程: 1) 定 ...
- Python全栈-day12-day13-函数4
1.迭代器 1)定义:迭代取值的工具 2)优缺点 优点 a.提供一种不依赖索引取值的方法 b.同时一时刻内存在存在的值只有一个,更加省内存 缺点 a.取值麻烦,只能通过next方法一个一个地往后取 b ...
- php实现多进程
转:http://www.jb51.net/article/71238.htm cd php-version/ext/pcntl phpize ./configure && make ...
- python基础之可变数据类型与不可变数据类型
一.什么可变数据类型和不可变数据类型 可变数据类型:value值改变,id值不变:不可变数据类型:value值改变,id值也随之改变. 二.如何确定一种数据类型是可变的还是不可变的 根据可变数据类型与 ...
- 常用bash,autoUserAdd.sh
#!/bin/bash # auth: xiluhua # date: -- read -p "please input a username:" username [ -z $u ...