Submission #726518

#TimeUsernameProblemLanguageResultExecution timeMemory
726518becaidoHorses (IOI15_horses)C++17
17 / 100
239 ms113616 KiB
#ifndef WAIMAI #include "horses.h" #endif #include <bits/stdc++.h> using namespace std; #define lpos pos*2 #define rpos pos*2+1 const int MOD = 1e9 + 7; const int SIZE = 5e5 + 5; struct Node { int pro = 1; long double sum = 0, mx = 0; Node operator + (const Node& rhs) const { Node re; re.pro = 1ll * pro * rhs.pro % MOD; re.sum = sum + rhs.sum; re.mx = max(mx, sum + rhs.mx); return re; } }; vector<Node> node; int n; vector<int> y; void upd(int pos, int l, int r, int p, int ty, int x) { if (l == r) { if (ty == 1) { node[pos].pro = x; node[pos].sum = log2((long double) x); } if (ty == 2) { node[pos].mx = node[pos].sum + log2((long double) (y[p] = x)); } return; } int mid = (l + r) / 2; if (p <= mid) upd(lpos, l, mid, p, ty, x); else upd(rpos, mid + 1, r, p, ty, x); node[pos] = node[lpos] + node[rpos]; } int que(int pos, int l, int r, int cur = 1) { if (l == r) return 1ll * cur * node[pos].pro % MOD * y[l] % MOD; int mid = (l + r) / 2; if (node[lpos].mx >= node[lpos].sum + node[rpos].mx) return que(lpos, l, mid, cur); else return que(rpos, mid + 1, r, 1ll * cur * node[lpos].pro % MOD); } void build(int pos, int l, int r, int X[], int Y[]) { if (l == r) { node[pos].pro = X[l]; node[pos].sum = log2((long double) X[l]); node[pos].mx = node[pos].sum + log2((long double) (y[l] = Y[l])); return; } int mid = (l + r) / 2; build(lpos, l, mid, X, Y); build(rpos, mid + 1, r, X, Y); node[pos] = node[lpos] + node[rpos]; } int init(int N, int X[], int Y[]) { n = N; node.resize(4 * n); y.resize(n); build(1, 0, n - 1, X, Y); return que(1, 0, n - 1); } int updateX(int pos, int val) { upd(1, 0, n - 1, pos, 1, val); return que(1, 0, n - 1); } int updateY(int pos, int val) { upd(1, 0, n - 1, pos, 2, val); return que(1, 0, n - 1); }

Compilation message (stderr)

horses.cpp: In member function 'Node Node::operator+(const Node&) const':
horses.cpp:18:38: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
   18 |         re.pro = 1ll * pro * rhs.pro % MOD;
      |                  ~~~~~~~~~~~~~~~~~~~~^~~~~
horses.cpp: In function 'int que(int, int, int, int)':
horses.cpp:47:63: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
   47 |     if (l == r) return 1ll * cur * node[pos].pro % MOD * y[l] % MOD;
      |                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
horses.cpp:50:66: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
   50 |     else return que(rpos, mid + 1, r, 1ll * cur * node[lpos].pro % MOD);
      |                                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
#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...