Submission #1302281

#TimeUsernameProblemLanguageResultExecution timeMemory
1302281nicolo_010말 (IOI15_horses)C++20
17 / 100
1597 ms36852 KiB
#include <bits/stdc++.h> #include "horses.h" using namespace std; using ll = long long; using pii = pair<int, int>; const int MOD = 1e9+7; const ll INF = 1e18; vector<ll> x; vector<ll> y; int n; struct SegTree { vector<ll> tree; SegTree() { } void init(int m) { tree.assign(4*m, 0); } void query(int p, int l, int r, int i, int x) { if (l > i || r < i) return; if (l==r) { tree[p] = x; } else { int m = (l+r)/2; query(2*p, l, m, i, x); query(2*p+1, m+1, r, i, x); ll i1 = tree[2*p]; ll i2 = tree[2*p+1]; tree[p] = (i1*i2) % MOD; } } ll rsq(int p, int l, int r, int i, int j) { if (l > j || r < i) return 1; if (i <= l && r <= j) { return tree[p]; } else { int m = (l+r)/2; ll i1 = rsq(2*p, l, m, i, j); ll i2 = rsq(2*p+1, m+1, r, i, j); return (i1*i2)%MOD; } } }; SegTree st; ll compute(vector<ll> a, vector<ll> b) { int m = a.size(); int beg = max(0, m-30); int idx=beg; ll prod=1; bool moduled = false; for (int i=beg+1; i<m; i++) { ll y0 = b[idx]; ll y1 = b[i]; prod *= x[i]; if (prod >= MOD) { moduled = true; prod %= MOD; } if (moduled) { //Se que y[i] <= y[j]*prod //Conviene j idx = i; moduled = 0; prod = 1; } else { if (prod*y1 >= y0) { idx = i; prod = 1; moduled = false; } } } prod = st.rsq(1, 0, n-1, 0, idx); return (prod*y[idx])%MOD; } int init(int N, int* a, int* b) { n = N; x.assign(n, 0); y.assign(n, 0); for (int i=0; i<n; i++) { x[i] = a[i]; y[i] = b[i]; } st.init(n); for (int i=0; i<n; i++) { st.query(1, 0, n-1, i, x[i]); } return compute(x, y); } int updateX(int pos, int val) { x[pos] = val; st.query(1, 0, n-1, pos, val); return compute(x, y); } int updateY(int pos, int val) { y[pos] = val; return compute(x, y); }
#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...