제출 #1247229

#제출 시각아이디문제언어결과실행 시간메모리
1247229SpyrosAliv말 (IOI15_horses)C++20
37 / 100
123 ms40644 KiB
#include "horses.h" #include <bits/stdc++.h> using namespace std; #define ll long long const ll MOD = 1e9+7; const ll MAXV = 1e9; const int MN = 5e5+5; int n; vector<int> x, y; class SegTree { private: vector<ll> seg; ll query(int node, int start, int end, int l, int r) { if (start > r || end < l) return 1LL; else if (start >= l && end <= r) return seg[node]; else { int mid = (start + end) / 2; return query(node*2+1, start, mid, l, r) * query(node*2+2, mid+1, end, l, r) % MOD; } } void update(int node, int start, int end, int idx, int v) { if (start == end) { seg[node] = v; } else { int mid = (start + end) / 2; if (idx <= mid) update(node*2+1, start, mid, idx, v); else update(node*2+2, mid+1, end, idx, v); seg[node] = seg[node*2+1] * seg[node*2+2] % MOD; } } public: void init(int nn) { seg.resize((nn + 1) * 8); } void upd(int idx, int v) { update(0, 0, n-1, idx, v); } ll query(int l, int r) { if (l > r) return 0; return query(0, 0, n-1, l, r); } }; SegTree seg; int get_ans() { ll dp = y[n-1]; int idx = n-1; for (int i = n-2; i >= max(0, n - 32); i--) { ll dp2 = max((ll)y[i], (ll)x[i + 1] * dp); if (dp2 > MAXV) break; dp = dp2; idx = i; } ll b4 = seg.query(0, idx); return (b4 * dp) % MOD; } int init(int N, int X[], int Y[]) { n = N; seg.init(n); for (int i = 0; i < n; i++) { x.push_back(X[i]); y.push_back(Y[i]); seg.upd(i, X[i]); } return get_ans(); } int updateX(int pos, int val) { x[pos] = val; seg.upd(pos, x[pos]); return get_ans(); } int updateY(int pos, int val) { y[pos] = val; return get_ans(); }
#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...