제출 #379347

#제출 시각아이디문제언어결과실행 시간메모리
379347pavement말 (IOI15_horses)C++17
100 / 100
1140 ms162796 KiB
#include "horses.h" #include <bits/stdc++.h> using namespace std; typedef long double ld; typedef long long ll; const int MOD = 1e9 + 7; int N, X[500005], Y[500005]; struct node { node *left, *right; int S, E; ld pv; pair<ld, int> val; node(int _s, int _e) : S(_s), E(_e), pv(0) { if (S == E) { val = make_pair(0., S); return; } int M = (S + E) >> 1; left = new node(S, M); right = new node(M + 1, E); val = max(left->val, right->val); } void prop() { if (S == E || pv == 0.) return; left->pv += pv; left->val.first += pv; right->pv += pv; right->val.first += pv; pv = 0.; } void upd(int l, int r, ld v) { if (l > E || r < S) return; if (l <= S && E <= r) { val.first += v; pv += v; return; } prop(); left->upd(l, r, v); right->upd(l, r, v); val = max(left->val, right->val); } } *root; struct node2 { node2 *left, *right; int S, E, val, pv; node2(int _s, int _e) : S(_s), E(_e), val(1), pv(1) { if (S == E) return; int M = (S + E) >> 1; left = new node2(S, M); right = new node2(M + 1, E); } void prop() { if (S == E || pv == 1) return; left->pv = ((ll)left->pv * (ll)pv) % MOD; left->val = ((ll)left->val * (ll)pv) % MOD; right->pv = ((ll)right->pv * (ll)pv) % MOD; right->val = ((ll)right->val * (ll)pv) % MOD; pv = 1; } void upd(int l, int r, int v) { if (l > E || r < S) return; if (l <= S && E <= r) { val = ((ll)val * (ll)v) % MOD; pv = ((ll)pv * (ll)v) % MOD; return; } prop(); left->upd(l, r, v); right->upd(l, r, v); } int qry(int p) { if (S == E) return val; prop(); int M = (S + E) >> 1; if (p <= M) return left->qry(p); else return right->qry(p); } } *root2; ld f(int n) { return log(n) / 9.; } int init(int _N, int _X[], int _Y[]) { N = _N; for (int i = 1; i <= N; i++) X[i] = _X[i - 1]; for (int i = 1; i <= N; i++) Y[i] = _Y[i - 1]; root = new node(1, N); for (int i = 1; i <= N; i++) root->upd(i, N, f(X[i])), root->upd(i, i, f(Y[i])); root2 = new node2(1, N); for (int i = 1; i <= N; i++) root2->upd(i, N, X[i]), root2->upd(i, i, Y[i]); return root2->qry(root->val.second); } ll exp_mod(ll a, ll b) { a %= MOD; b %= (MOD - 1); ll r = 1ll; while (b) { if (b & 1) r = r * a % MOD; a = a * a % MOD; b >>= 1ll; } assert(r <= INT_MAX); return r; } int updateX(int pos, int val) { pos++; root->upd(pos, N, -f(X[pos])); root2->upd(pos, N, exp_mod(X[pos], MOD - 2)); X[pos] = val; root->upd(pos, N, f(X[pos])); root2->upd(pos, N, X[pos]); return root2->qry(root->val.second); } int updateY(int pos, int val) { pos++; root->upd(pos, pos, -f(Y[pos])); root2->upd(pos, pos, exp_mod(Y[pos], MOD - 2)); Y[pos] = val; root->upd(pos, pos, f(Y[pos])); root2->upd(pos, pos, Y[pos]); return root2->qry(root->val.second); }

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

horses.cpp: In member function 'void node2::prop()':
horses.cpp:59:38: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
   59 |   left->pv = ((ll)left->pv * (ll)pv) % MOD;
      |              ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
horses.cpp:60:40: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
   60 |   left->val = ((ll)left->val * (ll)pv) % MOD;
      |               ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
horses.cpp:61:40: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
   61 |   right->pv = ((ll)right->pv * (ll)pv) % MOD;
      |               ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
horses.cpp:62:42: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
   62 |   right->val = ((ll)right->val * (ll)pv) % MOD;
      |                ~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
horses.cpp: In member function 'void node2::upd(int, int, int)':
horses.cpp:68:28: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
   68 |    val = ((ll)val * (ll)v) % MOD;
      |          ~~~~~~~~~~~~~~~~~~^~~~~
horses.cpp:69:26: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
   69 |    pv = ((ll)pv * (ll)v) % MOD;
      |         ~~~~~~~~~~~~~~~~~^~~~~
horses.cpp: In function 'int updateX(int, int)':
horses.cpp:118:28: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
  118 |  root2->upd(pos, N, exp_mod(X[pos], MOD - 2));
      |                     ~~~~~~~^~~~~~~~~~~~~~~~~
horses.cpp: In function 'int updateY(int, int)':
horses.cpp:128:30: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
  128 |  root2->upd(pos, pos, exp_mod(Y[pos], MOD - 2));
      |                       ~~~~~~~^~~~~~~~~~~~~~~~~
#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...