제출 #890854

#제출 시각아이디문제언어결과실행 시간메모리
890854NeroZein말 (IOI15_horses)C++17
100 / 100
1271 ms60956 KiB
#include "horses.h" #include "bits/stdc++.h" using namespace std; const int N = 5e5 + 5; const int md = (int) 1e9 + 7; struct node { long double mx = 0, lazy = 0; }; struct node2 { int ans = 1, lazy = 1; }; int n; int x[N], y[N]; node seg[N * 2]; node2 seg2[N * 2]; int mul(int a, int b) { return (int) ((long long) a * b % md); } inline int inv(int a) { a %= md; if (a < 0) a += md; int b = md, u = 0, v = 1; while (a) { int t = b / a; b -= t * a; swap(a, b); u -= t * v; swap(u, v); } assert(b == 1); if (u < 0) u += md; return u; } void push(int nd, int l, int r) { if (!seg[nd].lazy) return; seg[nd].mx += seg[nd].lazy; if (l != r) { int mid = (l + r) >> 1; int rs = nd + ((mid - l + 1) << 1); seg[nd + 1].lazy += seg[nd].lazy; seg[rs].lazy += seg[nd].lazy; } seg[nd].lazy = 0; } void push2(int nd, int l, int r) { if (seg2[nd].lazy == 1) return; if (l == r) { seg2[nd].ans = mul(seg2[nd].ans, seg2[nd].lazy); } else { int mid = (l + r) >> 1; int rs = nd + ((mid - l + 1) << 1); seg2[nd + 1].lazy = mul(seg2[nd + 1].lazy, seg2[nd].lazy); seg2[rs].lazy = mul(seg2[rs].lazy, seg2[nd].lazy); } seg2[nd].lazy = 1; } void upd(int nd, int l, int r, int s, int e, long double v) { push(nd, l, r); if (l >= s && r <= e) { seg[nd].lazy = v; push(nd, l, r); return; } int mid = (l + r) >> 1; int rs = nd + ((mid - l + 1) << 1); if (mid >= e) { upd(nd + 1, l, mid, s, e, v); push(rs, mid + 1, r); } else { if (mid < s) { upd(rs, mid + 1, r, s, e, v); push(nd + 1, l, mid); } else { upd(nd + 1, l, mid, s, e, v); upd(rs, mid + 1, r, s, e, v); } } seg[nd].mx = max(seg[nd + 1].mx, seg[rs].mx); } void upd2(int nd, int l, int r, int s, int e, int v) { push2(nd, l, r); if (l >= s && r <= e) { seg2[nd].lazy = v; push2(nd, l, r); return; } int mid = (l + r) >> 1; int rs = nd + ((mid - l + 1) << 1); if (mid >= e) { upd2(nd + 1, l, mid, s, e, v); push2(rs, mid + 1, r); } else { if (mid < s) { upd2(rs, mid + 1, r, s, e, v); push2(nd + 1, l, mid); } else { upd2(nd + 1, l, mid, s, e, v); upd2(rs, mid + 1, r, s, e, v); } } } int get(int nd, int l, int r) { if (l == r) { return l; } int mid = (l + r) >> 1; int rs = nd + ((mid - l + 1) << 1); push(nd + 1, l, mid); push(rs, mid + 1, r); if (seg[nd + 1].mx < seg[rs].mx) { return get(rs, mid + 1, r); } else { return get(nd + 1, l, mid); } } int get2(int nd, int l, int r, int p) { push2(nd, l, r); if (l == r) { return seg2[nd].ans; } int mid = (l + r) >> 1; int rs = nd + ((mid - l + 1) << 1); if (p <= mid) { return get2(nd + 1, l, mid, p); } else { return get2(rs, mid + 1, r, p); } } int init(int N_, int X[], int Y[]) { n = N_; for (int i = 0; i < n; ++i) { x[i] = X[i]; y[i] = Y[i]; upd(0, 0, n - 1, i, i, log2(1.0L * y[i])); upd2(0, 0, n - 1, i, i, y[i]); upd(0, 0, n - 1, i, n - 1, log2(1.0L * x[i])); upd2(0, 0, n - 1, i, n - 1, x[i]); } return get2(0, 0, n - 1, get(0, 0, n - 1)); } int updateX(int pos, int val) { upd(0, 0, n - 1, pos, n - 1, -log2(1.0L * x[pos])); upd2(0, 0, n - 1, pos, n - 1, inv(x[pos])); x[pos] = val; upd(0, 0, n - 1, pos, n - 1, +log2(1.0L * x[pos])); upd2(0, 0, n - 1, pos, n - 1, x[pos]); return get2(0, 0, n - 1, get(0, 0, n - 1)); } int updateY(int pos, int val) { upd(0, 0, n - 1, pos, pos, -log2(1.0L * y[pos])); upd2(0, 0, n - 1, pos, pos, inv(y[pos])); y[pos] = val; upd(0, 0, n - 1, pos, pos, +log2(1.0L * y[pos])); upd2(0, 0, n - 1, pos, pos, y[pos]); return get2(0, 0, n - 1, get(0, 0, n - 1)); }
#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...