统计(statistic)(二分查找+离散化)
题目
题目传送门
给定 nnn个数,有mmm个询问。每次询问, AliceAliceAlice 想知道区间内[l,r][l,r][l,r]内是否出现过xix_ixi这个数。
题解
- 这是模拟赛的一道题,当时考场上写的莫队(显然莫队 然而写挂了qwq只有30pts30pts30pts还不如我写n2暴力
- 考完试想了想,想到了更优秀的解法,把复杂度降到了nlognnlognnlogn 为什么考试的时候想不到qwq
- 首先数据范围非常的大,我们考虑离散化然而考试忘了lower_bound咋用也懒得写二分,写了个map导致T到飞起,那么离散化的套路为:排序+去重+二分查找,具体可以*度一下
- 离散化以后我们需要查找l,rl,rl,r中valvalval是否出现
- 首先我们可以将valvalval离散化得到xxx,xxx可以理解为在去重后的AAA数组的排名,而对于AAA数组来说,每一排名有唯一对应的值,如果A[x]≠valA[x]=\not valA[x]≠val,则说明valvalval跟本没有在原系列中出现,所以直接输出000即可
- 然后我们可以开一个vector[i]vector[i]vector[i]表示离散化以后值为iii的数字在原系列中出现的位置。
- 我们在纸上模拟一下:
对于序列a={1,2,4,2,4,3}a= \{ 1,2,4,2,4,3 \}a={1,2,4,2,4,3},我们想要查找[2,4][2,4][2,4]区间中444出现了几次,444出现的位置为{3,5}\{3,5\}{3,5},我们在他出现的位置的集合(显然是单调递增的)二分查找第一个大于等于l(2)l(2)l(2)的数字,得到333它的下标为lx=0lx = 0lx=0,然后我们再二分查找最后一个小于等于r(4)r(4)r(4)的数字,得到333下标为rx=0rx = 0rx=0,这个例子举的不是很好qwq,但是我太懒了qaq大家还是自己再模拟一下把,然后我们将两个下标rx,lxrx,lxrx,lx相减再加一就可以得出数字的出现次数了。 - 这道题分块莫队好像都可以写,但是我都不会qaq
- n,m打反导致调了俩小时我怕不是个zz,OI不需要视力???
codecodecode
#include <bits/stdc++.h>
using namespace std;
#define maxn 101000template <typename T>
inline void read(T &s) {s = 0; T w = 1, ch = getchar(); while (!isdigit(ch)) { if (ch == '-') w = -1; ch = getchar(); }while (isdigit(ch)) { s = (s << 1) + (s << 3) + (ch ^ 48); ch = getchar(); }s *= w;
}int _n, n, m;
int _a[maxn], a[maxn];
vector<int> pos[maxn]; int query(int x) { return lower_bound(_a + 1, _a + _n + 1, x) - _a; }void init() {read(n); for (int i = 1; i <= n; ++i) read(a[i]), _a[i] = a[i]; sort(_a + 1, _a + n + 1); _n = unique(_a + 1, _a + n + 1) - _a - 1;
}int find_r(int opt, int p) {int l = 0, r = pos[opt].size() - 1; while (l <= r) {int mid = (l + r) >> 1; if (pos[opt][mid] <= p) l = mid + 1; else r = mid - 1; }return r;
}int find_l(int opt, int p) {int l = 0, r = pos[opt].size() - 1; while (l <= r) {int mid = (l + r) >> 1; if (pos[opt][mid] >= p) r = mid - 1; else l = mid + 1; }return l;
}int main() {init(); for (int i = 1; i <= n; ++i) {int x = query(a[i]); pos[x].push_back(i);}read(m); for (int i = 1; i <= m; ++i) {int l, r, val; read(l), read(r), read(val); int x = query(val); if (_a[x] != val) putchar('0'); else {int lx = find_l(x, l); int rx = find_r(x, r); int ans = rx - lx + 1; if (ans > 0) putchar('1'); else putchar('0'); }}return 0;
}
统计(statistic)(二分查找+离散化)相关推荐
- 离散化+unique()+二分查找
离散化 引自百度百科 离散化,把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率. 通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小.例如: 原数据:1,999,1 ...
- leetcode1351. 统计有序矩阵中的负数(二分查找)
给你一个 m * n 的矩阵 grid,矩阵中的元素无论是按行还是按列,都以非递增顺序排列. 请你统计并返回 grid 中 负数 的数目. 示例 1: 输入:grid = [[4,3,2,-1],[3 ...
- LeetCode 2302. 统计得分小于 K 的子数组数目(前缀和+二分查找)
文章目录 1. 题目 2. 解题 1. 题目 一个数组的 分数 定义为数组之和 乘以 数组的长度. 比方说,[1, 2, 3, 4, 5] 的分数为 (1 + 2 + 3 + 4 + 5) * 5 = ...
- javascript数据结构与算法---检索算法(二分查找法、计算重复次数)
javascript数据结构与算法---检索算法(二分查找法.计算重复次数) /*只需要查找元素是否存在数组,可以先将数组排序,再使用二分查找法*/ function qSort(arr){if (a ...
- POJ_3685_Matrix_(二分,查找第k大的值)
描述 http://poj.org/problem?id=3685 一个n*n的矩阵,(i,j)的值为i*i+100000*i+j*j-100000*j+i*j,求第m小的值. Matrix Time ...
- 数据结构源码笔记(C语言):二分查找
//实现二分查找的算法#include<stdio.h> #include<malloc.h> #include<malloc.h>#define MAXL 100 ...
- 动态数组,数组初始化,数组内存释放,向数组中添加一个元素,向数组中添加多个元素,数组打印,顺序查找,二分查找,查找数组并返回地址,冒泡排序,改变数组中某个元素的值,删除一个数值,删除所有,查找含有
1定义接口: Num.h #ifndef_NUM_H_ #define_NUM_H_ #include<stdio.h> #include<stdlib.h> /**** ...
- ad09只在一定范围内查找相似对象_kafka日志段中的二分查找
二分查找 Kafka 中直接接触索引或索引文件的场景可能不是很多.索引是一个很神秘的组件,Kafka 官方文档也没有怎么提过它.索引这个组件的源码还有一个亮点,那就是它应用了耳熟能详的二分查找算法来快 ...
- [算法总结] 二分查找
本文首发于我的个人博客:尾尾部落 二分查找法作为一种常见的查找方法,将原本是线性时间提升到了对数时间范围,大大缩短了搜索时间,但它有一个前提,就是必须在有序数据中进行查找. 二分查找很好写,却很难写对 ...
- ssl1125-集合【哈希表二分查找+快排】
前言 今天学哈希表,然后就第一节晚修赶快写完作业就上了做题了,然后就做完了这道题get√. 正题 题目 给出两个集合: A是B的一个真子集,输出"A is a proper subset o ...
最新文章
- Windows下编译TensorFlow1.3 C++ library及创建一个简单的TensorFlow C++程序
- 用c语言输出数组中最小值,C语言.由键盘输入10个整数存入数组,输出最大值、最小值及它们的位置信息.并将最大、最小值位置互换后,再...
- 定义结构体的时候,里面的变量可以同时初始化吗?(不可以)
- ServerBootstrap的启动流程
- 2021高考成绩微信查询方法6,2021年高考成绩查询时间、入口及方法
- python一对一_Python - Django - ORM 一对一表结构
- 第三方框架-纯代码布局:Masonry的简单使用
- 【原创】Bug管理操作规范个人经验总结
- java queue代码_java代码实现顺序队列
- 策划运营分会场:巴别时代 CEO--放开偏执,拥抱变革
- linux ALSA 驱动架构
- cad绘制正八边形_什么是CAD?为什么要学CAD?该怎么学CAD?
- 输入一行字符,以回车符作为输入结束的标志。统计其中英文字母、数字字符和其他字符的个数。
- 电脑计算机桌面什么安装,一般的软件是怎样安装到电脑桌面上的?
- 在linux下设置php效劳器Apache2.2.3 mysql5.0.22 php5.2.0(2)
- Oracle 导出数据库(不积跬步,无以至千里)
- LeetCode 21. 合并两个有序链表(链表)
- 论文文献引用规范和标准(国标GBT7714)@endnote国标样式@citation交叉引用编号
- 为什么都说做猎头很累?
- 毫安时,毫瓦时的含义
热门文章
- pyecharts绘制地图(Geo and Map)(细节更丰富)
- 计算机基础中图文混排的重要性,浅谈项目教学在技校计算机应用基础中的应用.doc...
- 大家谈之《区块链大革命》
- MySQL大略学习(二) 表格的操作 增删查改
- php解析bt,php读取BT文件信息lightbenc.php库使用说明
- mysql 无法启动 0xc000007b,windows安装mysql5.7教程 (MSVCR120.dll丢失。应用程序无法正常启动0xc000007b)...
- 激光雷达在无人驾驶应用中如何应对雨雾灰尘环境及经典案例分析
- 服务器server2012重置开机密码
- UFS UIC Layer: MIPI UNIPRO
- 苹果支持WebRTC