제출 #423381

#제출 시각아이디문제언어결과실행 시간메모리
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...