結果
問題 | No.59 鉄道の旅 |
ユーザー |
|
提出日時 | 2016-11-22 20:58:17 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
RE
|
実行時間 | - |
コード長 | 1,317 bytes |
コンパイル時間 | 902 ms |
コンパイル使用メモリ | 74,368 KB |
実行使用メモリ | 5,248 KB |
最終ジャッジ日時 | 2024-12-25 00:04:29 |
合計ジャッジ時間 | 3,212 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 2 RE * 10 |
ソースコード
#include <iostream>#include <vector>#include <functional>using namespace std;template <typename T>struct binary_indexed_tree { // on monoidvector<T> a;T unit;function<T (T,T)> append; // associativetemplate <typename F>binary_indexed_tree(size_t n, T a_unit, F a_append) : a(n, a_unit), unit(a_unit), append(a_append) {}void point_append(size_t i, T w) { // a[i] += wfor (size_t j = i+1; j <= a.size(); j += j & -j) a[j-1] = append(a[j-1], w);}int initial_range_concat(size_t i) { // sum [0, i)T acc = unit;for (size_t j = i; 0 < j; j -= j & -j) acc = append(acc, a[j-1]);return acc;}T point_get(size_t i) {return initial_range_concat(i+1) - initial_range_concat(i);}};const int w_max = 100000;int main() {int n, k; cin >> n >> k;binary_indexed_tree<int> bit(w_max+1, int(), plus<int>());while (n --) {int w; cin >> w;int i = w_max - abs(w);if (w > 0) {if (bit.initial_range_concat(i+1) < k) {bit.point_append(i, 1);}} else if (w < 0) {if (bit.point_get(i)) {bit.point_append(i, -1);}}}cout << bit.initial_range_concat(w_max) << endl;return 0;}