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;
}
ほとんどの人が実際にツリーラインを使用しますが、それは実際に、セグメントツリーの水問題に見えます。。。