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之间,所以我们可以建一个基 ...
随机推荐
- java随机排座位
//打乱学生顺序 Collections.shuffle(); 容我记个单词 peer: vi.凝视; 盯着看; 隐退,若隐若现; 同等,比得上;n.同辈,同等的人; 贵族; 同伴,伙伴;adj.贵族 ...
- MyBatis基础入门《十》添加数据
MyBatis基础入门<十>添加数据 描述: 修改了实体类:TblClient.java,将其字段:cbirthday 由String类型改成了Date类型. TblClient.java ...
- fiddler2抓包数据工具使用教程
一款免费且功能强大的数据包抓取软件.它通过代理的方式获取程序http通讯的数据,可以用其检测网页和服务器的交互情况,能够记录所有客户端和服务器间的http请求,支持监视.设置断点.甚至修改输入输出数据 ...
- spark sql01
package sql; import org.apache.spark.SparkConf; import org.apache.spark.api.java.JavaSparkContext; i ...
- table 的rolspan和rowspan
如图所示啦,容易让初学者混乱的两个东西仔细看看分析下呢,就比较简单了 <table width="300" border="2"> <tr&g ...
- yii2 modules模块配置指南
在Yii2 中模块是可以无限级嵌套的,也就是说,模块可以包含另一个包含模块的模块,我们称前者为父模块,后者为子模块, 子模块必须在父模块的yiibaseModule::modules属性中申明,例如: ...
- 20155228 2016-2017-2 《Java程序设计》第6周学习总结
20155228 2016-2017-2 <Java程序设计>第6周学习总结 教材学习内容总结 输入与输出 在Java中输入串流代表对象为java.io.InputStream实例,输出串 ...
- DB2的空间数据库管理复杂配置
计算机条件: a机器:linux系统 安装arcgis server b机器:windows系统 安装catalog c机器:linux系统 安装DB2 ...
- urlopen和urlretrieve
import urllib import re url = "https://www.duitang.com/search/?kw=%E9%AC%BC%E6%80%AA&type=f ...
- Linux系统管理和维护常用命令
Linux系统管理和维护常用命令 ls 命令 功能说明 ls 命令显示指定工作目录下的内容,列出工作目录所包含的文件及子目录. 语法结构: ls [选项] [路径或文件] ls 选项及说明 -a 显示 ...