Submission #423381

#TimeUsernameProblemLanguageResultExecution timeMemory
423381balbitSparklers (JOI17_sparklers)C++14
100 / 100
54 ms3784 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define int ll
#define y1 zck_is_king
#define pii pair<int, int>
#define ull unsigned ll
#define f first
#define s second
#define ALL(x) x.begin(),x.end()
#define SZ(x) (int)x.size()
#define SQ(x) (x)*(x)
#define MN(a,b) a = min(a,(__typeof__(a))(b))
#define MX(a,b) a = max(a,(__typeof__(a))(b))
#define pb push_back
#define REP(i,n) for (int i = 0; i<n; ++i)
#define RREP(i,n) for (int i = n-1; i>=0; --i)
#define REP1(i,n) for (int i = 1; i<=n; ++i)
#define SORT_UNIQUE(c) (sort(c.begin(),c.end()), c.resize(distance(c.begin(),unique(c.begin(),c.end()))))
#ifdef BALBIT
#define IOS()
#define bug(...) fprintf(stderr,"#%d (%s) = ",__LINE__,#__VA_ARGS__),_do(__VA_ARGS__);
template<typename T> void _do(T &&x){cerr<<x<<endl;}
template<typename T, typename ...S> void _do(T &&x, S &&...y){cerr<<x<<", ";_do(y...);}
#else
#define IOS() ios_base::sync_with_stdio(0);cin.tie(0);
#define endl '\n'
#define bug(...)
#endif

const int iinf = 1e9+10;
const ll inf = 2e18+10000;
const ll mod = 1e9+7 ;


void GG(){cout<<"0\n"; exit(0);}

ll mpow(ll a, ll n, ll mo = mod){ // a^n % mod
    ll re=1;
    while (n>0){
        if (n&1) re = re*a %mo;
        a = a*a %mo;
        n>>=1;
    }
    return re;
}

ll inv (ll b, ll mo = mod){
    if (b==1) return b;
    return (mo-mo/b) * inv(mo%b,mo) % mo;
}

const int maxn = 1e6+5;

int n,k,T;

bool spread(vector<ll> a) {
    int n = SZ(a);
    int Lp=k, Rp=k;
    //
    REP(i, k+1) {
        if (a[i] > a[Lp]) Lp = i;
    }
    for (int i = k; i<n; ++i) {
        if (a[i] < a[Rp]) Rp = i;
    }
    bug(Lp, Rp);
    // try to spread [k,k] to [Lp, Rp], maintaining a[L] >= a[R]

    int nowl = k, nowr = k;
    int lcan = k, rcan = k; // where l,r can go as of now (but not peaks)
    bool chg = 1;
    while (chg) {
        chg = 0;
        while (Lp < lcan) {
//            bug(lcan, rcan);
            if (a[lcan-1] >= a[nowr] ) {
                --lcan;
                if (a[lcan] >= a[nowl]) {
                    nowl = lcan; chg = 1;
                }
            }else break;
        }
        while (rcan < Rp) {
            if (a[rcan+1] <= a[nowl]) {
                ++rcan;
                if (a[rcan] <= a[nowr]) {
                    nowr = rcan; chg = 1;
                }
            }else break;
        }
        bug(lcan, rcan);
    }
    bug(nowl, nowr, Lp, Rp);
    if (nowl != Lp || nowr != Rp) return 0;

    if (a[0] < a[n-1]) return 0;
    nowl = 0, nowr = n-1; // spreading backwards now
    lcan = 0, rcan = n-1;
    chg = 1;
//    bug("hey");
    while (chg) {
        chg = 0;
        while (lcan < Lp) {
            if (a[lcan+1] >= a[nowr]) {
                ++lcan;
                if(a[lcan] >= a[nowl]) {
                    nowl = lcan; chg = 1;
                }
            }else break;
        }
        while (rcan > Rp) {
            if (a[rcan-1] <= a[nowl]) {
                --rcan;
                if (a[rcan] <= a[nowr]) {
                    nowr = rcan; chg = 1;
                }
            }else break;
        }
        bug(lcan, rcan);
    }

//    if (a[nowr] > a[rcan]) assert(0);

    bug(nowl, nowr, lcan, rcan, Lp, Rp);
    if (nowl != Lp || nowr != Rp) return 0;
    return 1;
}

signed main(){
    IOS();
   cin>>n>>k>>T;
    --k;
    vector<ll> X(n);
    REP(i,n) {
        cin>>X[i];
    }
//    for (int x : L) bug(x);
//    for (int x : R) bug(x);

//    bug(st);
    ll l = 0, r = 1e9+5;
    while (l!=r) {
        ll s = (l+r)/2;
        if (s * T * 2> 1000000000ll * 2) {
            r = s; continue;
        }
        vector<ll> a(n);
        REP(i,n) {
            a[i] = X[i] - 2 * s * T * i;
        }
        bug(l,r, s);
        bool ok = spread(a);
        if (!ok) {
            l = s+1;
        }else{
            r = s;
        }
    }
    cout<<l<<endl;

}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...