結果

問題 No.489 株に挑戦
ユーザー yuppe19 😺yuppe19 😺
提出日時 2017-02-25 01:01:30
言語 C++11
(gcc 11.4.0)
結果
CE  
(最新)
AC  
(最初)
実行時間 -
コード長 2,597 bytes
コンパイル時間 348 ms
コンパイル使用メモリ 56,392 KB
最終ジャッジ日時 2024-04-27 02:25:04
合計ジャッジ時間 1,346 ms
ジャッジサーバーID
(参考情報)
judge5 / judge3
このコードへのチャレンジ
(要ログイン)
コンパイルエラー時のメッセージ・ソースコードは、提出者また管理者しか表示できないようにしております。(リジャッジ後のコンパイルエラーは公開されます)
ただし、clay言語の場合は開発者のデバッグのため、公開されます。

コンパイルメッセージ
main.cpp:9:3: error: ‘vector’ does not name a type
    9 |   vector<int> v;
      |   ^~~~~~
main.cpp:10:3: error: ‘vector’ does not name a type
   10 |   vector<int> p; // 場所
      |   ^~~~~~
main.cpp:15:17: error: ‘vector’ does not name a type
   15 |   SegTree(const vector<int> &w);
      |                 ^~~~~~
main.cpp:15:23: error: expected ‘,’ or ‘...’ before ‘<’ token
   15 |   SegTree(const vector<int> &w);
      |                       ^
main.cpp:15:3: error: ‘SegTree::SegTree(int)’ cannot be overloaded with ‘SegTree::SegTree(int)’
   15 |   SegTree(const vector<int> &w);
      |   ^~~~~~~
main.cpp:14:3: note: previous declaration ‘SegTree::SegTree(int)’
   14 |   SegTree(int n);
      |   ^~~~~~~
main.cpp: In constructor ‘SegTree::SegTree(int)’:
main.cpp:22:33: error: class ‘SegTree’ does not have any field named ‘v’
   22 | SegTree::SegTree(int n) : n(n), v(n, INIT_VAL) { v[0] = -1; }
      |                                 ^
main.cpp:22:50: error: ‘v’ was not declared in this scope
   22 | SegTree::SegTree(int n) : n(n), v(n, INIT_VAL) { v[0] = -1; }
      |                                                  ^
main.cpp: At global scope:
main.cpp:23:24: error: ‘vector’ does not name a type
   23 | SegTree::SegTree(const vector<int> &w) {
      |                        ^~~~~~
main.cpp:23:30: error: expected ‘,’ or ‘...’ before ‘<’ token
   23 | SegTree::SegTree(const vector<int> &w) {
      |                              ^
main.cpp:23:1: error: redefinition of ‘SegTree::SegTree(int)’
   23 | SegTree::SegTree(const vector<int> &w) {
      | ^~~~~~~
main.cpp:22:1: note: ‘SegTree::SegTree(int)’ previously defined here
   22 | SegTree::SegTree(int n) : n(n), v(n, INIT_VAL) { v[0] = -1; }
      | ^~~~~~~
main.cpp: In member function ‘void SegTree::update(int, int)’:
main.cpp:38:3: error: ‘v’ was not declared in this scope
   38 |   v[i] = val;
      |   ^
main.cpp:39:3: erro

ソースコード

diff #

#include <iostream>
#include <algorithm>
#include <tuple>
using namespace std;
using i64 = long long;

class SegTree {
  int n;
  vector<int> v;
  vector<int> p; // 場所
  pair<int, int> query(int a, int b, int k, int l, int r);
public:
  const int INIT_VAL = 0;
  SegTree(int n);
  SegTree(const vector<int> &w);
  static int min_pow2(const int n); // n以上の最小の "2の冪乗"
  static int calc_size(const int n); // 要素数 n の配列をセグメントツリーにするときのサイズ (min_pow2(n) x 2) を計算する
  void update(int i, int val); // 配列 w の i 番目 (0-indexed) を val にする。
  pair<int, int> query(int a, int b); // [a, b) の範囲
};

SegTree::SegTree(int n) : n(n), v(n, INIT_VAL) { v[0] = -1; }
SegTree::SegTree(const vector<int> &w) {
  int m = w.size();
  n = calc_size(m);
  v.assign(n, INIT_VAL);
  p.assign(n, -1);
  v[0] = -1;
  p[0] = -1;
  for(int i=0; i<m; ++i) {
    update(i, w[i]);
  }
}

void SegTree::
update(int i, int val) {
  i += n / 2;
  v[i] = val;
  p[i] = i;
  while(true) {
    i >>= 1;
    if(i == 0) { break; }
    if(v[i*2] < v[i*2+1]) {
      v[i] = v[i*2+1];
      p[i] = p[i*2+1];
    } else {
      v[i] = v[i*2];
      p[i] = p[i*2];
    }
  }
}

pair<int, int> SegTree::
query(int a, int b, int k, int l, int r) {
  // [a, b) と [l, r) が交差しないとき
  if(r <= a || b <= l) { return make_pair(-1, INIT_VAL); }
  // [a, b) が [l, r) を完全に含んでいるとき
  if(a <= l && r <= b) {
    return make_pair(p[k], v[k]);
  }
  int pl, vl, pr, vr;
  tie(pl, vl) = query(a, b, 2*k,   l, (l+r)/2),
  tie(pr, vr) = query(a, b, 2*k+1, (l+r)/2, r);
  if(vl < vr) {
    return make_pair(pr, vr);
  }
  return make_pair(pl, vl);
}

// [a, b) の範囲 (a, b は 0-indexed)
pair<int, int> SegTree::
query(int a, int b) {
  return query(a, b, 1, 0, n >> 1);
}

int SegTree::min_pow2(const int n) { int m = 1; while(m < n) { m <<= 1; } return m; }
int SegTree::calc_size(const int n) { return min_pow2(n) << 1; }

int main(void) {
  int n, d, k; scanf("%d%d%d", &n, &d, &k);
  vector<int> x(n); // x[n]
  for(int i=0; i<n; ++i) {
    scanf("%d", &x[i]);
  }
  SegTree tree(x);
  int p2 = SegTree::min_pow2(n);
  int max_dif = 0;
  int a = -1, b = -1;
  for(int i=0; i<n; ++i) {
    int j, maxi; tie(j, maxi) = tree.query(i, min(i+d+1, n));
    j -= p2;
    int dif = maxi - x[i];
    if(max_dif < dif) {
      max_dif = dif;
      a = i;
      b = j;
    }
  }
  if(max_dif == 0) {
    puts("0");
    return 0;
  }
  i64 amount = i64(max_dif) * k;
  printf("%lld\n%d %d\n", amount, a, b);

  return 0;
}
0