[英]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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.