题目

题目传送门

给定 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)(二分查找+离散化)相关推荐

  1. 离散化+unique()+二分查找

    离散化 引自百度百科 离散化,把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率. 通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小.例如: 原数据:1,999,1 ...

  2. leetcode1351. 统计有序矩阵中的负数(二分查找)

    给你一个 m * n 的矩阵 grid,矩阵中的元素无论是按行还是按列,都以非递增顺序排列. 请你统计并返回 grid 中 负数 的数目. 示例 1: 输入:grid = [[4,3,2,-1],[3 ...

  3. LeetCode 2302. 统计得分小于 K 的子数组数目(前缀和+二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 一个数组的 分数 定义为数组之和 乘以 数组的长度. 比方说,[1, 2, 3, 4, 5] 的分数为 (1 + 2 + 3 + 4 + 5) * 5 = ...

  4. javascript数据结构与算法---检索算法(二分查找法、计算重复次数)

    javascript数据结构与算法---检索算法(二分查找法.计算重复次数) /*只需要查找元素是否存在数组,可以先将数组排序,再使用二分查找法*/ function qSort(arr){if (a ...

  5. 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 ...

  6. 数据结构源码笔记(C语言):二分查找

    //实现二分查找的算法#include<stdio.h> #include<malloc.h> #include<malloc.h>#define MAXL 100 ...

  7. 动态数组,数组初始化,数组内存释放,向数组中添加一个元素,向数组中添加多个元素,数组打印,顺序查找,二分查找,查找数组并返回地址,冒泡排序,改变数组中某个元素的值,删除一个数值,删除所有,查找含有

     1定义接口: Num.h #ifndef_NUM_H_ #define_NUM_H_ #include<stdio.h> #include<stdlib.h> /**** ...

  8. ad09只在一定范围内查找相似对象_kafka日志段中的二分查找

    二分查找 Kafka 中直接接触索引或索引文件的场景可能不是很多.索引是一个很神秘的组件,Kafka 官方文档也没有怎么提过它.索引这个组件的源码还有一个亮点,那就是它应用了耳熟能详的二分查找算法来快 ...

  9. [算法总结] 二分查找

    本文首发于我的个人博客:尾尾部落 二分查找法作为一种常见的查找方法,将原本是线性时间提升到了对数时间范围,大大缩短了搜索时间,但它有一个前提,就是必须在有序数据中进行查找. 二分查找很好写,却很难写对 ...

  10. ssl1125-集合【哈希表二分查找+快排】

    前言 今天学哈希表,然后就第一节晚修赶快写完作业就上了做题了,然后就做完了这道题get√. 正题 题目 给出两个集合: A是B的一个真子集,输出"A is a proper subset o ...

最新文章

  1. Windows下编译TensorFlow1.3 C++ library及创建一个简单的TensorFlow C++程序
  2. 用c语言输出数组中最小值,C语言.由键盘输入10个整数存入数组,输出最大值、最小值及它们的位置信息.并将最大、最小值位置互换后,再...
  3. 定义结构体的时候,里面的变量可以同时初始化吗?(不可以)
  4. ServerBootstrap的启动流程
  5. 2021高考成绩微信查询方法6,2021年高考成绩查询时间、入口及方法
  6. python一对一_Python - Django - ORM 一对一表结构
  7. 第三方框架-纯代码布局:Masonry的简单使用
  8. 【原创】Bug管理操作规范个人经验总结
  9. java queue代码_java代码实现顺序队列
  10. 策划运营分会场:巴别时代 CEO--放开偏执,拥抱变革
  11. linux ALSA 驱动架构
  12. cad绘制正八边形_什么是CAD?为什么要学CAD?该怎么学CAD?
  13. 输入一行字符,以回车符作为输入结束的标志。统计其中英文字母、数字字符和其他字符的个数。
  14. 电脑计算机桌面什么安装,一般的软件是怎样安装到电脑桌面上的?
  15. 在linux下设置php效劳器Apache2.2.3 mysql5.0.22 php5.2.0(2)
  16. Oracle 导出数据库(不积跬步,无以至千里)
  17. LeetCode 21. 合并两个有序链表(链表)
  18. 论文文献引用规范和标准(国标GBT7714)@endnote国标样式@citation交叉引用编号
  19. 为什么都说做猎头很累?
  20. 毫安时,毫瓦时的含义

热门文章

  1. pyecharts绘制地图(Geo and Map)(细节更丰富)
  2. 计算机基础中图文混排的重要性,浅谈项目教学在技校计算机应用基础中的应用.doc...
  3. 大家谈之《区块链大革命》
  4. MySQL大略学习(二) 表格的操作 增删查改
  5. php解析bt,php读取BT文件信息lightbenc.php库使用说明
  6. mysql 无法启动 0xc000007b,windows安装mysql5.7教程 (MSVCR120.dll丢失。应用程序无法正常启动0xc000007b)...
  7. 激光雷达在无人驾驶应用中如何应对雨雾灰尘环境及经典案例分析
  8. 服务器server2012重置开机密码
  9. UFS UIC Layer: MIPI UNIPRO
  10. 苹果支持WebRTC