题面链接

bzoj

题解

非常巧妙的一道题

类似[hnoi影魔]

每个点会给左右第一个大于它的点对产生贡献

可以用单调栈求出

这里有点小细节,就是处理相等的点时,最左边的点管左边的贡献,最右边的点管最右边的贡献

然后对于每个点,求出了一对\(x, y\)

那么,对于询问区间\(l,r\)

答案就是有多少个\(x,y\)在区间\(l,r\)之间, 即\(l<=x<=r\) && \(l<=y<=r\)

再加上相邻的点对

这就可以用二维数点做

但是有没有更优秀的做法呢?

我们设\(a[pos]\)为区间\([l,r]\)之间最大的数

那么\(x\)在\([l,pos-1]\)之间的点对,\(y\)一定不会越过\(pos\)

那么只要求出\([l,pos-1]\)之间有多少\(x\),就可以求出有多少点对\((x,y)\)在\([l,pos-1]\)

同理另一半也可以求出

那么,前缀和就可以解决问题了

Code

  1. #include<bits/stdc++.h>
  2. #define LL long long
  3. #define RG register
  4. using namespace std;
  5. template<class T> inline void read(T &x) {
  6. x = 0; RG char c = getchar(); bool f = 0;
  7. while (c != '-' && (c < '0' || c > '9')) c = getchar(); if (c == '-') c = getchar(), f = 1;
  8. while (c >= '0' && c <= '9') x = x*10+c-48, c = getchar();
  9. x = f ? -x : x;
  10. return ;
  11. }
  12. template<class T> inline void write(T x) {
  13. if (!x) {putchar(48);return ;}
  14. if (x < 0) x = -x, putchar('-');
  15. int len = -1, z[20]; while (x > 0) z[++len] = x%10, x /= 10;
  16. for (RG int i = len; i >= 0; i--) putchar(z[i]+48);return ;
  17. }
  18. const int N = 300010;
  19. int n, m, a[N];
  20. int f[21][N], g[21][N];
  21. int query(int l, int r) {
  22. int k = log2(r - l + 1);
  23. if (f[k][l] >= f[k][r - (1 << k) + 1]) return g[k][l];
  24. return g[k][r - (1 << k) + 1];
  25. }
  26. int L[N], R[N];
  27. int suml[N], sumr[N];
  28. int q[N];
  29. int main() {
  30. int type;
  31. read(n), read(m), read(type);
  32. for (int i = 1; i <= n; i++) read(a[i]), f[0][i] = a[i], g[0][i] = i;
  33. for (int j = 1; j <= 20; j++)
  34. for (int i = 1; i + (1 << j) - 1 <= n; i++)
  35. if (f[j - 1][i] >= f[j - 1][i + (1 << (j - 1))]) {
  36. f[j][i] = f[j - 1][i];
  37. g[j][i] = g[j - 1][i];
  38. }
  39. else {
  40. f[j][i] = f[j - 1][i + (1 << (j - 1))];
  41. g[j][i] = g[j - 1][i + (1 << (j - 1))];
  42. }
  43. int top = 0;
  44. for (int i = 1; i <= n; i++) {
  45. while (top && a[q[top]] < a[i]) top--;
  46. if (top && a[i] != a[q[top]]) L[i] = q[top];
  47. q[++top] = i;
  48. }
  49. top = 0;
  50. for (int i = n; i; i--) {
  51. while (top && a[q[top]] < a[i]) top--;
  52. if (top && a[i] != a[q[top]]) R[i] = q[top];
  53. q[++top] = i;
  54. }
  55. /*for (int i = 1; i <= n; i++)
  56. printf("%d %d\n", L[i], R[i]);*/
  57. for (int i = 1; i <= n; i++)
  58. suml[L[i]]++, sumr[R[i]]++;
  59. for (int i = 1; i <= n; i++)
  60. suml[i] += suml[i - 1], sumr[i] += sumr[i - 1];
  61. int lastans = 0;
  62. while (m--) {
  63. int x, y, l, r;
  64. read(x), read(y);
  65. if (type) l = (x + lastans - 1) % n + 1, r = (y + lastans - 1) % n + 1;
  66. else l = x, r = y;
  67. if (l > r) swap(l, r);
  68. int pos = query(l, r);
  69. lastans = suml[pos - 1] - suml[l - 1] + sumr[r] - sumr[pos] + r - l;
  70. printf("%d\n", lastans);
  71. }
  72. return 0;
  73. }

bzoj3956: Count (单调栈+st表)的更多相关文章

  1. Max answer(单调栈+ST表)

    Max answer https://nanti.jisuanke.com/t/38228 Alice has a magic array. She suggests that the value o ...

  2. BZOJ3879:SvT(后缀数组,单调栈,ST表)

    Description (我并不想告诉你题目名字是什么鬼) 有一个长度为n的仅包含小写字母的字符串S,下标范围为[1,n]. 现在有若干组询问,对于每一个询问,我们给出若干个后缀(以其在S中出现的起始 ...

  3. BZOJ4199 [Noi2015]品酒大会 【后缀数组 + 单调栈 + ST表】

    题目 一年一度的"幻影阁夏日品酒大会"隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发"首席品 酒家"和"首席猎手"两个奖项,吸 ...

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

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

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

  6. P6087 [JSOI2015]送礼物 01分数规划+单调队列+ST表

    P6087 [JSOI2015]送礼物 01分数规划+单调队列+ST表 题目背景 \(JYY\) 和 \(CX\) 的结婚纪念日即将到来,\(JYY\) 来到萌萌开的礼品店选购纪念礼物. 萌萌的礼品店 ...

  7. 【bzoj3956】Count 单调栈+可持久化线段树

    题目描述 输入 输出 样例输入 3 2 0 2 1 2 1 1 1 3 样例输出 0 3 题解 单调栈+可持久化线段树 本题是 bzoj4826 的弱化版(我为什么做题总喜欢先挑难的做QAQ) $k$ ...

  8. POJ1821 单调队列//ST表 优化dp

    http://poj.org/problem?id=1821 当我们在考虑内层循环j以及决策k的时候,我们可以把外层变量i看作定值,以此来优化dp状态转移方程. 题意 有n个工人准备铺m个连续的墙,每 ...

  9. HDU 4123 Bob's Race:树的直径 + 单调队列 + st表

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4123 题意: 给你一棵树,n个节点,每条边有长度. 然后有m个询问,每个询问给定一个q值. 设dis[ ...

随机推荐

  1. 用 Open Live Writer 来写 cnblog.com 博客

    Open Live Writer来源 Windows Live Writer在2012年就停止了更新,Open Live Writer是由Windows Live WriterWriter更名而来,是 ...

  2. 静态HTML服务器

    主要代码 #pragma once#include "pre.h"#include <thread> NAMESPACE(DEF) class Socket {publ ...

  3. JavaScript 语法总结2

    1. 对象的toString()和valueOf(). - toString() 和Java中的toString() 一样 - valueOf(), 和toString() 都是用来进行类型转换的方法 ...

  4. golang C相互调用带参数

    test.h #ifndef __TEST_H__ #define __TEST_H__ void SetFunc(char* str); extern void InternalFunc(char* ...

  5. JSTL 标签库<转>

    http://elf8848.iteye.com/blog/245559 JSTL标签库,是日常开发经常使用的,也是众多标签中性能最好的.把常用的内容,放在这里备份一份,随用随查.尽量做到不用查,就可 ...

  6. (转)【经验之谈】Git使用之Windows环境下配置

    原文地址:http://www.cnblogs.com/xishuai/p/3590434.html 前言 安装 配置 关于git使用的几个问题 后记 关于代码托管,以前用过vss和svn,看博客或论 ...

  7. Appium之启用手机桌面APP的多种方法

    方法一: 其实之前的随笔 Appium之连续启动多个应用(APP)中已经介绍了可以用appium下的start_activity()方法来启动一个应用,那这里就不再说明啦. 方法二: 因为有时用sta ...

  8. tomcat mac

    在mac上安装tomcat,教程很不错:http://blog.csdn.net/j2ee_me/article/details/7928493 注意 1.要下载二进制文件,core, 2.解压后移动 ...

  9. [Erlang20]一起攻克Binary

    第一次看到Joe Armstong的<Erlang 程序设计>里面对Binary的描述时,觉得这个东西好复杂,语法这么奇特(我觉得是Erlang语法中最不好懂的部分); 然后在项目中:Bi ...

  10. Devexpress Tab Control 文档

    https://documentation.devexpress.com/WPF/8078/Controls-and-Libraries/Layout-Management/Tab-Control/P ...