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