题目传送门

  传送点I

  传送点II

题目大意

  给定一个长度为$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 - 单调栈的更多相关文章

  1. BZOJ 3809 Gty的二逼妹子序列 莫队算法+分块

    Description Autumn和Bakser又在研究Gty的妹子序列了!但他们遇到了一个难题. 对于一段妹子们,他们想让你帮忙求出这之内美丽度∈[a,b]的妹子的美丽度的种类数. 为了方便,我们 ...

  2. BZOJ 3236 AHOI 2013 作业 莫队算法

    题目大意:给出一些数,问在一个区间中不同的数值有多少种,和在一个区间中不同的数值有多少个. 思路:因为没有改动,所以就想到了莫队算法.然后我写了5K+的曼哈顿距离最小生成树,然后果断T了.(100s的 ...

  3. BZOJ 3289: Mato的文件管理[莫队算法 树状数组]

    3289: Mato的文件管理 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 2399  Solved: 988[Submit][Status][Di ...

  4. [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 ...

  5. 【BZOJ4540】[Hnoi2016]序列 莫队算法+单调栈

    [BZOJ4540][Hnoi2016]序列 Description 给定长度为n的序列:a1,a2,…,an,记为a[1:n].类似地,a[l:r](1≤l≤r≤N)是指序列:al,al+1,…,a ...

  6. bzoj 5301: [Cqoi2018]异或序列 (莫队算法)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=5301 题面; 5301: [Cqoi2018]异或序列 Time Limit: 10 Sec ...

  7. bzoj 3757 苹果树(树上莫队算法)

    [题意] 有若干个询问,询问路径u,v上的颜色总数,另外有要求a,b,意为将a颜色看作b颜色. [思路] vfk真是神系列233. Quote: 用S(v, u)代表 v到u的路径上的结点的集合. 用 ...

  8. BZOJ 4540 [Hnoi2016]序列 (单调栈 + ST表 + 莫队算法)

    题目链接  BZOJ4540 考虑莫队算法. 这题难在$[l, r]$到$[l, r+1]$的转移. 根据莫队算法的原理,这个时候答案应该加上 $cal(l, r+1) + cal(l+1, r+1) ...

  9. bzoj 3809 Gty的二逼妹子序列(莫队算法,块状链表)

    [题意] 回答若干个询问,(l,r,a,b):区间[l,r]内权值在[a,b]的数有多少[种]. [思路] 考虑使用块状链表实现莫队算法中的插入与删除. 因为权值处于1..n之间,所以我们可以建一个基 ...

随机推荐

  1. xml文档对象模型doc

    对与DOM来说 ,一切都是节点Node; ②Document可以看成一个节点,Element可以看成一个节点,Text可以看成一个节点, 封装出来的对象都可以看成节点Node; ③在JDK中,Node ...

  2. node.js初识05

    小项目,需求,通过url来查询学生学号和老师的编号 05.js var http = require("http"); var server = http.createServer ...

  3. Ajax技术之使用XMLHttpRequest对象(一)【初始化XMLHttpRequest对象】

    在初始化XMLHttpRequest对象时要考虑两种情况,一种是IE浏览器,另一种是非IE浏览器.在IE浏览器中要把XMLHttpRequest实例化一个ActiveX对象 http_request ...

  4. Docker日志

    搜索Redis镜像 docker search redis ***************************** 拉取Redis镜像 docker pull redis ************ ...

  5. 4.GDscript(2)关键字,运算符,字面量

    (来源godot官方文档) 关键词 下面是该语言支持的关键字列表.由于关键字是保留字(令牌),它们不能用作标识符.操作符(如 in , not , and 或 or )以及下面列出的内置类型的名称也是 ...

  6. html5-边框属性

    width: 500px;    height: 300px;    background: rgb(122,30,60);    border: 10px solid black;    /*bor ...

  7. Sitecore CMS中如何命名项目名称

    如何在Sitecore CMS中命名项目,以及配置命名限制,“显示名称”是什么以及如何使用它. 任何其他名称的项目 当创建Sitecore的项目,内容编辑器要求制作者为新建项目提供名称.输入的名称将其 ...

  8. tetrahedron (公式)

    我是直接搬运了某大佬的代码,毕竟我不清楚如何计算这个东西. 其中四点共面的求法就是体积为0,然后圆心和半径就公式了. #include<cstdio> #include<iostre ...

  9. base_review

    简述Python的字符串驻留机制. - 字符串驻留是一种仅保存一份相同且不可变字符串的方法. - 原理 - 系统维护interned字典,记录已被驻留的字符串对象. - 当字符串对象a需要驻留时,先在 ...

  10. WEB前端移动开发初始化

    meta篇 1.视窗宽度 <meta name="viewport" content="width=device-width,initial-scale=1.0,m ...