제출 #96196

#제출 시각아이디문제언어결과실행 시간메모리
96196tincamateiHorses (IOI15_horses)C++14
0 / 100
1577 ms47368 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();

  while(it != rel.rend() && best != -1) {
    int pos = *it, maxy = maxaint.query(max(1, pos), N);
    if(maxy > best) {
      best = maxy;
      rez = (long long)prodaint.query(1, max(1, pos)) * maxy % MOD;
    }

    if(best <= 1000000000 / x[pos])
      best = best * x[pos];
    else
      best = -1;
    it++;
  }*/

  int rez = 0LL;
  for(int i = 1; i <= N; ++i)
    rez = max(rez, prodaint.query(1, i) * maxaint.query(i, N));
  return rez;
}

int init(int n, int _x[], int _y[]) {
  N = n;
  x[0] = y[0] = 1;
  rel.insert(0);
  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();
}

컴파일 시 표준 에러 (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;}
                                     ~~~~~~~~~~~~~~~~~^~~~~
#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...