数组上的范围最小查询
Range minimum query on array
我有N个整数Ai定义为A1,A2。。。,AN。我必须处理形式a的Q个查询。对于每个这样的查询,找到一个索引I,使Ai≥a。我必须将差值Ai-a最小化。我做得像
while(q--)
{
cin>>a;
mini=INT_MAX;
index=-1;
for(int i=0;i<n;i++)
{
diff1=A[i]-a;
if(diff1>=0)
{
ll sum=diff1;
if(sum<mini)
{
mini=sum;
index=i+1;
}
if(mini==0)
break;
}
}
cout<<index;
}
但它导致了TLE。做这件事的有效方法是什么?
您可以构建成对的(Ai, i)
、排序一次和二进制搜索Q
次的数组。
#include <vector>
#include <algorithm>
#include <utility>
bool cmp1st(const std::pair<int, int>& lhs, const std::pair<int, int>& rhs)
{
return lhs.first < lhs.right;
}
std::pair<int, int> *values = new std::pair<int, int>[n];
// Build array of (Ai, i)
for (int i = 0; i < n; ++i) {
values[i] = std::make_pair(A[i], i);
}
// Sort by ascending order of Ai
std::sort(values, values + n);
while(q--)
{
cin>>a;
// binary search
int index = std::lower_bound(values, values + n, std::make_pair(a, 0), cmp1st)->second;
cout<<index;
}
delete [] values;
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 为什么在全局范围内使用"extern int a"似乎不行?
- 查询SQLite数据库中的日期
- 尝试通过多个向量访问变量时,向量下标超出范围
- 错误:未在此范围内声明'reverse'
- 正在将指针转换为范围
- 使用std::transform将一个范围的元素添加到另一个范围中
- 在 c++ 中解决段树以外的范围查询的有效方法是什么?
- 对于多个查询,查找在 l 到 r 范围内具有相同元素的最长公共子数组
- MongoDB:跨日期范围的查询
- 对树中路径的范围查询
- C++MySql连接器-查询的结果超出范围
- 减少具有未排序时间范围的表中的查询时间
- C++数据结构的时间范围查询
- 如何查询范围中的任何位是否在 C++ std::bitset 中设置
- 使用 Firedac 进行 MongoDB 的时间范围查询
- 数组上的范围最小查询
- mongodbc++查询一天的范围
- c++中任何好的范围查询库(使用K-D树,四叉树或r语言 - 树)
- 范围最小查询