Submission #1235810

#TimeUsernameProblemLanguageResultExecution timeMemory
123581012baaterHorses (IOI15_horses)C++20
54 / 100
341 ms17040 KiB
#include "horses.h" #include <iostream> #include <vector> #include <algorithm> using namespace std; typedef long long ll; const ll MOD = 1E9 + 7; const int MAXN = 500050; int n; vector<int> x(MAXN); vector<int> y(MAXN); struct ST { int n; vector<ll> seg; ST(int N) : n(N), seg(2*N) {} void update(int pos, int val) { pos += n; seg[pos] = val; pos >>= 1; while (pos > 0) { seg[pos] = (seg[pos*2] * seg[pos*2 + 1])%MOD; pos >>= 1; } } ll query(int l, int r) { l += n; r += n; ll ret = 1; while (l < r) { if (l&1) { ret *= seg[l++]; ret %= MOD; } if (r&1) { ret *= seg[--r]; ret %= MOD; } l >>= 1; r >>= 1; } return ret%MOD; } }; ST tree(MAXN); int find_best(int start) { int bestInd = start; ll tot = 1; for (int i = start+1; i < n; i++) { tot *= x[i]; if (tot * y[i] >= y[bestInd]) { bestInd = i; tot = 1; } } return bestInd; } int solve() { int num = max(0, n-1001); int ind = find_best(num); ll horseNum = tree.query(0, ind+1); ll cashNum = y[ind]; // cout << horseNum << " " << cashNum << endl; return (tree.query(0, ind+1) * y[ind])%MOD; } int init(int N, int X[], int Y[]) { n = N; for (int i = 0; i < N; i++) { x[i] = X[i]; y[i] = Y[i]; tree.update(i, x[i]); } return solve(); } int updateX(int pos, int val) { x[pos] = val; tree.update(pos, val); return solve(); } int updateY(int pos, int val) { y[pos] = val; 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...