제출 #1004213

#제출 시각아이디문제언어결과실행 시간메모리
1004213coolboy19521말 (IOI15_horses)C++17
17 / 100
94 ms60244 KiB
#include "bits/stdc++.h" #include "horses.h" #define i64 long long using namespace std; const i64 sz = 5e5 + 25; const i64 md = 1e9 + 7; i64 lzm[sz * 4], lzd[sz * 4]; i64 a[sz], b[sz], c[sz]; i64 st[sz * 4]; i64 n; void build(i64 le, i64 ri, i64 v) { if (le == ri) { st[v] = c[le] * b[le] % md; return; } i64 mi = le + (ri - le) / 2; build(le, mi, v * 2); build(mi + 1, ri, v * 2 + 1); st[v] = max(st[v * 2], st[v * 2 + 1]); } void relax(i64 v) { st[v] *= lzm[v]; st[v] /= lzd[v]; st[v] %= md; if (v * 2 < sz * 4) { (lzm[v * 2] *= lzm[v]) %= md; (lzd[v * 2] *= lzd[v]) %= md; } if (v * 2 + 1 < sz * 4) { (lzm[v * 2 + 1] *= lzm[v]) %= md; (lzd[v * 2 + 1] *= lzd[v]) %= md; } lzm[v] = lzd[v] = 1; } void rupdate(i64 le, i64 ri, i64 ql, i64 qr, i64 v, i64 m, i64 d) { relax(v); if (le > qr || ri < ql) return; if (ql <= le && ri <= qr) { lzm[v] = m; lzd[v] = d; relax(v); return; } i64 mi = le + (ri - le) / 2; rupdate(le, mi, ql, qr, v * 2, m, d); rupdate(mi + 1, ri, ql, qr, v * 2 + 1, m, d); st[v] = max(st[v * 2], st[v * 2 + 1]); } void pupdate(i64 le, i64 ri, i64 ix, i64 v, i64 m, i64 d) { relax(v); if (le > ix || ri < ix) return; if (le == ix && ix == ri) { st[v] *= m; st[v] /= d; st[v] %= md; return; } i64 mi = le + (ri - le) / 2; pupdate(le, mi, ix, v * 2, m, d); pupdate(mi + 1, ri, ix, v * 2 + 1, m, d); st[v] = max(st[v * 2], st[v * 2 + 1]); } i64 query(i64 le, i64 ri, i64 ql, i64 qr, i64 v) { relax(v); if (le > qr || ri < ql) { return 0; } if (ql <= le && ri <= qr) { return st[v]; } i64 mi = le + (ri - le) / 2; i64 lq = query(le, mi, ql, qr, v * 2); i64 rq = query(mi + 1, ri, ql, qr, v * 2 + 1); return max(lq, rq); } int init(int N, int X[], int Y[]) { c[0] = 1; n = N; for (int i = 1; i <= N; i ++) { c[i] = c[i - 1] * X[i - 1]; c[i] %= md; a[i] = X[i - 1]; b[i] = Y[i - 1]; } for (int i = 0; i < sz * 4; i ++) { lzm[i] = lzd[i] = 1; } build(1, N, 1); i64 r = query(1, n, 1, n, 1) % md; return (int) r; } int updateX(int pos, int val) { pos ++; rupdate(1, n, pos, n, 1, val, a[pos]); a[pos] = val; i64 r = query(1, n, 1, n, 1) % md; return (int) r; } int updateY(int pos, int val) { pos ++; pupdate(1, n, pos, 1, val, b[pos]); b[pos] = val; i64 r = query(1, n, 1, n, 1) % md; return (int) r; }
#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...