【问题标题】:Range minimum query on array数组上的范围最小查询
【发布时间】:2016-03-02 14:29:17
【问题描述】:

我有 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数组中的确切位置,还是只需要它的值?
  • 我需要ai元素的索引i
  • @ankitkumar 提供问题陈述和问题来源,以确保它不是任何跑步比赛的一部分

标签: c++ algorithm rmq


【解决方案1】:

您可以构建成对的(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;

【讨论】:

  • 如果我将引入一个类似于A和b的数组B代替a,并且我想找到最小和Ai-a+Bi-b,那么这个问题需要进行哪些修改?
  • @ankitkumar 如果数字溢出不是问题,您可以构建(Ai + Bi, i) 的数组并搜索(a+b, 0)
猜你喜欢
  • 2021-08-17
  • 2017-01-16
  • 2015-10-02
  • 1970-01-01
  • 2013-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多