| # | Time | Username | Problem | Language | Result | Execution time | Memory |
|---|---|---|---|---|---|---|---|
| 1286514 | tschav_ | Horses (IOI15_horses) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
vector<ll> x, y;
int n;
int m;
ll prod = 1;
int idx = -1;
vector<int> st;
static const ll MOD = 1e9+7;
ll binpow(ll a, ll b, ll m) {
a %= m;
ll res = 1;
while (b > 0) {
if (b & 1)
res = res * a % m;
a = a * a % m;
b >>= 1;
}
return res;
}
ll gety(int id){
int lim = n;
if(id < m-1) {
lim = st[id+1];
}
ll mx = 0;
for(int i = st[id]; i < lim; ++i){
mx = max(mx, y[i]);
}
}
ll solve() {
ll mx = (idx == -1 ? 0 : y[st[idx]]);
ll curr = 1;
for(int i = idx+1; i < m; ++i){
curr *= x[st[i]];
int G = gety(i);
if(curr * G > mx) {
mx = curr * G;
}
}
return (mx%MOD * prod%MOD) % MOD;
}
void ind() {
idx = -1;
ll P = 1ll;
for(int i = m-1; i >= 0; --i) {
if(P * x[st[i]] > 1e9) {
idx=i;
break;
} else P *= x[st[i]];
}
}
void getprod() {
prod = 1ll;
for(int i = 0; i <= idx; ++i){
prod = (prod * x[st[i]]) % MOD;
}
}
int init(int N, int X[], int Y[]) {
n = N;
x.resize(n,0ll);
y.resize(n,0ll);
for(int i = 0; i < n; ++i) {
x[i] = X[i];
y[i] = Y[i];
if(x[i] >= 2){
st.push_back(i);
}
}
m = st.size();
ind();
getprod();
return int(solve());
}
int updateX(int pos, int val) {
ll old = x[pos];
x[pos] = val;
ind();
if(pos <= idx) {
prod = (prod * binpow(old, MOD-2,MOD)) % MOD;
prod = (prod * val) % MOD;
}
if(val == 1 and old != 1) {
st.erase(st.begin()+pos,1);
}
return int(solve());
}
int updateY(int pos, int val) {
y[pos] = val;
ind();
return int(solve());
}
