Submission #793782

#TimeUsernameProblemLanguageResultExecution timeMemory
793782PixelCatHorses (IOI15_horses)C++14
17 / 100
1571 ms58344 KiB
#ifdef NYAOWO #include "grader.cpp" #endif #include "horses.h" #include <bits/stdc++.h> #define For(i, a, b) for(int i = a; i <= b; i++) #define Forr(i, a, b) for(int i = a; i >= b; i--) #define F first #define S second #define all(x) x.begin(), x.end() #define sz(x) ((int)x.size()) #define eb emplace_back #define int LL using namespace std; using LL = long long; using pii = pair<int, int>; const int MAXN = 500'000; const int MOD = 1'000'000'007; const int INF = 2'000'000'000; #define L(id) ((id) * 2 + 1) #define R(id) ((id) * 2 + 2) struct SegTree { int a[MAXN * 4 + 10]; int b[MAXN * 4 + 10]; void build() { fill(a, a + sizeof(a) / sizeof(int), 1); fill(b, b + sizeof(b) / sizeof(int), 1); } void upd(int id, int l, int r, int i, int x) { if(l == r) { a[id] = x; b[id] = x; return; } int m = (l + r) / 2; if(i <= m) upd(L(id), l, m, i, x); else upd(R(id), m + 1, r, i, x); a[id] = min(INF, a[L(id)] * a[R(id)]); b[id] = b[L(id)] * b[R(id)] % MOD; } int qry(int id, int l, int r, int L, int R) { if(l >= L && r <= R) return a[id]; int m = (l + r) / 2; int res = 1; if(L <= m) res = min(INF, res * qry(L(id), l, m, L, R)); if(R > m) res = min(INF, res * qry(R(id), m + 1, r, L, R)); return res; } int qry_mod(int id, int l, int r, int L, int R) { if(l >= L && r <= R) return b[id]; int m = (l + r) / 2; int res = 1; if(L <= m) res *= qry(L(id), l, m, L, R); if(R > m) res *= qry(R(id), m + 1, r, L, R); return res % MOD; } } seg; int n; int x[MAXN + 10]; int y[MAXN + 10]; bool smol(const int &a, const int &b) { if(a == b) return false; if(a > b) return !smol(b, a); return y[a] < seg.qry(0, 0, n - 1, a + 1, b) * y[b]; } struct Ayaya { bool operator()(const int &a, const int &b) const { return smol(a, b); } }; set<int, Ayaya> st; int32_t eval(int pos) { return (int32_t)(y[pos] * seg.qry_mod(0, 0, n - 1, 0, pos) % MOD); } int32_t solve() { int pos = *prev(st.end()); // For(i, 0, n - 1) { // cerr << eval(i); // cerr << seg.qry_mod(0, 0, n - 1, 0, i); // cerr << " \n"[i == n - 1]; // } // for(auto &i:st) cerr << i << " "; // cerr << "\n"; return eval(pos); } int32_t init(int32_t N, int32_t X[], int32_t Y[]) { n = N; seg.build(); For(i, 0, n - 1) { x[i] = X[i]; seg.upd(0, 0, n - 1, i, x[i]); } For(i, 0, n - 1) { y[i] = Y[i]; st.insert(i); } return solve(); } int32_t updateX(int32_t pos, int32_t val) { x[pos] = val; seg.upd(0, 0, n - 1, pos, val); return solve(); } int32_t updateY(int32_t pos, int32_t val) { st.erase(pos); y[pos] = val; st.insert(pos); 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...