제출 #1153650

#제출 시각아이디문제언어결과실행 시간메모리
1153650AmirAli_H1Sparklers (JOI17_sparklers)C++20
100 / 100
45 ms5824 KiB
// In the name of Allah #include <bits/stdc++.h> using namespace std; typedef long long int ll; typedef long double ld; typedef pair<int, int> pii; typedef pair<ll, ll> pll; typedef complex<ld> cld; #define all(x) (x).begin(),(x).end() #define len(x) ((ll) (x).size()) #define F first #define S second #define pb push_back #define sep ' ' #define endl '\n' #define Mp make_pair #define kill(x) cout << x << '\n', exit(0) #define set_dec(x) cout << fixed << setprecision(x); #define file_io(x,y) freopen(x, "r", stdin); freopen(y, "w", stdout); mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); const int maxn = 1e6 + 4; int n, k; ll t; ll A[maxn]; vector<ll> ls1, ls2; ll sm1[maxn], sm2[maxn]; int R1[maxn], R2[maxn]; ll M1[maxn], M2[maxn]; ll mn1[maxn], mn2[maxn], mx1[maxn], mx2[maxn]; bool ok(ll x) { ll tx = (t * x); if (tx >= A[n - 1]) return 1; ls1.clear(); int n1 = k + 1; for (int i = k; i >= 0; i--) { if (i == k) ls1.pb(0); else ls1.pb(tx - (A[i + 1] - A[i])); } for (int i = 0; i < n1; i++) { if (i == 0) sm1[i] = ls1[i]; else sm1[i] = sm1[i - 1] + ls1[i]; } for (int i = n1 - 1; i >= 0; i--) { if (i == n1 - 1) { mn1[i] = mx1[i] = sm1[i]; } else { mn1[i] = min(mn1[i + 1], sm1[i]); mx1[i] = max(mx1[i + 1], sm1[i]); } } for (int i = n1 - 1; i >= 0; i--) { R1[i] = i + 1; M1[i] = sm1[i]; while (R1[i] != n1) { if (sm1[R1[i]] >= sm1[i]) break; M1[i] = min(M1[i], M1[R1[i]]); R1[i] = R1[R1[i]]; } } ls2.clear(); int n2 = n - k; for (int i = k; i < n; i++) { if (i == k) ls2.pb(0); else ls2.pb(tx - (A[i] - A[i - 1])); } for (int i = 0; i < n2; i++) { if (i == 0) sm2[i] = ls2[i]; else sm2[i] = sm2[i - 1] + ls2[i]; } for (int i = n2 - 1; i >= 0; i--) { if (i == n2 - 1) { mn2[i] = mx2[i] = sm2[i]; } else { mn2[i] = min(mn2[i + 1], sm2[i]); mx2[i] = max(mx2[i + 1], sm2[i]); } } for (int i = n2 - 1; i >= 0; i--) { R2[i] = i + 1; M2[i] = sm2[i]; while (R2[i] != n2) { if (sm2[R2[i]] >= sm2[i]) break; M2[i] = min(M2[i], M2[R2[i]]); R2[i] = R2[R2[i]]; } } int i1 = 0, i2 = 0; while (i1 < n1 - 1 || i2 < n2 - 1) { if (mn1[i1] + mx2[i2] < 0 || mx1[i1] + mn2[i2] < 0) return 0; if (i1 == n1 - 1) { if (sm1[i1] + sm2[i2 + 1] >= 0) { i2++; continue; } else return 0; } else if (i2 == n2 - 1) { if (sm1[i1 + 1] + sm2[i2] >= 0) { i1++; continue; } else return 0; } if (R1[i1] != n1) { if (M1[i1] + sm2[i2] >= 0) { i1 = R1[i1]; continue; } } if (R2[i2] != n2) { if (sm1[i1] + M2[i2] >= 0) { i2 = R2[i2]; continue; } } if (R1[i1] != n1 || R2[i2] != n2) return 0; if (mn1[i1] + mx2[i2 + 1] >= 0) { i2++; int x = mx2[i2]; while (sm2[i2] != x) i2++; continue; } if (mx1[i1 + 1] + mn2[i2] >= 0) { i1++; int x = mx1[i1]; while (sm1[i1] != x) i1++; continue; } return 0; } return (i1 == n1 - 1 && i2 == n2 - 1); } void solve() { cin >> n >> k >> t; k--; t *= 2; for (int i = 0; i < n; i++) { cin >> A[i]; } ll l = -1, r = (A[n - 1] / t) + 2; while (r - l > 1) { ll mid = (l + r) / 2; if (ok(mid)) r = mid; else l = mid; } cout << r << endl; } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int T = 1; while (T--) { solve(); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...