zoukankan      html  css  js  c++  java
  • [单调队列]XKC's basketball team

    XKC's basketball team

    • 题意:给定一个序列,从每一个数后面比它大至少 (m) 的数中求出与它之间最大的距离。如果没有则为 (-1)

    • 题解:从后向前维护一个递增的队列,从后往前遍历,若当前的数大于队尾就进队,否则从该队列中二分找最小的比自己大至少 (m) 的数,二者之间的距离即为答案。

    • 若当前数小于队尾,那这个数一定没有队尾的数优,因为它既比队尾的数靠前,又比它小。

    • 时间复杂度 (O(nlogn))

    • 此题也可以用ST表+二分 等方法写出。

      标程(单调队列):

    #include <bits/stdc++.h>
    using namespace std;
    int a[500002], ans[500002];
    vector<int> v, num;
    int main() {
        int n,m;cin >> n>>m;
        for (int i = 1; i <= n; i++)cin >> a[i];
        v.clear(),num.clear();
        for (int i = n; i >= 1; i--) {
            if (v.size() == 0 || v.back() <a[i]) {
                v.push_back(a[i]);
                num.push_back(i);
                ans[i] = -1;
            } else {
                int j = (lower_bound(v.begin(), v.end(), a[i]+m) - v.begin());
                if(j==v.size())
                    ans[i]=-1;
                else
                    ans[i] = num[j] - i - 1;
            }
        }
        for (int i = 1; i < n; i++)
            cout << ans[i] << ' ';
        cout << ans[n] << endl;
        return 0;
    }
    

    居然大部分人用的是线段树,不过看上去确实是线段树水题。。。

    不要忘记努力,不要辜负自己 欢迎指正 QQ:1468580561
  • 相关阅读:
    分西瓜(dfs)
    括号配对(栈)
    gcd表(欧几里得定理)
    整数性质(拓展欧几里得算法)
    欧几里得算法(求最大公约数)拓展欧几里得算法
    删除元素(二分查找)
    括号配对问题
    公司组织看电影(综合)
    取余数(%)
    幼儿园分苹果(/)
  • 原文地址:https://www.cnblogs.com/smallocean/p/11516426.html
Copyright © 2011-2022 走看看