Submission #1302327

#TimeUsernameProblemLanguageResultExecution timeMemory
1302327nicolo_010Horses (IOI15_horses)C++20
20 / 100
343 ms67916 KiB
#include <bits/stdc++.h> #include "horses.h" using namespace std; using ll = long long; using pii = pair<ll, ll>; const int MOD = 1e9+7; const ll INF = 1e18; 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; } } void querymx(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; querymx(2*p, l, m, i, x); querymx(2*p+1, m+1, r, i, x); int i1 = tree[2*p]; int i2 = tree[2*p+1]; tree[p] = max(i1, i2); } } int rmq(int p, int l, int r, int i, int j) { if (l > j || r < i) return 0; if (i <= l && r <= j) { return tree[p]; } else { int m = (l+r)/2; int i1 = rmq(2*p, l, m, i, j); int i2 = rmq(2*p+1, m+1, r, i, j); return max(i1, i2); } } }; SegTree st, mxtr; vector<ll> x, y; set<int> s; int n; ll compute() { auto it = s.end(); for (int i=0; i<min(31, (int)s.size()); i++) { it--; } ll prod=1; bool moduled = false; int idx = *it; int i = idx+1; while (i < n) { ll y0, y1; if (x[idx] == 1) { auto aux = s.lower_bound(idx); y0 = mxtr.rmq(1, 0, n-1, idx, *aux-1); } else { y0 = y[idx]; } if (x[i] == 1) { auto aux = s.lower_bound(i); y1 = mxtr.rmq(1, 0, n-1, i, *aux-1); } else { y1 = y[i]; } prod *= x[i]; //cout << i << " " << idx << " " << y1 << " " << y0 << " " << x[idx] << " " << x[i] << " " << prod << endl; if (prod >= MOD) { prod %= MOD; moduled = true; } if (moduled) { idx = i; prod = 1; moduled = false; } else { if (prod*y1 >= y0) { idx = i; prod = 1; moduled = false; } } if (x[i] == 1) { auto aux = s.lower_bound(i); i = *aux; } else { i++; } } prod = st.rsq(1, 0, n-1, 0, idx); ll y0; if (x[idx] == 1) { auto aux = s.lower_bound(idx); y0 = mxtr.rmq(1, 0, n-1, idx, *aux-1); } else y0 = y[idx]; return (prod*y0)%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); mxtr.init(n); for (int i=0; i<n; i++) { st.query(1, 0, n-1, i, x[i]); mxtr.querymx(1, 0, n-1, i, y[i]); } s.insert(0); s.insert(n); for (int i=1; i<n; i++) { if (x[i] != 1) s.insert(i); } return compute(); } int updateX(int pos, int val) { st.query(1, 0, n-1, pos, val); if (pos != 0 && val == 1) { s.erase(pos); } else if (val >= 2) { s.insert(pos); } x[pos] = val; return compute(); } int updateY(int pos, int val) { y[pos] = val; mxtr.querymx(1, 0, n-1, pos, val); return compute(); }
#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...