結果

問題 No.59 鉄道の旅
ユーザー atn112323atn112323
提出日時 2017-01-03 22:14:09
言語 C++11
(gcc 11.4.0)
結果
AC  
実行時間 49 ms / 5,000 ms
コード長 956 bytes
コンパイル時間 1,306 ms
コンパイル使用メモリ 60,632 KB
実行使用メモリ 11,136 KB
最終ジャッジ日時 2024-06-07 03:23:13
合計ジャッジ時間 2,276 ms
ジャッジサーバーID
(参考情報)
judge3 / judge5
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 5 ms
7,168 KB
testcase_01 AC 5 ms
7,168 KB
testcase_02 AC 5 ms
7,296 KB
testcase_03 AC 5 ms
7,296 KB
testcase_04 AC 49 ms
11,136 KB
testcase_05 AC 5 ms
7,296 KB
testcase_06 AC 5 ms
7,296 KB
testcase_07 AC 5 ms
7,168 KB
testcase_08 AC 12 ms
11,136 KB
testcase_09 AC 13 ms
10,752 KB
testcase_10 AC 13 ms
10,368 KB
testcase_11 AC 6 ms
7,168 KB
testcase_12 AC 20 ms
7,168 KB
testcase_13 AC 40 ms
7,424 KB
testcase_14 AC 40 ms
7,552 KB
testcase_15 AC 5 ms
7,168 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#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;
}
0