码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 离散化(保序)


    目录

    概念

    可能出现的问题

    分类

    1.保序

     离散化模板( https://www.acwing.com/blog/content/277/)

     例题:区间和

    思路

    代码

    2.不保序


    概念

            给定一系列要为坐标的值,可能很大,1 到 10e9  ,总不能开一个10e9的数组吧,就要涉及到离散化,将10e5个数(大小在10e9之内)映射到1~10e5,这个映射的过程就叫离散化。

    可能出现的问题

            1.有重复元素,需要去重。

            2.如何算出a[ i ] 离散后的值。

    分类

    1.保序

    排序判重+二分

     离散化模板( https://www.acwing.com/blog/content/277/)

    1. vector<int> alls; // 存储所有待离散化的值
    2. sort(alls.begin(), alls.end()); // 将所有值排序
    3. alls.erase(unique(alls.begin(), alls.end()), alls.end()); // 去掉重复元素
    4. // 二分求出x对应的离散化的值
    5. int find(int x) // 找到第一个大于等于x的位置
    6. {
    7. int l = 0, r = alls.size() - 1;
    8. while (l < r)
    9. {
    10. int mid = l + r >> 1;
    11. if (alls[mid] >= x) r = mid;
    12. else l = mid + 1;
    13. }
    14. return r + 1; // 映射到1, 2, ...n 不加1,从0开始映射
    15. }

     例题:区间和

    假定有一个无限长的数轴,数轴上每个坐标上的数都是 0。现在,我们首先进行 n次操作,每次操作将某一位置 x 上的数加 c。接下来,进行 m次询问,每个询问包含两个整数 l 和 r,你需要求出在区间 [l,r]之间的所有数的和。

    输入格式

    第一行包含两个整数 n和 m。接下来 n行,每行包含两个整数 x 和 c。再接下来 m行,每行包含两个整数 l 和 r。

    输出格式

    共 m行,每行输出一个询问中所求的区间内数字和。

    数据范围

    −10e9 ≤ x ≤ 10e9,
    1≤n,m≤10e5,
    −10e9 ≤ l ≤ r ≤ 10e9,
    −10000 ≤ c ≤ 10000

    输入样例:

    1. 3 3
    2. 1 2
    3. 3 6
    4. 7 5
    5. 1 3
    6. 4 6
    7. 7 8

    输出样例:

    1. 8
    2. 0
    3. 5

    思路

            下标范围很大,但我们只用到n+m个(3*10e5);

            由前缀和思想,我们可以很快求出某一区间的值,要用前缀和,那么离散化后的数组下标要从1开始。所以二分返回结果要加1.

            要在某一个下标加上c的话,就算出它离散后的下标,并在那个位置加c;

            比如要求L,R之间的数,我们算出离散化的坐标LK,RK后,求LK,RK之间的和就可以了。

    代码

    1. #include
    2. #include
    3. using namespace std;
    4. const int N = 300010;
    5. int n, m;
    6. int a[N];//要存的数
    7. int s[N];//前缀和
    8. vector<int> alls;//存所有要离散化的值
    9. typedef pair<int, int> PII;
    10. vector add, query;
    11. int find(int x) {
    12. int l = 0, r = alls.size() - 1;
    13. while (l < r) {
    14. int mid = l + r >> 1;
    15. if (alls[mid] >= x)r = mid;
    16. else l = mid + 1;
    17. }
    18. return r + 1;
    19. }
    20. int main() {
    21. //将所有数读进来,所有用到的下标离散化
    22. cin >> n >> m;
    23. for (int i = 0; i < n; i++) {
    24. int x, c;
    25. cin >> x >> c;
    26. add.push_back({ x, c });
    27. alls.push_back(x);
    28. }
    29. for (int i = 0; i < m; i++) {
    30. int l, r;
    31. cin >> l >> r;
    32. query.push_back({ l,r });
    33. alls.push_back(l);
    34. alls.push_back(r);
    35. }
    36. //放好以后开始去重
    37. sort(alls.begin(), alls.end());
    38. alls.erase(unique(alls.begin(), alls.end()), alls.end());
    39. for (auto item : add) {
    40. int x = find(item.first);
    41. a[x] += item.second;
    42. }
    43. //预处理前缀和;
    44. for (int i = 1; i <= alls.size(); i++) s[i] = s[i - 1] + a[i];
    45. //处理询问
    46. for (auto item : query) {
    47. int l = find(item.first), r = find(item.second);
    48. cout << s[r] - s[l - 1] << endl;
    49. }
    50. return 0;
    51. }

    2.不保序

     map或者hash表

    https://blog.csdn.net/qq_59183443/article/details/127520112?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22127520112%22%2C%22source%22%3A%22qq_59183443%22%7D

  • 相关阅读:
    Spring cloud学习笔记(服务注册与发现框架Eureka)
    从零开始的Hadoop学习(四)| SSH无密登录配置、集群配置
    MATLAB2016笔记(六):数据可视化
    babel转换class时使用defineProperty导致的装饰器问题
    Self-paced Multi-grained Cross-modal Interaction Modeling for Referring Expression Comprehension论文阅读
    Android 10.0 禁用adb shell input输入功能
    【深入理解C】动态内存管理
    传输层协议——TCP、UDP
    如何完美卸载Visual Studio 2013
    教你几分钟学会DNAC查看设备健康度
  • 原文地址:https://blog.csdn.net/qq_59183443/article/details/126963067
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号