Submission #1173403

#TimeUsernameProblemLanguageResultExecution timeMemory
1173403HappyCapybara말 (IOI15_horses)C++17
100 / 100
903 ms95356 KiB
#include "horses.h" #include<bits/stdc++.h> using namespace std; #define ll __int128 ll m = 1000000007; int n; vector<int> x, y; vector<ll> sts, stm; set<int> s; void update(int pos, int val, int t, int node=1, int tl=0, int tr=n-1){ if (tl == tr){ if (t == 0) sts[node] = val; if (t == 1) stm[node] = val; return; } int tm = (tl+tr)/2; if (pos <= tm) update(pos, val, t, node*2, tl, tm); else update(pos, val, t, node*2+1, tm+1, tr); if (t == 0) sts[node] = (sts[node*2]*sts[node*2+1]) % m; if (t == 1) stm[node] = max(stm[node*2], stm[node*2+1]); } ll query(int l, int r, int t, int node=1, int tl=0, int tr=n-1){ if (l <= tl && tr <= r){ if (t == 0) return sts[node]; if (t == 1) return stm[node]; } int tm = (tl+tr)/2; ll res = 1; if (l <= tm){ if (t == 0) res = (res*query(l, r, t, node*2, tl, tm)) % m; if (t == 1) res = max(res, query(l, r, t, node*2, tl, tm)); } if (tm+1 <= r){ if (t == 0) res = (res*query(l, r, t, node*2+1, tm+1, tr)) % m; if (t == 1) res = max(res, query(l, r, t, node*2+1, tm+1, tr)); } return res; } int solve(){ auto it = s.end(); for (int i=0; i<35; i++){ it--; if (it == s.begin()) break; } auto it2 = next(it, 1); ll cur = query(0, *it, 0), cy = query(*it, *it2-1, 1), cx = 1, bsf = (cur*cy)%m; while (*it2 != n){ it++; it2++; cur = (cur*x[*it]) % m; cx *= x[*it]; if (cx * query(*it, *it2-1, 1) > cy){ bsf = (cur*query(*it, *it2-1, 1)) % m; cy = query(*it, *it2-1, 1); cx = 1; } } return bsf; } int init(int N, int X[], int Y[]){ n = N; x.resize(n); y.resize(n); sts.resize(4*n, 1); stm.resize(4*n, 1); s.insert(n); for (int i=0; i<n; i++){ x[i] = X[i]; y[i] = Y[i]; update(i, X[i], 0); update(i, Y[i], 1); if (i == 0 || X[i] != 1) s.insert(i); } return solve(); } int updateX(int pos, int val){ x[pos] = val; update(pos, val, 0); if (val == 1 && pos != 0) s.erase(pos); else s.insert(pos); return solve(); } int updateY(int pos, int val){ y[pos] = val; update(pos, val, 1); 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...