Submission #999647

#TimeUsernameProblemLanguageResultExecution timeMemory
999647AlfraganusHorses (IOI15_horses)C++17
17 / 100
1506 ms20384 KiB
#include "horses.h" #include <bits/stdc++.h> using namespace std; const long long mod = 1e9 + 7; vector<long long> x, y; struct SegTree { int size = 1; vector<long long> pr; void init(){ while(size < (int)x.size()) size <<= 1; pr.resize(size << 1, 1); build(0, 0, size); } void build(int ind, int lx, int rx){ if(lx + 1 == rx){ if(lx < x.size()) pr[ind] = x[lx]; return; } int mid = (lx + rx) >> 1; build((ind << 1) + 1, lx, mid); build((ind << 1) + 2, mid, rx); pr[ind] = (pr[(ind << 1) + 1] * pr[(ind << 1) + 2]) % mod; } long long get(int l, int r, int ind, int lx, int rx){ if(l <= lx and rx <= r) return pr[ind]; if(r <= lx or rx <= l) return 1ll; int mid = (lx + rx) >> 1; return (get(l, r, (ind << 1) + 1, lx, mid) * get(l, r, (ind << 1) + 2, mid, rx)) % mod; } long long get(int l, int r){ long long ans = 1; for(int i = l; i < r; i ++) ans = (ans * x[i]) % mod; long long y = get(l, r, 0, 0, size); if(ans != y){ while(1){ } } return y; } }; SegTree s; int init(int n, int X[], int Y[]) { x.resize(n); y.resize(n); for(int i = 0; i < n; i ++) x[i] = X[i], y[i] = Y[i]; s.init(); long long y1 = 0, p = 1, ans = 1; for(int i = n - 1; i >= 0; i --){ if(p > 1e9 or y1 * p > 1e9) return ans; if(y[i] > y1 * p){ y1 = y[i]; p = 1; ans = (y1 * s.get(0, i + 1)) % mod; } p = p * x[i]; } return ans; } int updateX(int pos, int val) { x[pos] = val; long long ans = 1, p = 1; for(int i = 0; i < (int)x.size(); i ++) p = (p * x[i]) % mod, ans = (max(ans, p * y[i])) % mod; int res = ans; return res; } int updateY(int pos, int val) { y[pos] = val; long long ans = 1, p = 1; for(int i = 0; i < (int)y.size(); i ++) p = (p * x[i]) % mod, ans = (max(ans, p * y[i])) % mod; int res = ans; return res; }

Compilation message (stderr)

horses.cpp: In member function 'void SegTree::build(int, int, int)':
horses.cpp:22:10: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   22 |    if(lx < x.size())
      |       ~~~^~~~~~~~~~
horses.cpp: In member function 'long long int SegTree::get(int, int)':
horses.cpp:45:13: warning: declaration of 'y' shadows a global declaration [-Wshadow]
   45 |   long long y = get(l, r, 0, 0, size);
      |             ^
horses.cpp:6:22: note: shadowed declaration is here
    6 | vector<long long> x, y;
      |                      ^
horses.cpp: In function 'int init(int, int*, int*)':
horses.cpp:65:6: warning: conversion from 'long long int' to 'double' may change value [-Wconversion]
   65 |   if(p > 1e9 or y1 * p > 1e9)
      |      ^
horses.cpp:65:20: warning: conversion from 'long long int' to 'double' may change value [-Wconversion]
   65 |   if(p > 1e9 or y1 * p > 1e9)
      |                 ~~~^~~
horses.cpp:66:11: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
   66 |    return ans;
      |           ^~~
horses.cpp:74:9: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
   74 |  return ans;
      |         ^~~
horses.cpp: In function 'int updateX(int, int)':
horses.cpp:82:12: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
   82 |  int res = ans;
      |            ^~~
horses.cpp: In function 'int updateY(int, int)':
horses.cpp:91:12: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
   91 |  int res = ans;
      |            ^~~
#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...