結果

問題 No.1703 Much Matching
ユーザー tnakao0123tnakao0123
提出日時 2021-10-09 02:24:56
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
WA  
実行時間 -
コード長 2,733 bytes
コンパイル時間 321 ms
コンパイル使用メモリ 45,260 KB
実行使用メモリ 26,212 KB
最終ジャッジ日時 2024-07-23 11:53:51
合計ジャッジ時間 4,416 ms
ジャッジサーバーID
(参考情報)
judge4 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
13,752 KB
testcase_01 AC 2 ms
6,940 KB
testcase_02 AC 2 ms
6,940 KB
testcase_03 WA -
testcase_04 WA -
testcase_05 WA -
testcase_06 TLE -
testcase_07 -- -
testcase_08 -- -
testcase_09 -- -
testcase_10 -- -
testcase_11 -- -
testcase_12 -- -
testcase_13 -- -
testcase_14 -- -
testcase_15 -- -
testcase_16 -- -
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 -- -
testcase_35 -- -
testcase_36 -- -
testcase_37 -- -
権限があれば一括ダウンロードができます

ソースコード

diff #

/* -*- coding: utf-8 -*-
 *
 * 1703.cc:  No.1703 Much Matching - yukicoder
 */

#include<cstdio>
#include<algorithm>

using namespace std;

/* constant */

const int MAX_N = 1000;
const int MAX_M = 1000;
const int MAX_Q = MAX_N * MAX_M;
const int MAX_E2 = 1 << 11; // = 2048

/* typedef */

typedef long long ll;

template <typename T, const int MAX_E2>
struct SegTreeMax2D {
  int e2;
  T nodes[MAX_E2][MAX_E2], minf;
  SegTreeMax2D() {}

  void init(int n, T _minf) {
    minf = _minf;
    for (e2 = 1; e2 < n; e2 <<= 1);
    for (int i = 0; i < e2 * 2; i++)
      fill(nodes[i], nodes[i] + MAX_E2, minf);
  }

  T &geti(int i0, int i1) { return nodes[e2 - 1 + i0][e2 - 1 + i1]; }

  void setall() {
    for (int j0 = e2 - 2; j0 >= 0; j0--) {
      int k00 = j0 * 2 + 1, k01 = k00 + 1;
      for (int j1 = e2 - 2; j1 >= 0; j1--) {
        int k10 = j1 * 2 + 1, k11 = k10 + 1;
        nodes[j0][j1] =
          max(max(nodes[k00][k10], nodes[k00][k11]),
              max(nodes[k01][k10], nodes[k01][k11]));
      }
    }
  }

  void set(int i0, int i1, T v) {
    int j0 = e2 - 1 + i0, j1 = e2 - 1 + i1;
    nodes[j0][j1] = v;
    while (j0 > 0 || j1 > 0) {
      j0 = (j0 - 1) / 2, j1 = (j1 - 1) / 2;
      int k00 = j0 * 2 + 1, k01 = k00 + 1;
      int k10 = j1 * 2 + 1, k11 = k10 + 1;
      nodes[j0][j1] =
        max(max(nodes[k00][k10], nodes[k00][k11]),
            max(nodes[k01][k10], nodes[k01][k11]));
    }
  }

  T max_range(int r00, int r01, int r10, int r11,
              int k0, int k1, int i00, int i01, int i10, int i11) {
    if (r01 <= i00 || i01 <= r00 || r11 <= i10 || i11 <= r10)
      return minf;
    if (r00 <= i00 && i01 <= r01 && r10 <= i10 && i11 <= r11)
      return nodes[k0][k1];

    int im0 = (i00 + i01) / 2, im1 = (i10 + i11) / 2;
    int k00 = k0 * 2 + 1, k01 = k00 + 1;
    int k10 = k1 * 2 + 1, k11 = k10 + 1;

    T v00 = max_range(r00, r01, r10, r11, k00, k10, i00, im0, i10, im1);
    T v01 = max_range(r00, r01, r10, r11, k00, k11, i00, im0, im1, i11);
    T v10 = max_range(r00, r01, r10, r11, k01, k10, im0, i01, i10, im1);
    T v11 = max_range(r00, r01, r10, r11, k01, k11, im0, i01, im1, i11);
    return max(max(v00, v01), max(v10, v11));
  }
  T max_range(int r00, int r01, int r10, int r11) {
    return max_range(r00, r01, r10, r11, 0, 0, 0, e2, 0, e2);
  }
};

/* global variables */

SegTreeMax2D<int,MAX_E2> st;

/* subroutines */

/* main */

int main() {
  int n, m, q;
  scanf("%d%d%d", &n, &m, &q);

  st.init(max(n, m), 0);

  int maxd = 0;
  for (int i = 0; i < q; i++) {
    int ai, bi;
    scanf("%d%d", &ai, &bi);
    ai--, bi--;

    int d = st.max_range(0, ai, 0, bi) + 1;
    st.set(ai, bi, d);
    maxd = max(maxd, d);
  }

  printf("%d\n", maxd);
  return 0;
}
0