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;
}

posted @   80k  阅读(66)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示