题面链接

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

#include<bits/stdc++.h>

#define LL long long
#define RG register using namespace std;
template<class T> inline void read(T &x) {
x = 0; RG char c = getchar(); bool f = 0;
while (c != '-' && (c < '0' || c > '9')) c = getchar(); if (c == '-') c = getchar(), f = 1;
while (c >= '0' && c <= '9') x = x*10+c-48, c = getchar();
x = f ? -x : x;
return ;
}
template<class T> inline void write(T x) {
if (!x) {putchar(48);return ;}
if (x < 0) x = -x, putchar('-');
int len = -1, z[20]; while (x > 0) z[++len] = x%10, x /= 10;
for (RG int i = len; i >= 0; i--) putchar(z[i]+48);return ;
}
const int N = 300010;
int n, m, a[N];
int f[21][N], g[21][N];
int query(int l, int r) {
int k = log2(r - l + 1);
if (f[k][l] >= f[k][r - (1 << k) + 1]) return g[k][l];
return g[k][r - (1 << k) + 1];
}
int L[N], R[N];
int suml[N], sumr[N];
int q[N];
int main() {
int type;
read(n), read(m), read(type);
for (int i = 1; i <= n; i++) read(a[i]), f[0][i] = a[i], g[0][i] = i;
for (int j = 1; j <= 20; j++)
for (int i = 1; i + (1 << j) - 1 <= n; i++)
if (f[j - 1][i] >= f[j - 1][i + (1 << (j - 1))]) {
f[j][i] = f[j - 1][i];
g[j][i] = g[j - 1][i];
}
else {
f[j][i] = f[j - 1][i + (1 << (j - 1))];
g[j][i] = g[j - 1][i + (1 << (j - 1))];
}
int top = 0;
for (int i = 1; i <= n; i++) {
while (top && a[q[top]] < a[i]) top--;
if (top && a[i] != a[q[top]]) L[i] = q[top];
q[++top] = i;
}
top = 0;
for (int i = n; i; i--) {
while (top && a[q[top]] < a[i]) top--;
if (top && a[i] != a[q[top]]) R[i] = q[top];
q[++top] = i;
} /*for (int i = 1; i <= n; i++)
printf("%d %d\n", L[i], R[i]);*/ for (int i = 1; i <= n; i++)
suml[L[i]]++, sumr[R[i]]++;
for (int i = 1; i <= n; i++)
suml[i] += suml[i - 1], sumr[i] += sumr[i - 1];
int lastans = 0;
while (m--) {
int x, y, l, r;
read(x), read(y);
if (type) l = (x + lastans - 1) % n + 1, r = (y + lastans - 1) % n + 1;
else l = x, r = y;
if (l > r) swap(l, r);
int pos = query(l, r);
lastans = suml[pos - 1] - suml[l - 1] + sumr[r] - sumr[pos] + r - l;
printf("%d\n", lastans);
}
return 0;
}

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. TWO PHASES OF ANGULAR 2 APPLICATIONS

    Angular 2 separates updating the application model and reflecting the state of the model in the view ...

  2. apicloud 和 微信小程序,你会用哪 个?

    微信 小程序开始火了,app跨平台的革命再次高涨,不得不说,不用再担心android和ios双版本开发成本,及h5的开发 和apicloud一样,不需要关注平台问题,只需要关注前端js.css就能大a ...

  3. FNDLOAD Commands to Download Different Seed Data Types. (DOC ID 274667.1)

    In this Document Goal Solution References Applies to: Oracle Application Object Library - Version 11 ...

  4. 【转载】45个设计师们不常见的html5和css3漂亮模板

    对于Web开发人员来说,当他们需要创建一个非常时尚和新潮的CSS3和HTML5网站时需要非常专业的水准.html5和css3的结合能够做出非同寻常的网站效果..所以,今天,我推荐给大家45个免费的时尚 ...

  5. Jenkins RestAPI调用出现Error 403 No valid crumb was included in the request

    方法一(不推荐): 在jenkins 的Configure Global Security下 , 取消“防止跨站点请求伪造(Prevent Cross Site Request Forgery exp ...

  6. pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.

    # 背景 安装pip后发现执行pip install pytest,提示下面错误 pip is configured with locations that require TLS/SSL, howe ...

  7. mysqldump的简单使用

    背景 需要搞mysql数据同步,从一台服务器把数据库同步到另外一台服务器上,如果折腾过的话,就知道有个这玩意--mysqldump,其实就是mysql自带的一个命令而已 操作步骤 1. 认识mysql ...

  8. oracle中的序列,可以解决自增各种编号自动增长问题,说一下我的小问题。

    1.生成0001-9999的编码 //在PL/sql中 创建一个序列 Create sequence seq_cdptIncrement by 1 --自增数Start with 1 --开始累加数M ...

  9. c#复习提纲

    c#零碎整理 注:本文中大部分图片来自老师的PPT,感谢邵老师!文中所有内容为自己按照PPT整理,欢迎指正! 标识符 标识符(类名.变量名.方法名.表空间名等) 大小写敏感 正则表达式  小括号(组合 ...

  10. cesium编程中级(一)添加示例到Sandcastle

    cesium编程中级(一)添加示例到Sandcastle 添加示例到Sandcastle在cesium编程入门(七)3D Tiles,模型旋转中提到过,这里是一份完整的说明 创建例子 开启node服务 ...