이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
 
using namespace std;
 
#define ll  long long
 
int main()  {
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
 
    int n;  cin >> n;
    int k;  cin >> k;
    int T;  cin >> T;   k--;
 
    vector<int> v(n);
    vector<ll>  d(n);
 
    auto check = [&](int m) {
        for(int i = 0 ; i < n ; ++i)
            d[i] = 2ll * T * i * m - v[i];
 
        int pl = k, nl = k - 1;
        int pr = k, nr = k + 1;
 
        while (1)   {
            while (d[nl] > d[pl] && d[nl] <= d[pr] && nl > 0)       nl--;
            while (d[nr] < d[pr] && d[nr] >= d[pl] && nr < n - 1)   nr++;
 
            bool ok = 0;
 
            if (nl >= 0 && d[nl] <= d[pl])  pl = nl--, ok = 1;
            if (nr <  n && d[nr] >= d[pr])  pr = nr++, ok = 1;
 
            if(!ok) break;
        }
        if (nr <  n && d[pl] > d[nr])   return  false;
        if (nl >= 0 && d[pr] < d[nl])   return  false;
 
        int l = 0;      nl = 1;
        int r = n - 1;  nr = n - 2;
 
        while (1)   {
            while (d[nl] > d[l] && d[nl] <= d[r] && nl < k) nl++;
            while (d[nr] < d[r] && d[nr] >= d[l] && nr > k) nr--;
 
            bool ok = 0;
 
            if (nl <= k && d[nl] <= d[l])   l = nl++, ok = 1;
            if (nr >= k && d[nr] >= d[r])   r = nr--, ok = 1;
 
            if(!ok) break;
        }
 
        return  pl <= l && r <= pr;
    };
 
    for(int&x : v)
        cin >> x;
 
    int l = 0;
    int r = 1e9;
 
    for(; l < r ;)  {
        int m = (l + r) / 2;
 
        if (check(m))
            r = m;
        else
            l = m + 1;
    }
 
    cout << l << endl;
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |