牛客87-B
时间:2021-08-21
本文章向大家介绍牛客87-B,主要包括牛客87-B使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
K小数查询
题目描述
给出长度为 n 的序列 \(a_1\), \(a_2\), ..., \(a_n\),有多少对整数(l,r),满足 r-l+1>=k且 \(a_l\), \(a_{l+1}\), ...,\(a_r\)中第 k 小的数是 x?
输入描述
- 第一行三个整数 n,x,k
- 第二行为\(a_1\), \(a_2\), ..., \(a_n\)
1 <= x,k <= n <= 200000,
\(a_1\), \(a_2\), ..., \(a_n\)为1,2,3...,n的一个排列
原题链接
Input
5 3 2
1 2 3 4 5
10 5 2
8 9 10 2 4 5 1 6 3 7
Output
3
3
解题思路
题目意思就是给出一个区间[l,r],让 x 为这个区间的第 k 小,求这样的区间有多少个。既然 x 是第 k 小,那么区间[l,r]一定要包含 x ,则可以分为三种情况。假设 x 是给出序列的第 dis 个元素(即\(a_{dis}\) = x)。
- l = dis时,有多少个 r 使得 \(a_{dis+1}\),\(a_{dis+2}\),...\(a_r\)中,有 k - 1 个元素小于 x
- 当 r = dis时,有多少个 l 使得 \(a_l\),\(a_{l+1}\),...\(a_{dis-1}\)中,有 k - 1个元素小于x
- 当 l < dis,r > dis 时,有多少对[l,r]使得,\(a_l\), \(a_{l+1}\),..., \(a_{dis-1}\)中,有 a 个元素小于x,\(a_{dis+1}\), \(a_{dis+2}\),..., \(a_r\)中,有 b 个元素小于 x
且 a + b == k - 1
我们可以开一个数组sum[N], sum[i]表示 [i,dis)(或(dis,i]),中有多少个元素小于 x
如图 n = 10,x = 5, k = 2
直接用sum数组进行计算的话会超时,所以我又开了两个数组 l_vis[],r_vis[]。 l_vis[i]储存 [1,dis),sum = [i]的个数,r_vis[i]储存(dis,n],sum = i的个数。ans += l_vis[i] * r_vis[k-1-i], i 从 0枚举到 k - 1即可,枚举完毕后,这个只是计算完了第三种情况,ans += l_vis[k-1] + r_vis[k-1],这样 1,2情况也包含在内了
AC代码
#include <iostream>
using namespace std;
const int N = 2e5 + 10;
int arr[N],sum[N],n,x,k,dis;
int l_vis[N],r_vis[N];
int main(){
long long ans = 0;
scanf("%d %d %d",&n,&x,&k);
for(int i = 1; i <= n; i++){
scanf("%d",&arr[i]);
if(arr[i] == x) dis = i;
}
for(int i = dis - 1; i >= 1; i--) sum[i] = sum[i+1] + (arr[i] < x);
for(int i = dis + 1; i <= n; i++) sum[i] = sum[i-1] + (arr[i] < x);
for(int i = 1; i < dis; i++) l_vis[sum[i]] ++;
for(int i = dis + 1; i <= n; i++) r_vis[sum[i]]++;
for(int i = 0; i < k; i++)
ans += l_vis[i] * r_vis[k-i-1];
ans += l_vis[k-1] + r_vis[k-1];
printf("%lld",ans);
return 0;
}
原文地址:https://www.cnblogs.com/paper-plane/p/15169215.html
- 使用shell批量生成数据整合式迁移的脚本(r8笔记第52天)
- Jdbc知识点全整理,你值得拥有 (1)
- SSD: Single Shot MultiBox Detector 深度学习笔记之SSD物体检测模型
- dg broker校验失败的一个奇怪问题(r8笔记第50天)
- golang 几种字符串的连接方式
- 整理ING
- dg broker校验失败的一个奇怪问题(二) (r8笔记第51天)
- Jdbc知识点全整理,你值得拥有 (2)
- 抓住“新代码”的影子 —— 基于GoAhead系列网络摄像头多个漏洞分析
- Python 用OPEN读文件报错 ,路径以及r
- python 如何设置多线程
- R语言读CSV、txt文件方式以及read.table read.csv 和readr(大数据读取包)
- python 多进程设置 整理版本1
- 11g Dataguard中的snapshot standby特性(r8笔记第49天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Redis的各种数据类型实践-ZSet
- Python 技术篇-将python项目打包成exe独立运行程序,pyinstaller库打包python代码
- Spring MVC 工作流程简介
- 8个尽量优化你的SQL
- 记一次 Kafka Producer 性能调优实战
- Kafka 独立消费者
- 【iOS】记录iOS14以及xcode12 遇到的问题
- 如果你还在犹豫要不要入行,请先看看我的IT入坑记【技术创作101训练营】
- Session、Cookie、Token 【浅谈三者之间的那点事】
- Python 微信机器人-20行代码实现斗图功能,简单易懂,全是干货!斗图啦API调用方法
- 浅谈布隆过滤器
- Python 技术篇-获取图片GPS信息,锁定追踪图片拍摄地点、拍摄时间
- 测试工具 - Postman接口测试入门使用手册,Postman如何进行数据关联、自动更新cookies、简单编程
- 白盒测试工具 - sonar的安装、配置与使用入门手册,用sonar检查代码质量实战演示
- Chmod -R 777 / 误操作恢复教程