제출 #1165591

#제출 시각아이디문제언어결과실행 시간메모리
1165591omtheprogrammer1Horses (IOI15_horses)C++20
0 / 100
707 ms70920 KiB
#include <bits/stdc++.h>

using namespace std;
#include "horses.h"

#define endl "\n"
#define ms(arr, v) memset(arr, v, sizeof(arr))
#define mp make_pair
#define pb push_back
#define fix(prec) {cout << setprecision(prec) << fixed;}
#define fastio ios_base::sync_with_stdio(false);cin.tie(NULL); cout.tie(NULL);
#define ins insert
#define f first
#define s second
#define all(v) v.begin(), v.end()
#define sz(v) (ll)v.size()
#define readgraph(list, edges) for (ll i = 0; i < edges; i++) {ll a, b; cin >> a >> b; a--; b--; list[a].pb(b); list[b].pb(a);}
typedef long long ll;
typedef unsigned long long ull;
typedef long double lld;
typedef vector<ll> vi;
typedef pair<ll, ll> pii;
#define F_OR(i, a, b, s) for (ll i=(a); (s)>0?i<(b):i>(b); i+=(s))
#define F_OR1(e) F_OR(i, 0, e, 1)
#define F_OR2(i, e) F_OR(i, 0, e, 1)
#define F_OR3(i, b, e) F_OR(i, b, e, 1)
#define F_OR4(i, b, e, s) F_OR(i, b, e, s)
#define GET5(a, b, c, d, e, ...) e
#define F_ORC(...) GET5(__VA_ARGS__, F_OR4, F_OR3, F_OR2, F_OR1)
#define FOR(...) F_ORC(__VA_ARGS__)(__VA_ARGS__)
#define EACH(x, a) for (auto& x: a)



mt19937 mt_rng(chrono::steady_clock::now().time_since_epoch().count());
ll randint(ll a, ll b) {
  return uniform_int_distribution<ll>(a, b)(mt_rng);
}
/*--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/

const lld pi = 3.14159265358979323846;
const ll mod = 1000000007;
// const ll mod = 998244353;
// ll mod;
const ll INF = 4e18;
const int d4i[4] = { -1, 0, 1, 0}, d4j[4] = {0, 1, 0, -1};
const int d8i[8] = { -1, -1, 0, 1, 1, 1, 0, -1}, d8j[8] = {0, 1, 1, 1, 0, -1, -1, -1};
const int kni[8] = { +2, +2, -2, -2, 1, -1, 1, -1}, knj[8] = {1, -1, 1, -1, 2, 2, -2, -2};

ll n, m, k, q, l, r, x, y, z , h;
const ll tas = 1e6 + 10;
ll a[tas];
ll b[tas];
ll c[tas];
string s, t;
// vector<int> grid[tas];
// vector<pii> edges[tas];
ll ans = 0;

ll ismod = 0;

ll tree1[4 * tas];

void up1(int i, int l, int r, int in, ll val) {
  if (in < l || r < in) {
    return;
  }
  if (l == r) {
    tree1[i] = val;
    return;
  }
  int mid = (l + r) / 2;
  up1(2 * i + 1, l, mid, in, val);
  up1(2 * i + 2, mid + 1, r, in, val);
  tree1[i] = (tree1[2 * i + 1] * tree1[2 * i + 2]) % mod;
}

ll q1(int i, int l, int r, int tl, int tr) {
  if (tr < l || r < tl) {
    return 1;
  }
  if (tl <= l && r <= tr) {
    return tree1[i];
  }
  int mid = (l + r) / 2;
  x = q1(2 * i + 1, l, mid, tl, tr) ;
  y =     q1(2 * i + 2, mid + 1, r, tl, tr);
  if (x * y > ismod) {
    ismod = INF;
  }
  return (x * y) % mod;
}

ll tree2[4 * tas];

void up2(int i, int l, int r, int in, ll val) {
  if (in < l || r < in) {
    return;
  }
  if (l == r) {
    tree2[i] = val;
    return;
  }
  int mid = (l + r) / 2;
  up2(2 * i + 1, l, mid, in, val);
  up2(2 * i + 2, mid + 1, r, in, val);
  tree2[i] = max(tree2[2 * i + 1] , tree2[2 * i + 2]);
}

ll q2(int i, int l, int r, int tl, int tr) {
  if (tr < l || r < tl) {
    return -INF;
  }
  if (tl <= l && r <= tr) {
    // debug(tree2[i])
    return tree2[i];
  }
  int mid = (l + r) / 2;
  return max(q2(2 * i + 1, l, mid, tl, tr) ,
             q2(2 * i + 2, mid + 1, r, tl, tr));
}

set<int> se;
ll get(void) {
  if (se.empty()) {
    return q2(0, 0, n - 1, 0, n - 1);
  }
  // auto it = se.rbegin();
  auto it = se.rbegin();
  ll temp = 1;
  vector<pii> vec;
  FOR(sz(se)) {
    temp *= a[*it];
    vec.pb(mp(*it, a[*it]));
    // debug(*it)
    it++;
    if (temp >= 1e9) {
      break;
    }
  }
  // debug(vec)
  reverse(all(vec));
  vec.pb(mp(n, n));
  int tin = 0;
  ll cur = q2(0, 0, n - 1, vec[0].f, vec[1].f - 1);
  ll pre = 1;
  FOR(i, 1, sz(vec) - 1) {
    pre *= vec[i].s;
    ll t1 = pre * q2(0, 0, n - 1, vec[i].f, vec[i + 1].f - 1);
    // debug(i)
    if (t1 > cur) cur = t1, tin = i;
  }
  ismod = q2(0, 0, n - 1, 0, n - 1);
  l = q1(0, 0, n - 1, 0, vec[tin].f) ,
  r = q2(0, 0, n - 1, vec[tin].f, vec[tin + 1].f - 1);
  // if (l * r > ismod) {
  //   ismod = INF;
  // }
  // if (ismod == INF) {
    return (l * r) % mod;
  // }
  // return ismod;
}

int init(int N, int Xa[], int Ya[]) {
  n = N;
  FOR(4 * n + 10) tree1[i] = 1, tree2[i] = -INF;
  vector<int> X, Y;
  FOR(n) X.pb(Xa[i]);
  FOR(n) Y.pb(Ya[i]);
  // se.insert(n);
  int timer = 0;
  for (auto val : X) {
    a[timer] = val;
    if (val > 1) se.insert(timer);
    up1(0, 0, n - 1, timer++, val);
  }
  timer = 0;
  for (auto val : Y) {
    b[timer] = val;
    up2(0, 0, n - 1, timer++, val);
  }
  return get();
  return 0ll;
}

int updateX(int in, int val) {
  // in--;
  if (a[in] > 1) se.erase(in);
  if (val > 1)se.insert(in);
  up1(0, 0, n - 1, in, val);
  a[in] = val;
  return get();
}

int updateY(int in, int val) {
  // in--;
  b[in] = val;
  up2(0, 0, n - 1, in, val);
  return get();
}

// int main() {
//   fastio

// #ifdef LOCAL
//   auto begin = std::chrono::high_resolution_clock::now();
//   freopen("input.txt", "r", stdin);
//   freopen("output.txt", "w", stdout);
//   freopen("error.txt", "w", stderr);
// #endif

//   ll tc = 1;
//   ll N;
//   // cin >> N;
//   // vector<int> x, y;
//   // FOR(N) cin >> z, x.pb(z);
//   // FOR(N) cin >> z, y.pb(z);
//   // debug(init(N, x, y))
//   // debug(x)
//   // cin >> tc;
//   // for (int t = 0; t < tc; t++) solve(t);
// #ifdef LOCAL
//   auto end = std::chrono::high_resolution_clock::now();
//   auto elapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin);
//   cerr << "Time measured: " << elapsed.count() * 1e-9 << " seconds.\n";
// #endif
// }
#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...