結果
| 問題 |
No.59 鉄道の旅
|
| コンテスト | |
| ユーザー |
atn112323
|
| 提出日時 | 2017-01-03 22:14:09 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 45 ms / 5,000 ms |
| コード長 | 956 bytes |
| コンパイル時間 | 661 ms |
| コンパイル使用メモリ | 61,684 KB |
| 実行使用メモリ | 11,216 KB |
| 最終ジャッジ日時 | 2024-12-25 01:10:37 |
| 合計ジャッジ時間 | 1,810 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 12 |
ソースコード
#include <iostream>
#include <vector>
using namespace std;
template <typename T>
class BinaryIndexTree {
public:
explicit BinaryIndexTree(int size) {
size_ = 1;
while (size_ < size) {
size_ <<= 1;
}
tree_.resize(size_);
}
void add(int k, const T& x) {
k++;
while (k <= size_) {
tree_[k - 1] += x;
k += k & -k;
}
}
T sum(int k) {
k++;
T s = 0;
while (k > 0) {
s += tree_[k - 1];
k -= k & -k;
}
return s;
}
private:
int size_;
vector<T> tree_;
};
const int MAXN = 100000;
const int MAXW = 1000000;
int N, K, W;
int picked[MAXW + 1];
int main() {
BinaryIndexTree<int> bit(MAXW + 1);
int ans = 0;
cin >> N >> K;
for (int i = 0; i < N; i++) {
cin >> W;
if (W > 0) {
int cnt = bit.sum(MAXW) - bit.sum(W - 1);
if (cnt < K) {
ans++;
bit.add(W, 1);
picked[W]++;
}
} else if (picked[-W] > 0) {
ans--;
bit.add(-W, -1);
picked[-W]--;
}
}
cout << ans << endl;
return 0;
}
atn112323