Submission #1294946

#TimeUsernameProblemLanguageResultExecution timeMemory
1294946Hamed_GhaffariSparklers (JOI17_sparklers)C++20
100 / 100
24 ms2788 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; using pii = pair<int, int>; #define X first #define Y second #define mid ((l+r)>>1) #define lc id<<1 #define rc lc|1 #define all(x) x.begin(), x.end() #define SZ(x) int(x.size()) #define mins(a, b) (a = min(a, b)) #define maxs(a, b) (a = max(a, b)) const int MXN = 1e5+5; using big = __int128_t; int n, k; ll t, x[MXN]; big y[MXN]; /* x[r] - x[l] <= (r-l)*t*s*2 x[r] - r*t*s*2 <= x[l] - l*t*s*2 y[i] = x[i] - i*t*s2 y[r] <= y[l] */ bool check(ll s) { for(int i=1; i<=n; i++) y[i] = x[i] - (big)i*t*s*2; if(y[1]<y[n]) return 0; int L=k, R=k; for(int i=k-1; i>=1; i--) if(y[i]>=y[L]) L = i; for(int i=k+1; i<=n; i++) if(y[i]<=y[R]) R = i; int l=k, r=k; big mx=y[k], mn = y[k]; while(L<l || r<R) if(L<l && y[l-1]>=mn) maxs(mx, y[--l]); else if(r<R && mx>=y[r+1]) mins(mn, y[++r]); else return 0; l=1, r=n; mx = y[1], mn = y[n]; while(l<L || R<r) if(l<L && y[l+1]>=mn) maxs(mx, y[++l]); else if(R<r && mx>=y[r-1]) mins(mn, y[--r]); else return 0; return 1; } int32_t main() { cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0); cin >> n >> k >> t; for(int i=1; i<=n; i++) cin >> x[i]; int l=0, r=x[n]; while(r-l>1) (check(mid) ? r : l) = mid; cout << r << '\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...