牛客多校第五场 K King of Range
题意:
给定一个\(n\)个数得序列\(a_i\),给定\(m\)个询问,每次给出一个\(k\),寻找有多少个区间\([l, r]\)中最大值与最小值之差严格大于\(k\)。
思路:
可以发现,如果已经知道一个区间最大值与最小值严格大于k之后,那么我们便可以往从两头这个区间随意加数并且会对答案有贡献:
如果加一个比最大值大的或者比最小值小的数,那么这个区间差值还是严格大于\(k\);
如果加一个介于最大值最小值之间的数,那么这个区间差值不会发生变化。
那么发现这一点之后便可以使用双指针寻找区间了,那么怎么维护区间最值呢(比赛的时候想到了用双指针但没想到怎么维护最值),\(ST\)表就派上用场了,那么我们固定一个\(i\),让\(j\)去寻找即可,找到第一个合适的区间就可以停下了,那么j往后的所有数都可以加到这个区间中而对答案产生贡献就是\(n - j + 1\)。
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1E5 + 10, M = 18;
int n, m, k;
int w[N];
int f1[N][M], f2[N][M];
int lg[N];
void init() {
for (int j = 0; j < M; j++) {
for (int i = 1; i + (1 << j) - 1 <= n; i++) {
if (!j) f1[i][j] = w[i], f2[i][j] = w[i];
else {
f1[i][j] = max(f1[i][j - 1], f1[i + (1 << j - 1)][j - 1]);
f2[i][j] = min(f2[i][j - 1], f2[i + (1 << j - 1)][j - 1]);
}
}
}
}
bool check(int l, int r, int k) {
int len = r - l + 1;
int d = lg[len];
int maxD = max(f1[l][d], f1[r - (1 << d) + 1][d]);
int minD = min(f2[l][d], f2[r - (1 << d) + 1][d]);
return maxD - minD > k;
}
int main() {
//ios::sync_with_stdio(false); cin.tie(0);
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) scanf("%d", &w[i]);
lg[2] = 1;
for(int i=3;i<=n;i++) {
lg[i] = lg[i / 2] + 1;
}
init();
while (m--) {
long long res = 0;
int k; scanf("%d", &k);
for (int l = 1, r = 1; l <= n; l++) {
while (!check(l, r, k) && r <= n && l <= r) r++;
if (r <= n) res += n - r + 1;
}
printf("%lld\n", res);
}
return 0;
}
值得一提的是,用库函数\(log\)函数的效率有点不行,会被卡,所以还是乖乖预处理一个\(log\)数组吧。
牛客多校第五场 K King of Range的更多相关文章
- 2020牛客多校第八场K题
__int128(例题:2020牛客多校第八场K题) 题意: 有n道菜,第i道菜的利润为\(a_i\),且有\(b_i\)盘.你要按照下列要求给顾客上菜. 1.每位顾客至少有一道菜 2.给顾客上菜时, ...
- 牛客多校第五场-D-inv
链接:https://www.nowcoder.com/acm/contest/143/D来源:牛客网 题目描述 Kanade has an even number n and a permutati ...
- 牛客多校第五场 F take
链接:https://www.nowcoder.com/acm/contest/143/F来源:牛客网 题目描述 Kanade has n boxes , the i-th box has p[i] ...
- 牛客多校第五场 J:Plan
链接:https://www.nowcoder.com/acm/contest/143/J 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...
- 牛客多校第五场 F take 期望转化成单独事件概率(模板) 树状数组
链接:https://www.nowcoder.com/acm/contest/143/F来源:牛客网 Kanade has n boxes , the i-th box has p[i] proba ...
- 牛客多校第五场 E room 二分图匹配 KM算法模板
链接:https://www.nowcoder.com/acm/contest/143/E来源:牛客网 Nowcoder University has 4n students and n dormit ...
- 字符串dp——牛客多校第五场G
比赛的时候脑瘫了没想出来..打多校以来最自闭的一场 显然从s中选择大于m个数组成的数必然比t大,所以只要dp求出从s中选择m个数大于t的方案数 官方题解是反着往前推,想了下反着推的确简单,因为高位的数 ...
- 【魔改】树状数组 牛客多校第五场I vcd 几何+阅读理解
https://www.nowcoder.com/acm/contest/143/I vc-dimension 题解:分三种情况,组合数学算一下,其中一种要用树状数组维护 技巧(来自UESTC):1. ...
- 2018牛客多校第五场 H.subseq
题意: 给出a数组的排列.求出字典序第k小的b数组的排列,满足1<=bi<=n,bi<bi+1,a[b[i]]<a[b[i+1]],m>0. 题解: 用树状数组倒着求出以 ...
- 2018牛客多校第五场 E.room
题意: 一共有n个宿舍,每个宿舍有4个人.给出第一年的人员分布和第二年的人员分布,问至少有多少人需要移动. 题解: 对于第一年的每个宿舍,向今年的每种组合连边.流量为1,费用为(4 - 组合中已在该宿 ...
随机推荐
- C/C++八大排序
排序 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 按照难易程度排序,八大排序算法可以从简单到复杂 ...
- 用 Tensorflow.js 做了一个动漫分类的功能(一)
前言: 浏览某乎网站时发现了一个分享各种图片的博主,于是我顺手就保存了一些.但是一张一张的保存实在太麻烦了,于是我就想要某虫的手段来处理.这样保存的确是很快,但是他不识图片内容,最近又看了 mobil ...
- C++多线程中互斥量的使用
多线程中互斥信号量(Mutex)的使用 1.0 互斥量的基本概念 1.1 Example \(\quad\)首先我们要明白,为什么会有互斥信号量的出现,在多线程编程中,不同的线程之间往往要对同一个数据 ...
- Cesium Billboard加载Gif图片
https://blog.csdn.net/xietao20/article/details/109404491
- Linux下apt与dpkg的详解
apt是一个包管理工具,用于管理Debian和Ubuntu等基于Debian的Linux发行版中的软件包.它是"Advanced Packaging Tool"的缩写,允许用户在系 ...
- [jmeter]简介与安装
简介 JMeter是开源软件Apache基金会下的一个性能测试工具,用来测试部署在服务器端的应用程序的性能. 安装 安装jmeter 从 官网 下载jmeter的压缩包 安装jdk并配置 JAVA_H ...
- python如何提取浏览器中保存的网站登录用户名密码
python如何提取Chrome中的保存的网站登录用户名密码? 很多浏览器都贴心地提供了保存用户密码功能,用户一旦开启,就不需要每次都输入用户名.密码,非常方便.作为python脚本,能否拿到用户提前 ...
- 有Root与无Root安装git-lfs
有Root与无Root安装git-lfs 直接安装 先查看arm还是AMD 例如当前使用Rocky Linux 8.8版本的内核.因此,应该下载适用于Rocky Linux 8.x的Git LFS安装 ...
- Netease研发实习生一面
最想去的公司和部门..今天终于面了,感觉跪了..实质性的问题的确打得不好..庆幸的是拿到了B公司的offer,实习是不愁了.. 记下问题,希望对之后的同学有一定帮助. 问的问题总结: 1.进程线程协程 ...
- @Validated指定校验顺序
在Java中,使用@NotNull注解时,可以指定多个参数的顺序.为了指定顺序,你可以使用@GroupSequence注解. 首先,为每个需要校验的参数定义一个接口,并在接口上添加@GroupSequ ...