제출 #1005212

#제출 시각아이디문제언어결과실행 시간메모리
1005212coolboy19521말 (IOI15_horses)C++17
17 / 100
1588 ms83544 KiB
#include"bits/stdc++.h" #include"horses.h" #define ld long double #define i64 long long using namespace std; const int sz = 5e5 + 25; const int md = 1e9 + 7; i64 lz1m[sz * 4], lz1d[sz * 4]; i64 st1[sz * 4]; ld lz2m[sz * 4], lz2d[sz * 4]; pair<ld,int> st2[sz * 4]; ld d[sz]; int a[sz], b[sz], c[sz]; int n; i64 bp(int x, int b) { if (0 == b) return 1; i64 r = bp(x, b / 2) % md; if (b % 2) return (r * r % md) * x % md; return r * r % md; } void build1(int le, int ri, int v) { lz1m[v] = 1; lz1d[v] = 1; if (le == ri) { st1[v] = c[le] * b[le] % md; return; } int mi = le + (ri - le) / 2; build1(le, mi, v * 2); build1(mi + 1, ri, v * 2 + 1); } void relax1(int v) { // cout << "PREV " << st1[v] << ' ' << lz1m[v] << ' ' << lz1d[v] << '\n'; (st1[v] *= lz1m[v]) %= md; // cout << "AFTER MULT " << st1[v] << '\n'; (st1[v] *= bp(lz1d[v], md - 2)) %= md; // cout << "NOW " << st1[v] << ' ' << bp(5, md - 2) << '\n'; if (v * 2 < sz * 4) { lz1m[v * 2] *= lz1m[v]; lz1m[v * 2 + 1] *= lz1m[v]; lz1d[v * 2] *= lz1d[v]; lz1d[v * 2 + 1] *= lz1d[v]; } lz1m[v] = 1; lz1d[v] = 1; } void rupdate1(int le, int ri, int ql, int qr, int v, int m, int d) { relax1(v); if (le > qr || ri < ql) return; if (ql <= le && ri <= qr) { // cout << "RANGE UPDATE " << le << ' ' << ri << ' ' << m << ' ' << d << '\n'; lz1m[v] *= m; lz1d[v] *= d; relax1(v); return; } int mi = le + (ri - le) / 2; rupdate1(le, mi, ql, qr, v * 2, m, d); rupdate1(mi + 1, ri, ql, qr, v * 2 + 1, m, d); } void pupdate1(int le, int ri, int ix, int v, int m, int d) { relax1(v); if (le > ix || ri < ix) return; if (le == ix && ix == ri) { (st1[v] *= m) %= md; (st1[v] *= bp(d, md - 2)) %= md; return; } int mi = le + (ri - le) / 2; pupdate1(le, mi, ix, v * 2, m, d); pupdate1(mi + 1, ri, ix, v * 2 + 1, m, d); } int query1(int le, int ri, int ix, int v) { relax1(v); if (le > ix || ri < ix) return 0; if (le == ix && ix == ri) { return st1[v]; } int mi = le + (ri - le) / 2; int lq = query1(le, mi, ix, v * 2); int rq = query1(mi + 1, ri, ix, v * 2 + 1); return lq + rq; } pair<ld,int> marj(int v) { auto le = st2[v * 2]; auto ri = st2[v * 2 + 1]; if (le.first > ri.first) { return le; } return ri; } void build2(int le, int ri, int v) { if (le == ri) { st2[v] = make_pair(d[le] + log10l(b[le]), le); return; } int mi = le + (ri - le) / 2; build2(le, mi, v * 2); build2(mi + 1, ri, v * 2 + 1); st2[v] = marj(v); } void relax2(int v) { st2[v].first += lz2m[v]; st2[v].first -= lz2d[v]; if (v * 2 < sz * 4) { lz2m[v * 2] += lz2m[v]; lz2m[v * 2 + 1] += lz2m[v]; lz2d[v * 2] += lz2d[v]; lz2d[v * 2 + 1] += lz2d[v]; } lz2m[v] = 0; lz2d[v] = 0; } void rupdate2(int le, int ri, int ql, int qr, int v, ld m, ld d) { relax2(v); if (le > qr || ri < ql) return; if (ql <= le && ri <= qr) { lz2m[v] += m; lz2d[v] += d; relax2(v); return; } int mi = le + (ri - le) / 2; rupdate2(le, mi, ql, qr, v * 2, m, d); rupdate2(mi + 1, ri, ql, qr, v * 2 + 1, m, d); st2[v] = marj(v); } void pupdate2(int le, int ri, int ix, int v, ld m, ld d) { relax2(v); if (le > ix || ri < ix) return; if (le == ix && ri == ix) { st2[v].first += m; st2[v].first -= d; return; } int mi = le + (ri - le) / 2; pupdate2(le, mi, ix, v * 2, m, d); pupdate2(mi + 1, ri, ix, v * 2 + 1, m, d); st2[v] = marj(v); } int init(int N, int x[], int y[]) { n = N; c[0] = 1; for (int i = 1; i <= n; i ++) { a[i] = x[i - 1]; b[i] = y[i - 1]; c[i] = c[i - 1] * a[i] % md; d[i] = d[i - 1] + log10l(a[i]); } build1(1, n, 1); build2(1, n, 1); int ix = st2[1].second; // cout << "BEGIN " << ix << '\n'; return query1(1, n, ix, 1); } int updateX(int pos, int val) { pos ++; rupdate1(1, n, pos, n, 1, val, a[pos]); rupdate2(1, n, pos, n, 1, log10l(val), log10l(a[pos])); a[pos] = val; relax2(1); int ix = st2[1].second; // cout << "QUERY X " << ix << ' ' << st2[1].first << '\n'; return query1(1, n, ix, 1); } int updateY(int pos, int val) { pos ++; pupdate1(1, n, pos, 1, val, b[pos]); pupdate2(1, n, pos, 1, log10l(val), log10l(b[pos])); b[pos] = val; relax2(1); int ix = st2[1].second; return query1(1, n, ix, 1); }

컴파일 시 표준 에러 (stderr) 메시지

horses.cpp: In function 'long long int bp(int, int)':
horses.cpp:19:19: warning: declaration of 'b' shadows a global declaration [-Wshadow]
   19 | i64 bp(int x, int b) {
      |               ~~~~^
horses.cpp:16:12: note: shadowed declaration is here
   16 | int a[sz], b[sz], c[sz];
      |            ^
horses.cpp: In function 'void relax1(int)':
horses.cpp:42:22: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
   42 |  (st1[v] *= bp(lz1d[v], md - 2)) %= md;
      |                ~~~~~~^
horses.cpp: In function 'void rupdate1(int, int, int, int, int, int, int)':
horses.cpp:55:65: warning: declaration of 'd' shadows a global declaration [-Wshadow]
   55 | void rupdate1(int le, int ri, int ql, int qr, int v, int m, int d) {
      |                                                             ~~~~^
horses.cpp:15:4: note: shadowed declaration is here
   15 | ld d[sz];
      |    ^
horses.cpp: In function 'void pupdate1(int, int, int, int, int, int)':
horses.cpp:70:57: warning: declaration of 'd' shadows a global declaration [-Wshadow]
   70 | void pupdate1(int le, int ri, int ix, int v, int m, int d) {
      |                                                     ~~~~^
horses.cpp:15:4: note: shadowed declaration is here
   15 | ld d[sz];
      |    ^
horses.cpp: In function 'int query1(int, int, int, int)':
horses.cpp:87:15: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
   87 |   return st1[v];
      |          ~~~~~^
horses.cpp: In function 'void rupdate2(int, int, int, int, int, long double, long double)':
horses.cpp:128:63: warning: declaration of 'd' shadows a global declaration [-Wshadow]
  128 | void rupdate2(int le, int ri, int ql, int qr, int v, ld m, ld d) {
      |                                                               ^
horses.cpp:15:4: note: shadowed declaration is here
   15 | ld d[sz];
      |    ^
horses.cpp: In function 'void pupdate2(int, int, int, int, long double, long double)':
horses.cpp:143:55: warning: declaration of 'd' shadows a global declaration [-Wshadow]
  143 | void pupdate2(int le, int ri, int ix, int v, ld m, ld d) {
      |                                                       ^
horses.cpp:15:4: note: shadowed declaration is here
   15 | ld d[sz];
      |    ^
#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...