結果

問題 No.2338 Range AtCoder Query
ユーザー niuezniuez
提出日時 2023-06-02 22:24:15
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
WA  
実行時間 -
コード長 3,839 bytes
コンパイル時間 1,796 ms
コンパイル使用メモリ 121,464 KB
実行使用メモリ 90,348 KB
最終ジャッジ日時 2023-08-28 04:14:06
合計ジャッジ時間 8,702 ms
ジャッジサーバーID
(参考情報)
judge13 / judge15
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
4,380 KB
testcase_01 AC 2 ms
4,376 KB
testcase_02 AC 2 ms
4,376 KB
testcase_03 AC 2 ms
4,380 KB
testcase_04 AC 1 ms
4,376 KB
testcase_05 AC 1 ms
4,376 KB
testcase_06 WA -
testcase_07 WA -
testcase_08 WA -
testcase_09 WA -
testcase_10 WA -
testcase_11 WA -
testcase_12 WA -
testcase_13 WA -
testcase_14 WA -
testcase_15 WA -
testcase_16 TLE -
testcase_17 -- -
testcase_18 -- -
testcase_19 -- -
testcase_20 -- -
testcase_21 -- -
testcase_22 -- -
testcase_23 -- -
testcase_24 -- -
testcase_25 -- -
testcase_26 -- -
testcase_27 -- -
testcase_28 -- -
testcase_29 -- -
testcase_30 -- -
testcase_31 -- -
testcase_32 -- -
testcase_33 -- -
testcase_34 -- -
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>
#include <vector>
#include <algorithm>
#include <deque>
#include <cmath>

using namespace std;
using i64 = long long;
#define rep(i,s,e) for(i64 (i) = (s);(i) < (e);(i)++)
#define all(x) x.begin(),x.end()
#define STRINGIFY(n) #n
#define TOSTRING(n) STRINGIFY(n)
#define PREFIX "#" TOSTRING(__LINE__) "| "
#define debug(x) \
{ \
  std::cout << PREFIX << #x << " = " << x << std::endl; \
}
std::ostream& output_indent(std::ostream& os, int ind) {
  for(int i = 0; i < ind; i++) os << " ";
  return os;
}
template<class S, class T> std::ostream& operator<<(std::ostream& os, const std::pair<S, T>& p);
template<class T> std::ostream& operator<<(std::ostream& os, const std::vector<T>& v);
template<class S, class T> std::ostream& operator<<(std::ostream& os, const std::pair<S, T>& p) {
  return (os << "(" << p.first << ", " << p.second << ")");
}
template<class T> std::ostream& operator<<(std::ostream& os, const std::vector<T>& v) {
  os << "[";
  for(int i = 0;i < v.size();i++) os << v[i] << ", ";
  return (os << "]");
}
template<class T>
static inline std::vector<T> ndvec(size_t&& n, T val) { return std::vector<T>(n, std::forward<T>(val)); }
template<class... Tail>
static inline auto ndvec(size_t&& n, Tail&&... tail) {
  return std::vector<decltype(ndvec(std::forward<Tail>(tail)...))>(n, ndvec(std::forward<Tail>(tail)...));
}

struct Mo {
  vector<i64> left, right, order;
  vector<bool> v;
  

  const i64 width;
  i64 nl, nr, ptr;

  vector<int> P;
  vector<int> S;
  vector<deque<int>> was;
  i64 AC = 0;
  i64 WA = 0;

  Mo(i64 n, i64 w) : v(n), width(w), nl(0), nr(0), ptr(0) {}

  void add_query(i64 l, i64 r) {
    left.push_back(l);
    right.push_back(r);
  }

  void build() {
    order.resize(left.size());
    for(i64 i = 0;i < left.size();i++) order[i] = i;
    sort(begin(order), end(order), [&](i64 a, i64 b) {
        if(left[a] / width != left[b] / width) return left[a] < left[b];
        else return right[a] < right[b];
        });
  }


  i64 process() {
    if(ptr == order.size()) return -1;
    const auto id = order[ptr];
    while(nl > left[id]) {
      // left add
      --nl;
      int p = P[nl];
      if(S[nl] == 0) {
        was[p].front()++;
        if(was[p].size() > 1) WA++;
      }
      else {
        if(was[p].size() == 1) AC++;
        was[p].push_front(0);
      }
    }
    while(nr < right[id]) {
      int p = P[nr];
      if(S[nr] == 0) {
        was[p].back()++;
      }
      else {
        if(was[p].size() == 1) {
          AC++;
          WA += was[p].back();
        }
        was[p].push_back(0);
      }
      nr++;
    }
    while(nl < left[id]) {
      int p = P[nl];
      if(S[nl] == 0) {
        was[p].front()--;
        if(was[p].size() > 1) WA--;
      }
      else {
        if(was[p].size() == 2) AC--;
        was[p].pop_front();
        if(was[p].size() > 1) {
          WA += was[p].front();
        }
      }
      nl++;
    }
    while(nr > right[id]) {
      nr--;
      int p = P[nr];
      if(S[nr] == 0) {
        was[p].back()--;
      }
      else {
        if(was[p].size() == 2) {
          AC--;
          WA -= was[p].back();
        }
        was[p].pop_back();
      }
    }
    return order[ptr++];
  }
};

int main() {
  int N, M, Q;
  cin >> N >> M >> Q;
  Mo mo(N, sqrt(3) * N / (sqrt(2 * Q)));
  mo.P.resize(N);
  mo.S.resize(N);
  mo.was.resize(M, std::deque<int> { 0 });
  for(int i = 0; i < N; i++) {
    int p;
    string s;
    cin >> p >> s;
    mo.P[i] = p - 1;
    mo.S[i] = s == "AC" ? 1 : 0;
  }
  for(int i = 0; i < Q; i++) {
    int l, r;
    cin >> l >> r;
    mo.add_query(l - 1, r);
  }
  mo.build();

  std::vector<int> A(Q), B(Q);
  for(int i = 0; i < Q; i++) {
    int q = mo.process();
    A[q] = mo.AC;
    B[q] = mo.WA;
  }
  for(int i = 0; i < Q; i++) {
    cout << A[i] << " " << B[i] << endl;
  }
}
0