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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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训练数据并当服务器共享给他人