[モノトーンキュー] XKCのバスケットボールチーム

XKCのバスケットボールチーム

  • 問題の意味:の数よりも少なくとも大きいそれぞれの端部から、配列が与えられると\(m個\) それとの間の最大距離で得られる数。もしなし\(--1 \)

  • 解決策:少なくともキュー半から、現在の数がチームにそれテールよりも大きい場合は、前方横断から、背面から前面への増加コホートを維持する、または自分自身よりも大きいの最小値を見つけるために、\(M \) 数2間の距離が答えです。

  • 現在の数は、テール未満であり、それよりもオフ尾より前の両方の数が少ないので、この数は、必ずしもいくつかの優れたチームの終わりではないという場合。

  • 時間複雑\(O(nlogn)\)

  • この問題は、+ 2等級表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;
}

ほとんどの人が実際にツリーラインを使用しますが、それは実際に、セグメントツリーの水問題に見えます。

おすすめ

転載: www.cnblogs.com/smallocean/p/11516426.html