Submission #1291162

#TimeUsernameProblemLanguageResultExecution timeMemory
1291162kustov_vadim_533말 (IOI15_horses)C++20
34 / 100
1597 ms22312 KiB
#include <iostream> #include <algorithm> #include <math.h> #include <vector> #include <set> #include <queue> #include <array> #include <map> #include <random> #include <bitset> #include <stack> #include <deque> #include <random> #include <unordered_set> #include <unordered_map> #include <string> #include <chrono> using namespace std; typedef long long ll; typedef double ld; mt19937 gen(chrono::steady_clock::now().time_since_epoch().count()); const int M = 1e9 + 7; const int sz = 1 << 20; int x[sz], rx[sz], mxy[sz]; bool fx[sz]; pair<int, int> a[sz]; void upd(int v, int l, int r) { if (r - l == 1) { x[v] = a[l].first; fx[v] = false; if (x[v] > 1 || l == 0) { rx[v] = l; } mxy[v] = a[l].second; } else { x[v] = (x[v * 2] * 1ll * x[v * 2 + 1]) % M; fx[v] = fx[v * 2] || fx[v * 2 + 1] || (x[v * 2] * 1ll * x[v * 2 + 1] >= M); rx[v] = max(rx[v * 2], rx[v * 2 + 1]); mxy[v] = max(mxy[v * 2], mxy[v * 2 + 1]); } } int get_x(int v, int l, int r, int ql, int qr) { if (l >= qr || ql >= r) return 1; if (l >= ql && r <= qr) return x[v]; int m = (l + r) / 2; int r1 = get_x(v * 2, l, m, ql, qr); int r2 = get_x(v * 2 + 1, m, r, ql, qr); return (r1 * 1ll * r2) % M; } int get_mxy(int v, int l, int r, int ql, int qr) { if (l >= qr || ql >= r) return 1; if (l >= ql && r <= qr) return mxy[v]; int m = (l + r) / 2; int r1 = get_mxy(v * 2, l, m, ql, qr); int r2 = get_mxy(v * 2 + 1, m, r, ql, qr); return max(r1, r2); } int get_rx(int v, int l, int r, int ql, int qr) { if (l >= qr || ql >= r) return -1; if (l >= ql && r <= qr) return rx[v]; int m = (l + r) / 2; int r1 = get_rx(v * 2, l, m, ql, qr); int r2 = get_rx(v * 2 + 1, m, r, ql, qr); return max(r1, r2); } bool get_fx(int v, int l, int r, int ql, int qr) { if (l >= qr || ql >= r) return false; if (l >= ql && r <= qr) return fx[v]; int m = (l + r) / 2; bool r1 = get_fx(v * 2, l, m, ql, qr); bool r2 = get_fx(v * 2 + 1, m, r, ql, qr); return r1 || r2; } int n; int solve() { int mx = n - 1; int r = n; while (!get_fx(1, 0, n, r, n) && r > 0) { int i = get_rx(1, 0, n, 0, r); r = i; if (i == -1) { break; } if (!get_fx(1, 0, n, i + 1, mx + 1) && get_x(1, 0, n, i + 1, mx + 1) * 1ll * get_mxy(1, 0, n, mx, n) < get_mxy(1, 0, n, i, n)) { mx = i; } } return (get_x(1, 0, n, 0, mx + 1) * 1ll * get_mxy(1, 0, n, mx, n)) % M; } void build(int v, int l, int r) { if (r - l == 1) { upd(v, l, r); return; } int m = (l + r) / 2; build(v * 2, l, m); build(v * 2 + 1, m, r); upd(v, l, r); } int init(int N, int X[], int Y[]) { n = N; for (int i = 0; i < N; ++i) { a[i].first = X[i]; a[i].second = Y[i]; } build(1, 0, N); return solve(); } void upd(int v, int l, int r, int qi) { if (r - l == 1) { upd(v, l, r); return; } int m = (l + r) / 2; if (qi < m) upd(v * 2, l, m, qi); else upd(v * 2 + 1, m, r, qi); upd(v, l, r); } int updateX(int pos, int val) { a[pos].first = val; upd(1, 0, n, pos); return solve(); } int updateY(int pos, int val) { a[pos].second = val; upd(1, 0, n, pos); return solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...