Submission #96192

#TimeUsernameProblemLanguageResultExecution timeMemory
96192tincamateiHorses (IOI15_horses)C++14
0 / 100
693 ms52104 KiB
#include "horses.h"
#include <bits/stdc++.h>

using namespace std;

const int MAX_N = 500000;
const int MOD = 1000000007;

template<typename T, typename Upd>
struct Aint {
  T aint[1+4*MAX_N];
  T neutralQry, initVal;
  Upd upd;

  Aint(T nq, T iv) {
    neutralQry = nq;
    initVal = iv;
    for(int i = 0; i <= 4*MAX_N; ++i)
      aint[i] = initVal;
  }

  void update(int poz, T val, int l = 1, int r = MAX_N, int nod = 1) {
    if(poz < l || r < poz) return;
    if(l == r)
      aint[nod] = upd.update(aint[nod], val);
    else {
      int mid = (l + r) / 2;
      update(poz, val, l, mid, 2 * nod);
      update(poz, val, mid + 1, r, 2 * nod + 1);
      aint[nod] = upd.query(aint[2 * nod], aint[2 * nod + 1]);
    }
  }

  T query(int i, int j, int l = 1, int r = MAX_N, int nod = 1) {
    if(j < l || r < i) return neutralQry;
    if(i <= l && r <= j) return aint[nod];
    else {
      int mid = (l + r) / 2;
      return upd.query(query(i, j, l, mid, 2 * nod),
                        query(i, j, mid + 1, r, 2 * nod + 1));
    }
  }
};

struct Upd1 {
  int update(int a, int b) { return b; }
  int query(int a, int b)  { return max(a, b); }
};

struct Upd2 {
  int update(int a, int b) { return b; }
  int query(int a, int b)  { return (long long)a * b % MOD;}
};

int N;
int x[1+MAX_N], y[1+MAX_N];

set<int> rel;

Aint<int, Upd1> maxaint(-1, -1), prodaint(1, 1);

int getResult() {
  int k = 0;
  long long best, rez, prod;
  best = rez = 0;
  set<int>::reverse_iterator it = rel.rbegin();
  set<int>::iterator it2;

  prod = 1;
  while(it != rel.rend() && prod <= 1000000000) {
    prod = prod * x[*it];
    it++;
  }

  prod = 1;
  it2 = it.base();

  while(it2 != rel.end()) {
    int pos = *it2, maxy;
    prod = prod * x[pos];
    maxy = maxaint.query(pos, N);
    if(prod * maxy > best) {
      best = prod * maxy;
      rez = prod * maxy % MOD * prodaint.query(1, pos - 1) % MOD;
    }

    it2++;
  }

  return rez;
}

int init(int n, int _x[], int _y[]) {
  N = n;
  rel.insert(0);
  x[0] = y[0] = 1;
  for(int i = 1; i <= n; ++i) {
    x[i] = _x[i - 1];
    y[i] = _y[i - 1];
    if(x[i] != 1)
      rel.insert(i);
    maxaint.update(i, y[i]);
    prodaint.update(i, x[i]);
  }
  return getResult();
}

int updateX(int pos, int val) {
  pos++;

  rel.erase(pos);
  x[pos] = val;
  if(val != 1)
    rel.insert(pos);

  prodaint.update(pos, val);
  return getResult();
}

int updateY(int pos, int val) {
  pos++;
  y[pos] = val;
  maxaint.update(pos, val);
  return getResult();
}

Compilation message (stderr)

horses.cpp: In member function 'int Upd1::update(int, int)':
horses.cpp:46:18: warning: unused parameter 'a' [-Wunused-parameter]
   int update(int a, int b) { return b; }
                  ^
horses.cpp: In member function 'int Upd2::update(int, int)':
horses.cpp:51:18: warning: unused parameter 'a' [-Wunused-parameter]
   int update(int a, int b) { return b; }
                  ^
horses.cpp: In member function 'int Upd2::query(int, int)':
horses.cpp:52:54: warning: conversion to 'int' from 'long long int' may alter its value [-Wconversion]
   int query(int a, int b)  { return (long long)a * b % MOD;}
                                     ~~~~~~~~~~~~~~~~~^~~~~
horses.cpp: In function 'int getResult()':
horses.cpp:90:10: warning: conversion to 'int' from 'long long int' may alter its value [-Wconversion]
   return rez;
          ^~~
horses.cpp:63:7: warning: unused variable 'k' [-Wunused-variable]
   int k = 0;
       ^
#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...