Submission #1191901

#TimeUsernameProblemLanguageResultExecution timeMemory
1191901DippleThreeHorses (IOI15_horses)C++20
100 / 100
232 ms45692 KiB
#include "horses.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; // typedef __int128 lll; int pow2ceil(int n){ n--; n |= n >> 1; n |= n >> 2; n |= n >> 4; n |= n >> 8; n |= n >> 16; return n + 1; } set<int> highx; vector<ll> segy; vector<ll> segx; int n; int N; ll mod = 1e9 + 7; ll solve(){ ll sofar = 1; ll ans = 0; int ydemx = N + n-1; highx.insert(0); for (auto it = highx.rbegin(); it != highx.rend(); it++){ int i = *it; ll x = segx[N + i]; int l = N + i; int r = N + n - 1; ll y = segy[N + i]; int ydex = N + i; while (l <= r){ if (l % 2 == 1){ if (y < segy[l]){ y = segy[l]; ydex = l; } l++; } if (r % 2 == 0){ if (y < segy[r]){ y = segy[r]; ydex = r; } r--; } l /= 2; r /= 2; } if (y > ans){ ans = y; ydemx = ydex; } ans *= x; sofar *= x; if (sofar >= mod) break; } while (ydemx < N){ if (segy[ydemx] == segy[ydemx << 1]){ ydemx = ydemx << 1; } else { ydemx = (ydemx << 1) | 1; } } ll toret = 1; int lto = N; int rto = ydemx; while (lto <= rto){ if (lto % 2 == 1){ toret = toret * segx[lto] % mod; lto++; } if (rto % 2 == 0){ toret = toret * segx[rto] % mod; rto--; } lto /= 2; rto /= 2; } toret = toret * segy[ydemx] % mod; return toret; } int init(int np, int X[], int Y[]) { n = np; N = pow2ceil(n); segx.resize(2 * N); segy.resize(2 * N); for (int i = 0; i < n; i++) { segx[N + i] = X[i]; segy[N + i] = Y[i]; } for (int i = N - 1; i > 0; i--) { segx[i] = segx[i << 1] * segx[(i << 1) | 1] % mod; segy[i] = max(segy[i << 1], segy[(i << 1) | 1]); } for (int i = 0; i < n; i++) { if (X[i] > 1) { highx.insert(i); } } return solve(); } int updateX(int pos, int val) { if (highx.find(pos) != highx.end()){ highx.erase(pos); } if (val > 1){ highx.insert(pos); } segx[N + pos] = val; int i = N + pos; i /= 2; while (i > 0){ segx[i] = segx[i << 1] * segx[(i << 1) | 1] % mod; i /= 2; } return solve(); } int updateY(int pos, int val) { segy[N + pos] = val; int i = N + pos; i /= 2; while (i > 0){ segy[i] = max(segy[i << 1], segy[(i << 1) | 1]); i /= 2; } return solve(); } #ifdef LOCAL static char _buffer[1024]; static int _currentChar = 0; static int _charsNumber = 0; static FILE *_inputFile, *_outputFile; static inline int _read() { if (_charsNumber < 0) { exit(1); } if (!_charsNumber || _currentChar == _charsNumber) { _charsNumber = (int)fread(_buffer, sizeof(_buffer[0]), sizeof(_buffer), _inputFile); _currentChar = 0; } if (_charsNumber <= 0) { return -1; } return _buffer[_currentChar++]; } static inline int _readInt() { int c, x, s; c = _read(); while (c <= 32) c = _read(); x = 0; s = 1; if (c == '-') { s = -1; c = _read(); } while (c > 32) { x *= 10; x += c - '0'; c = _read(); } if (s < 0) x = -x; return x; } int main() { _inputFile = fopen("horses.in", "rb"); _outputFile = fopen("horses.out", "w"); int N; N = _readInt(); int *X = (int*)malloc(sizeof(int)*(unsigned int)N); int *Y = (int*)malloc(sizeof(int)*(unsigned int)N); for (int i = 0; i < N; i++) { X[i] = _readInt(); } for (int i = 0; i < N; i++) { Y[i] = _readInt(); } fprintf(_outputFile,"%d\n",init(N,X,Y)); int M; M = _readInt(); for (int i = 0; i < M; i++) { int type; type = _readInt(); int pos; pos = _readInt(); int val; val = _readInt(); if (type == 1) { fprintf(_outputFile,"%d\n",updateX(pos,val)); } else if (type == 2) { fprintf(_outputFile,"%d\n",updateY(pos,val)); } } return 0; } #endif
#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...