题面链接

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. python多线程编程5: 条件变量同步-乾颐堂

    互斥锁是最简单的线程同步机制,Python提供的Condition对象提供了对复杂线程同步问题的支持.Condition被称为条件变量,除了提供与Lock类似的acquire和release方法外,还 ...

  2. MVC5数据库迁移命令!

    首先数据库迁移在上下文里设置要设置成为CreateDatabaseIfNotExists, 然后在Nuget控制平台输入命令 在“程序包管理器控制台”窗口中输入:Enable-Migrations   ...

  3. C#进阶系列——WebApi 异常处理解决方案(转)

    出处:http://www.cnblogs.com/landeanfen/p/5363846.html 阅读目录 一.使用异常筛选器捕获所有异常 二.HttpResponseException自定义异 ...

  4. Hdu1547 Bubble Shooter 2017-01-20 18:38 44人阅读 评论(0) 收藏

    Bubble Shooter Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Tota ...

  5. [Erlang26]怎么通过beam文件得到所有的record或源代码?

    怎么通过beam文件得到所有的record或源代码?   1. 首先必须要在compile里面加上debug_info信息: 1 > c(load,[debug_info]). {ok,load ...

  6. Solr 使用自定义 Query Parser(短语查询,精准查询)

    原文出处:http://blog.chenlb.com/2010/08/solr-use-custom-query-parser.html 由于 Solr 默认的 Query Parser 生成的 Q ...

  7. C# 多线程task

    1.异步和多线程的区别?没什么太大区别.异步是目的,使用多线程实现.想想AJAX异步加载,不就是不想让浏览器界面卡住嘛,所以在程序中对于某些单独的操作,比如写日志,我们不想等它完成后再执行其它操作(因 ...

  8. java.lang.IllegalArgumentException: No converter found for return value of type: class com.smart.result.Page

    今天学习了一下spring boot 中的mybatis,用mybatis来增删改查用户,获取用户,添加用户,修改用户,删除用户,修改用户,都是可以的,但是获取带分页的用户列表,一直抛出这个java. ...

  9. Java : java.util.ConcurrentModificationException

    在删除 List 元素的时候,要用 Iterator,不要直接遍历 List,否则会出现 Fatal Exception: java.util.ConcurrentModificationExcept ...

  10. Exp5 MSF基础应用 20164323段钊阳

    网络对抗技术 20164323 Exp5 MSF基础应用 靶机 ip:192.168.1.229 kali ip:192.168.1.216 exploit选取 主动攻击:ms17_010_psexe ...