AcWing 算法基础课 整数离散化
用于数据范围大但稀疏的数据
unique可以用来去重;
unique(v.begin(),v.end());
返回值指向最后一个无重复元素的下一位;
可以用
v.erase(unique(v.begin(),v.end()),v.end())去除有序数组中的重复元素。
对有序无重复数组,查找可以使用二分
例题 AcWing 802 区间和
vector<int> all_num;
vector<pair<int, int>> insert, query;
const int N = 3000010;
int a[N], s[N];
int find(int num)
{
int l = 0, r = all_num.size() - 1;
while (l < r)
{
int mid = (l + r) >> 1;
if (all_num[mid] >= num) r = mid;
else l = mid + 1;
}
return l;
}
int main()
{
int n, m;
cin >> n>>m;
for (int i = 0; i < n; i++)
{
int x, c;
cin >> x >> c;
insert.push_back({ x,c });
all_num.push_back(x);
}
for (int i = 0; i < m; i++)
{
int l, r;
cin >> l >> r;
query.push_back({ l,r });
all_num.push_back(l);
all_num.push_back(r);
}
all_num.erase(unique(all_num.begin(), all_num.end()), all_num.end());
for (auto[num, value] : insert)
{
int index = find(num);
a[index + 1] += value;
}
for (int i = 1; i <= all_num.size(); i++)
s[i] = s[i - 1] + a[i];
for (auto[l, r] : query)
{
int index1 = find(l);
int index2 = find(r);
cout << s[index2 + 1] - s[index1]<<endl;
}
return 0;
}