답안 #890670

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
890670 2023-12-21T18:20:09 Z AkibAzmain 말 (IOI15_horses) C++17
0 / 100
244 ms 48612 KB
#include <bits/stdc++.h>
#include "horses.h"
using namespace std;
using ll = long long;

const ll MOD = ((ll) 1e9) + 7;

ll n;
vector < ll > ma;
vector < ll > bit;
int sts = 1;
vector < ll > mst;
set < ll > cs;

ll
binpow (ll a, ll b)
{
  ll ans = 1, ac = a;
  while (b)
    {
      if (b % 2) (ans *= ac) %= MOD;
      b /= 2;
      if (b) (ac *= a) %= MOD;
    }
  return ans;
}

ll
bitp (ll x)
{
  ll ans = 1;
  while (x >= 0)
    {
      (ans *= bit[x]) %= MOD;
      x -= (x + 1) & -(x + 1);
    }
  return ans;
}

ll
bitr (ll l, ll r)
{
  ll ans = bitp (r);
  if (l) (ans *= binpow (bitp (l - 1), MOD - 2)) %= MOD;
  return ans;
}

ll
stm (ll l, ll r)
{
  l += sts, r += sts;
  ll mx = -1;
  while (l <= r)
    {
      if (l % 2 == 1) mx = max (mx, mst[l++]);
      if (r % 2 == 0) mx = max (mx, mst[r--]);
      l /= 2, r /= 2;
    }
  return mx;
}

int
calc ()
{
  auto it = cs.end (), pit = prev (it);
  ll vl = 0;
  while (vl < MOD)
    {
      --it, --pit;
      vl = max (vl, mst[*it]);
      vl *= ma[*it];
      if (*it && *pit + 1 <= *it - 1)
        vl = max (mst[*it], stm (*pit + 1, *it - 1));
      if (!*it) break;
    }
  vl %= MOD;
  if (*it)
    (vl *= bitp (*it - 1)) %= MOD;
  return vl;
}

int init(int N, int x[], int y[]) {
  n = N;
  ma.resize (n);
  bit.resize (n);
  while (sts < n) sts *= 2;
  mst.resize (sts * 2);
  for (int i = 0; i < n; ++i)
    {
      if (x[i] > 1) cs.insert (i);
      ma[i] = x[i];
      mst[sts + i] = y[i];
      bit[i] = x[i] * (i ? bitr (i - ((i + 1) & -(i + 1)) + 1, i - 1) : 1ll);
    }
  for (int i = sts - 1; i > 0; --i) mst[i] = max (mst[i * 2], mst[i * 2 + 1]);
  cs.insert (0);
  cs.insert (n - 1);
  return calc ();
}

int updateX(int pos, int val) {
  cs.erase (pos);
  if (val > 1) cs.insert (pos);
  ma[pos] = val;
  bit[pos] = val * (val ? bitr (pos - ((pos + 1) & -(pos + 1)) + 1, pos - 1) : 1ll);
  cs.insert (0);
  cs.insert (n - 1);
  return calc ();
}

int updateY(int pos, int val) {
  int i = sts + pos;
  mst[i] = val;
  for (i /= 2; i > 0; i /= 2) mst[i] = max (mst[i * 2], mst[i * 2 + 1]);
  return calc ();
}

Compilation message

horses.cpp: In function 'int calc()':
horses.cpp:79:10: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
   79 |   return vl;
      |          ^~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 348 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 348 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 244 ms 48612 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 348 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 348 KB Output isn't correct
2 Halted 0 ms 0 KB -