Submission #1223108

#TimeUsernameProblemLanguageResultExecution timeMemory
1223108kunzaZa183Horses (IOI15_horses)C++20
0 / 100
1597 ms47980 KiB
#include "horses.h" #include <bits/stdc++.h> using namespace std; using ll = long long; const int MOD = 1e9 + 7; const int mn = 5e5; int maxy[4 * mn]; void umy(int curin, int curl, int curr, int in, int val) { if (curl == curr) { maxy[curin] = val; return; } int mid = (curl + curr) / 2; if (in <= mid) umy(curin * 2 + 1, curl, (curl + curr) / 2, in, val); else umy(curin * 2 + 2, (curl + curr) / 2 + 1, curr, in, val); maxy[curin] = max(maxy[curin * 2 + 1], maxy[curin * 2 + 2]); } int qmy(int curin, int curl, int curr, int ql, int qr) { if (curl > qr || curr < ql) return -1; if (curl == curr) { return maxy[curin]; } return max(qmy(curin * 2 + 1, curl, (curl + curr) / 2, ql, qr), qmy(curin * 2 + 2, (curl + curr) / 2 + 1, curr, ql, qr)); } ll totval[4 * mn]; void utl(int curin, int curl, int curr, int in, int val) { if (curl == curr) { totval[curin] = val; return; } int mid = (curl + curr) / 2; if (in <= mid) utl(curin * 2 + 1, curl, (curl + curr) / 2, in, val); else utl(curin * 2 + 2, (curl + curr) / 2 + 1, curr, in, val); totval[curin] = totval[curin * 2 + 1] * totval[curin * 2 + 2] % MOD; } ll qtl(int curin, int curl, int curr, int ql, int qr) { if (ql > curr || qr < curl) return 1; if (curl == curr) { return totval[curin]; } ll a = qtl(curin * 2 + 1, curl, (curl + curr) / 2, ql, qr), b = qtl(curin * 2 + 2, (curl + curr) / 2 + 1, curr, ql, qr); return a * b % MOD; } int n; vector<ll> x, y; set<int, greater<int>> sigi; int ans() { // cout << "X: "; // for (int i = 0; i < n; i++) { // cout << x[i] << ' '; // } // cout << "\n"; // // cout << "Y: "; // for (int i = 0; i < n; i++) { // cout << y[i] << ' '; // } // cout << "\n"; ll maxyval = qmy(0, 0, n - 1, *sigi.begin(), n - 1); int maxin = *sigi.begin(); // cout << "FIRSTMAXIN = " << maxin << "\n"; auto it = sigi.begin(); int prev = *it; ll diff = x[*it]; int ct = 0; for (++it; it != sigi.end(); it++) { int yval = qmy(0, 0, n - 1, *it, prev - 1); ct++; assert(ct<=35); // cout << *it << " " << prev << '\n'; // cout << "Curin " << curin << " " << maxin << "\n"; // cout << "Diff = " << diff << "\n"; if (diff * maxyval >= MOD) return qtl(0, 0, n - 1, 0, maxin) * maxyval % MOD; if (diff * maxyval < yval) { maxyval = yval; maxin = *it; diff = 1; } diff *= x[*it]; prev = *it; } // cout << "MAXIN = " << maxin << "\n"; return qtl(0, 0, n - 1, 0, maxin) * maxyval % MOD; } int init(int N, int X[], int Y[]) { n = N; y = x = vector<ll>(n); for (int i = 0; i < n; i++) { umy(0, 0, n - 1, i, Y[i]); utl(0, 0, n - 1, i, X[i]); x[i] = X[i], y[i] = Y[i]; } for (int i = 0; i < n; i++) if (X[i] >= 2) sigi.insert(i); return ans(); } int updateX(int pos, int val) { utl(0, 0, n - 1, pos, val); int orig = x[pos]; x[pos] = val; if ((orig >= 2) == (val >= 2)) return ans(); if (orig >= 2) sigi.erase(pos); else sigi.insert(pos); return ans(); } int updateY(int pos, int val) { umy(0, 0, n - 1, pos, val); y[pos] = val; return ans(); }
#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...