Submission #221807

#TimeUsernameProblemLanguageResultExecution timeMemory
221807patrikpavic2Horses (IOI15_horses)C++17
100 / 100
1020 ms88312 KiB
/** * user: ppavic * fname: Patrik * lname: Pavić * task: horses * score: 100.0 * date: 2019-06-23 09:59:51.864112 */ #include "horses.h" #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> #include <set> #include <vector> #define PB push_back using namespace std; typedef __int128 ll; typedef pair < int, int > pii; typedef vector < int > vi; const int OFF = (1 << 19); const ll MOD = 1e9 + 7; const int N = 1e6 + 500; ll mul[2 * OFF]; ll mx[2 * OFF], n, X[N], Y[N]; set < int > s; vi v; ll query_mul(int i,int a,int b,int lo,int hi){ if(lo <= a && b <= hi) return mul[i]; if(a > hi || b < lo) return 1; return query_mul(2 * i, a, (a + b) / 2, lo, hi) * query_mul(2 * i + 1, (a + b) / 2 + 1, b, lo, hi) % MOD; } ll query_mx(int i,int a,int b,int lo,int hi){ if(lo <= a && b <= hi) return mx[i]; if(a > hi || b < lo) return 1; return max(query_mx(2 * i, a, (a + b) / 2, lo, hi), query_mx(2 * i + 1, (a + b) / 2 + 1, b, lo, hi)); } void update_mul(int i,ll X){ if(mul[OFF + i] > 1) s.erase(i); if(X > 1) s.insert(i); mul[OFF + i] = X; for(i = (i + OFF) / 2; i ; i /= 2) mul[i] = mul[2 * i] * mul[2 * i + 1] % MOD; } void update_mx(int i, ll Y){ mx[OFF + i] = Y; for(i = (i + OFF) / 2; i ; i /= 2) mx[i] = max(mx[2 * i], mx[2 * i + 1]); } ll solve(){ ll cur = 1, sol = 1; vi v; auto it = s.rbegin(); v.PB(n); //printf("s %d\n", s.size()); for(; v.size() <= s.size() && cur < MOD;){ v.PB(*it); cur *= X[*it]; it++; if(cur >= (ll)MOD) break; } reverse(v.begin(), v.end()); cur = 1; for(int i = 0;i + 1 < v.size();i++){ cur *= (ll)X[v[i]]; //printf("cur %lld mx %lld\n", cur, query_mx(1, 0, OFF - 1,v[i], v[i + 1] - 1)); sol = max(sol, cur * query_mx(1, 0, OFF - 1,v[i], v[i + 1] - 1)); } //printf("gotov\n"); if(v.size() > s.size()) return max(sol, (ll)mx[1]) % MOD; return sol % (ll)MOD * query_mul(1, 0, OFF - 1, 0, v[0] - 1) % MOD; } int init(int N, int XX[], int YY[]) { for(int i = 0;i < N;i++) X[i] = XX[i], Y[i] = YY[i]; n = N; for(int i = 0;i < n;i++) update_mul(i, X[i]), update_mx(i, Y[i]); return solve(); } int updateX(int pos, int val) { update_mul(pos, val); X[pos] = val; return solve(); } int updateY(int pos, int val) { update_mx(pos, val); Y[pos] = val; return solve(); }

Compilation message (stderr)

horses.cpp: In function 'void update_mul(int, ll)':
horses.cpp:46:27: warning: declaration of 'X' shadows a global declaration [-Wshadow]
 void update_mul(int i,ll X){
                           ^
horses.cpp:30:20: note: shadowed declaration is here
 ll mx[2 * OFF], n, X[N], Y[N];
                    ^
horses.cpp: In function 'void update_mx(int, ll)':
horses.cpp:54:27: warning: declaration of 'Y' shadows a global declaration [-Wshadow]
 void update_mx(int i, ll Y){
                           ^
horses.cpp:30:26: note: shadowed declaration is here
 ll mx[2 * OFF], n, X[N], Y[N];
                          ^
horses.cpp: In function 'll solve()':
horses.cpp:62:5: warning: declaration of 'v' shadows a global declaration [-Wshadow]
  vi v;
     ^
horses.cpp:32:4: note: shadowed declaration is here
 vi v;
    ^
horses.cpp:64:8: warning: conversion to 'std::vector<int>::value_type {aka int}' from 'll {aka __int128}' may alter its value [-Wconversion]
  v.PB(n); 
        ^
horses.cpp:72:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0;i + 1 < v.size();i++){
                ~~~~~~^~~~~~~~~~
horses.cpp: In function 'int init(int, int*, int*)':
horses.cpp:83:35: warning: declaration of 'N' shadows a global declaration [-Wshadow]
 int init(int N, int XX[], int YY[]) {
                                   ^
horses.cpp:27:11: note: shadowed declaration is here
 const int N = 1e6 + 500;
           ^
horses.cpp:88:14: warning: conversion to 'int' from 'll {aka __int128}' may alter its value [-Wconversion]
  return solve();
         ~~~~~^~
horses.cpp: In function 'int updateX(int, int)':
horses.cpp:93:14: warning: conversion to 'int' from 'll {aka __int128}' may alter its value [-Wconversion]
  return solve();
         ~~~~~^~
horses.cpp: In function 'int updateY(int, int)':
horses.cpp:98:14: warning: conversion to 'int' from 'll {aka __int128}' may alter its value [-Wconversion]
  return solve();
         ~~~~~^~
#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...