离散化(AcWing.802)
2021-03-18 17:25
标签:需要 数组 algorithm find += for sort 连续 不重复 题目描述 分析 主要分为5大步: 问题 首先要明确alls中存放的是位置而不是值,也就是存放的是x而不是c。 因为再求区间和的时候,我们提前分析到可以使用前缀和来做,求前缀和就需要下标l r,如果不加入l r到alls中的话,第5步中遍历时query就没有办法通过输入的l r去访问a或者s。因为find函数就是输入映射前的下标,返回在alls中的下标+1。 举个例子,拿平时的数组来说,下标都是整形,但是如果要求a[1.5]肯定是有错误的,在这里也一样。 2.为什么要排序和去重? 首先要明确find函数的功能,输入一个离散数组的位置(映射前的位置)x返回连续数组的位置+1(映射后的位置+1)。+1的目的是为了求区间和时少一步下标为0的判断。 排序很好理解,因为在find函数中是使用了二分来查找x在alls中的下标+1,想要使用二分alls就必须具有某种性质这里就可以找一个最简单的办法使他单调(但是y总说过二分!=单调性)。 离散化(AcWing.802) 标签:需要 数组 algorithm find += for sort 连续 不重复 原文地址:https://www.cnblogs.com/zyz010206/p/12348321.html
首先明确一下题意,先输入两个整数n、m,n代表在区间[-1e9,1e9]某一点加一个整数的次数,输入x c在x处加上c,m代表求某个区间和的次数,输入l r求区间[l,r]的和。
分析一下y总的代码。
1.读输入。将每次读入的x c push_back()到add中,将每次读入的位置x push_back()到alls中,将每次读入的l r push_back()到query中。
2.排序、去重。
3.通过遍历add,完成在离散化的数组映射到的a数组中进行加上c的操作(用到find函数)。
4.初始化s数组。
5.通过遍历query,完成求区间[l,r]的和。
1.为什么要在alls中需要alls.push_back(l);alls.push_back(r);?#include