답안 #1026882

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1026882 2024-07-18T12:51:28 Z TraianDanciu 말 (IOI15_horses) C++17
54 / 100
739 ms 84412 KB
#include "horses.h"
#include <math.h>

#define MAXN 500000
#define MOD 1000000007

int euclid(int a, int b, int &x, int &y) {
  int x0, y0, ret;

  if(b == 0) {
    x = 1;
    y = 0;
    return a;
  }

  ret = euclid(b, a % b, x0, y0);
  x = y0;
  y = x0 - a / b * y0;

  return ret;
}

struct Numar {
  double ln;
  int val;

  Numar(int _val) {
    val = _val % MOD;
    ln = log(val);
  }

  Numar() {}

  inline Numar operator *(Numar oth) {
    Numar ret;
    ret.val = 1LL * val * oth.val % MOD;
    ret.ln = ln + oth.ln;
    return ret;
  }

  inline Numar operator /(Numar oth) {
    Numar ret;
    int x, y;
    euclid(oth.val, MOD, x, y);
    x %= MOD;
    if(x < 0) {
      x += MOD;
    }
    ret.val = 1LL * val * x % MOD;
    ret.ln = ln - oth.ln;
    return ret;
  }

  inline bool operator <(Numar oth) {
    return ln < oth.ln;
  }
};

static inline Numar max(Numar a, Numar b) {
  return a < b ? b : a;
}

Numar aint[4 * MAXN], lazy[4 * MAXN], qval;
int n, x[MAXN], y[MAXN], qleft, qright;

void propagate(int node, int left, int right) {
  aint[node] = aint[node] * lazy[node];
  if(left < right) {
    lazy[2 * node + 1] = lazy[2 * node + 1] * lazy[node];
    lazy[2 * node + 2] = lazy[2 * node + 2] * lazy[node];
  }
  lazy[node] = Numar(1);
}

void _update(int node, int left, int right) {
  int middle;

  propagate(node, left, right);
  if(qleft <= left && right <= qright) {
    lazy[node] = lazy[node] * qval;
    propagate(node, left, right);
  } else {
    middle = (left + right) / 2;

    propagate(2 * node + 1, left, middle);
    propagate(2 * node + 2, middle + 1, right);

    if(qleft <= middle) {
      _update(2 * node + 1, left, middle);
    }
    if(middle < qright) {
      _update(2 * node + 2, middle + 1, right);
    }

    aint[node] = max(aint[2 * node + 1], aint[2 * node + 2]);
  }
}
void update(int _qleft, int _qright, Numar _qval) {
  qleft = _qleft;
  qright = _qright;
  qval = _qval;
  _update(0, 0, n - 1);
} 

Numar _query(int node, int left, int right) {
  int middle;
  Numar ans;

  propagate(node, left, right);
  if(qleft <= left && right <= qright) {
    return aint[node];
  }

  middle = (left + right) / 2;
  if(qleft <= middle && middle < qright) {
    ans = max(_query(2 * node + 1, left, middle),
              _query(2 * node + 2, middle + 1, right));
  } else if(qleft <= middle) {
    ans = _query(2 * node + 1, left, middle);
  } else {
    ans = _query(2 * node + 2, middle + 1, right);
  }

  return ans;
}
Numar query(int _qleft, int _qright) {
  qleft = _qleft;
  qright = _qright;
  return _query(0, 0, n - 1);
}

int init(int _n, int _x[], int _y[]) {
  int i;

  n = _n;
  for(i = 0; i < 4 * n; i++) {
    aint[i] = lazy[i] = Numar(1);
  }

  for(i = 0; i < n; i++) {
    x[i] = _x[i];
    update(i, n - 1, Numar(x[i]));
    y[i] = _y[i];
    update(i, i, Numar(y[i]));
  }

  return query(0, n - 1).val;
}

int updateX(int pos, int val) {
  update(pos, n - 1, Numar(val) / Numar(x[pos]));
  x[pos] = val;
  return query(0, n - 1).val;
}

int updateY(int pos, int val) {
  update(pos, pos, Numar(val) / Numar(y[pos]));
  y[pos] = val;
  return query(0, n - 1).val;
}

Compilation message

horses.cpp: In member function 'Numar Numar::operator*(Numar)':
horses.cpp:36:35: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
   36 |     ret.val = 1LL * val * oth.val % MOD;
      |                                   ^
horses.cpp: In member function 'Numar Numar::operator/(Numar)':
horses.cpp:49:29: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
   49 |     ret.val = 1LL * val * x % MOD;
      |                             ^
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 6488 KB Output is correct
2 Correct 1 ms 6504 KB Output is correct
3 Correct 1 ms 6488 KB Output is correct
4 Correct 1 ms 6492 KB Output is correct
5 Correct 1 ms 6492 KB Output is correct
6 Correct 1 ms 6492 KB Output is correct
7 Correct 1 ms 6492 KB Output is correct
8 Correct 1 ms 6492 KB Output is correct
9 Correct 1 ms 6492 KB Output is correct
10 Correct 1 ms 6492 KB Output is correct
11 Correct 1 ms 6492 KB Output is correct
12 Correct 1 ms 6492 KB Output is correct
13 Correct 1 ms 6492 KB Output is correct
14 Correct 1 ms 6492 KB Output is correct
15 Correct 1 ms 6572 KB Output is correct
16 Correct 1 ms 6492 KB Output is correct
17 Correct 0 ms 6492 KB Output is correct
18 Correct 1 ms 6492 KB Output is correct
19 Correct 0 ms 6492 KB Output is correct
20 Correct 1 ms 6492 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 6492 KB Output is correct
2 Correct 1 ms 6492 KB Output is correct
3 Correct 0 ms 6576 KB Output is correct
4 Correct 1 ms 6492 KB Output is correct
5 Correct 1 ms 6492 KB Output is correct
6 Correct 1 ms 6492 KB Output is correct
7 Correct 0 ms 6492 KB Output is correct
8 Correct 1 ms 6492 KB Output is correct
9 Correct 1 ms 6492 KB Output is correct
10 Correct 0 ms 6492 KB Output is correct
11 Correct 0 ms 6492 KB Output is correct
12 Correct 1 ms 6492 KB Output is correct
13 Correct 1 ms 6492 KB Output is correct
14 Correct 0 ms 6492 KB Output is correct
15 Correct 1 ms 6492 KB Output is correct
16 Correct 1 ms 6492 KB Output is correct
17 Correct 0 ms 6492 KB Output is correct
18 Correct 1 ms 6492 KB Output is correct
19 Correct 0 ms 6492 KB Output is correct
20 Correct 1 ms 6492 KB Output is correct
21 Correct 1 ms 6492 KB Output is correct
22 Correct 1 ms 6576 KB Output is correct
23 Correct 2 ms 6492 KB Output is correct
24 Correct 2 ms 6492 KB Output is correct
25 Correct 2 ms 6492 KB Output is correct
26 Correct 1 ms 6608 KB Output is correct
27 Correct 2 ms 6620 KB Output is correct
28 Correct 2 ms 6492 KB Output is correct
29 Correct 2 ms 6492 KB Output is correct
30 Correct 2 ms 6492 KB Output is correct
31 Correct 2 ms 6492 KB Output is correct
32 Correct 2 ms 6492 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 634 ms 72020 KB Output is correct
2 Correct 717 ms 84224 KB Output is correct
3 Correct 690 ms 75460 KB Output is correct
4 Correct 722 ms 79280 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 6492 KB Output is correct
2 Correct 0 ms 6492 KB Output is correct
3 Correct 1 ms 6492 KB Output is correct
4 Correct 0 ms 6492 KB Output is correct
5 Correct 0 ms 6492 KB Output is correct
6 Correct 1 ms 6492 KB Output is correct
7 Correct 1 ms 6492 KB Output is correct
8 Correct 1 ms 6492 KB Output is correct
9 Correct 1 ms 6492 KB Output is correct
10 Correct 1 ms 6492 KB Output is correct
11 Correct 1 ms 6492 KB Output is correct
12 Correct 0 ms 6492 KB Output is correct
13 Correct 0 ms 6492 KB Output is correct
14 Correct 0 ms 6492 KB Output is correct
15 Correct 0 ms 6492 KB Output is correct
16 Correct 0 ms 6492 KB Output is correct
17 Correct 1 ms 6492 KB Output is correct
18 Correct 1 ms 6492 KB Output is correct
19 Correct 0 ms 6492 KB Output is correct
20 Correct 0 ms 6492 KB Output is correct
21 Correct 0 ms 6492 KB Output is correct
22 Correct 1 ms 6600 KB Output is correct
23 Correct 2 ms 6492 KB Output is correct
24 Correct 2 ms 6604 KB Output is correct
25 Correct 2 ms 6492 KB Output is correct
26 Correct 2 ms 6612 KB Output is correct
27 Correct 2 ms 6492 KB Output is correct
28 Correct 2 ms 6492 KB Output is correct
29 Correct 2 ms 6492 KB Output is correct
30 Correct 2 ms 6588 KB Output is correct
31 Correct 2 ms 6620 KB Output is correct
32 Correct 2 ms 6492 KB Output is correct
33 Correct 608 ms 74828 KB Output is correct
34 Correct 583 ms 74792 KB Output is correct
35 Correct 623 ms 81736 KB Output is correct
36 Correct 620 ms 81728 KB Output is correct
37 Correct 615 ms 72868 KB Output is correct
38 Correct 620 ms 73808 KB Output is correct
39 Correct 613 ms 72868 KB Output is correct
40 Correct 595 ms 76872 KB Output is correct
41 Correct 552 ms 72788 KB Output is correct
42 Correct 556 ms 73036 KB Output is correct
43 Incorrect 580 ms 77432 KB Output isn't correct
44 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 6488 KB Output is correct
2 Correct 0 ms 6492 KB Output is correct
3 Correct 0 ms 6492 KB Output is correct
4 Correct 0 ms 6492 KB Output is correct
5 Correct 1 ms 6492 KB Output is correct
6 Correct 1 ms 6492 KB Output is correct
7 Correct 0 ms 6492 KB Output is correct
8 Correct 0 ms 6492 KB Output is correct
9 Correct 0 ms 6492 KB Output is correct
10 Correct 1 ms 6492 KB Output is correct
11 Correct 1 ms 6492 KB Output is correct
12 Correct 0 ms 6492 KB Output is correct
13 Correct 1 ms 6492 KB Output is correct
14 Correct 1 ms 6492 KB Output is correct
15 Correct 1 ms 6492 KB Output is correct
16 Correct 1 ms 6492 KB Output is correct
17 Correct 1 ms 6492 KB Output is correct
18 Correct 1 ms 6492 KB Output is correct
19 Correct 1 ms 6492 KB Output is correct
20 Correct 1 ms 6492 KB Output is correct
21 Correct 0 ms 6492 KB Output is correct
22 Correct 1 ms 6492 KB Output is correct
23 Correct 2 ms 6492 KB Output is correct
24 Correct 1 ms 6492 KB Output is correct
25 Correct 2 ms 6492 KB Output is correct
26 Correct 1 ms 6492 KB Output is correct
27 Correct 1 ms 6492 KB Output is correct
28 Correct 1 ms 6492 KB Output is correct
29 Correct 1 ms 6492 KB Output is correct
30 Correct 2 ms 6492 KB Output is correct
31 Correct 2 ms 6492 KB Output is correct
32 Correct 2 ms 6600 KB Output is correct
33 Correct 626 ms 75588 KB Output is correct
34 Correct 720 ms 84412 KB Output is correct
35 Correct 667 ms 75624 KB Output is correct
36 Correct 739 ms 79444 KB Output is correct
37 Correct 623 ms 74784 KB Output is correct
38 Correct 624 ms 74840 KB Output is correct
39 Correct 637 ms 81712 KB Output is correct
40 Correct 598 ms 81744 KB Output is correct
41 Correct 602 ms 73048 KB Output is correct
42 Correct 591 ms 73852 KB Output is correct
43 Correct 594 ms 73044 KB Output is correct
44 Correct 603 ms 76824 KB Output is correct
45 Correct 576 ms 72788 KB Output is correct
46 Correct 579 ms 73192 KB Output is correct
47 Incorrect 569 ms 77224 KB Output isn't correct
48 Halted 0 ms 0 KB -