結果
| 問題 | No.59 鉄道の旅 | 
| コンテスト | |
| ユーザー |  siman | 
| 提出日時 | 2022-03-17 00:20:52 | 
| 言語 | C++17(clang) (17.0.6 + boost 1.87.0) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 79 ms / 5,000 ms | 
| コード長 | 1,097 bytes | 
| コンパイル時間 | 4,103 ms | 
| コンパイル使用メモリ | 143,040 KB | 
| 実行使用メモリ | 15,552 KB | 
| 最終ジャッジ日時 | 2024-09-25 03:14:07 | 
| 合計ジャッジ時間 | 4,530 ms | 
| ジャッジサーバーID (参考情報) | judge2 / judge1 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 4 | 
| other | AC * 12 | 
ソースコード
#include <cassert>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <limits.h>
#include <map>
#include <queue>
#include <string.h>
#include <vector>
using namespace std;
typedef long long ll;
class BinaryIndexTree {
public:
  vector <ll> bit;
  int N;
  BinaryIndexTree(int n) {
    N = n;
    for (int i = 0; i <= N; ++i) {
      bit.push_back(0);
    }
  }
  ll sum(int i) {
    ll ret = 0;
    while (i > 0) {
      ret += bit[i];
      i -= i & -i;
    }
    return ret;
  }
  void add(int i, ll x) {
    while (i <= N) {
      bit[i] += x;
      i += i & -i;
    }
  }
};
int main() {
  int N, K;
  cin >> N >> K;
  int L = 1000000;
  BinaryIndexTree bit(1000010);
  map<int, int> counter;
  int w;
  for (int i = 0; i < N; ++i) {
    cin >> w;
    if (w >= 0) {
      int sum = bit.sum(L) - bit.sum(w - 1);
      if (sum >= K) continue;
      counter[w]++;
      bit.add(w, 1);
    } else {
      if (counter[abs(w)] == 0) continue;
      counter[abs(w)]--;
      bit.add(abs(w), -1);
    }
  }
  cout << bit.sum(L) << endl;
  return 0;
}
            
            
            
        