ABC365 G 题复杂度求证
  • 板块学术版
  • 楼主Heldivis
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/8/4 09:17
  • 上次更新2024/8/4 10:41:30
查看原帖
ABC365 G 题复杂度求证
732379
Heldivis楼主2024/8/4 09:17

rt,Exec Time 2484 ms。

代码如下:

#include <bits/stdc++.h>
using namespace std;
int read() {
  int res = 0;
  bool f = true;
  char ch = getchar();
  for (; ch > '9' || ch < '0'; ch = getchar())
    if (ch == '-') f = false;
  for (; ch <= '9' && ch >= '0'; ch = getchar())
    res = (res << 3) + (res << 1) + (ch ^ 48);
  return f ? res : ~res + 1;
}

const int N = 2E5 + 100, W = 1E9 + 10;

int n, m, q, rt[N], cur;

vector<int> tim[N];
map<pair<int, int>, int> mp;

struct Node {
  int lc, rc;
  int dat;
} st[N << 7];

int cnt;

void PushUp(int p) { st[p].dat = st[st[p].lc].dat + st[st[p].rc].dat; }

void Modify(int &p, int tl, int tr, int ql, int qr) {
  if (tl > tr) return;
  if (!p) p = ++cnt;
  if (ql <= tl && tr <= qr) {
    st[p].dat = tr - tl + 1;
    return;
  }
  int mid = (tl + tr) >> 1;
  if (ql <= mid) Modify(st[p].lc, tl, mid, ql, qr);
  if (mid < qr) Modify(st[p].rc, mid + 1, tr, ql, qr);
  PushUp(p);
}

int Merge(int p, int q, int tl, int tr) {
  if (st[p].dat == tr - tl + 1) return st[q].dat;
  if (st[q].dat == tr - tl + 1) return st[p].dat;
  if (!p || !q) return 0;
  int mid = (tl + tr) >> 1;
  return Merge(st[p].lc, st[q].lc, tl, mid) +
         Merge(st[p].rc, st[q].rc, mid + 1, tr);
}

signed main() {
#ifdef HELDIVIS
  freopen(".in", "r", stdin);
  freopen(".out", "w", stdout);
#endif
  n = read(), m = read();
  for (int i = 1; i <= m; ++i) {
    int t = read(), p = read();
    tim[p].push_back(t);
  }
  for (int i = 1; i <= n; ++i)
    for (unsigned j = 1; j < tim[i].size(); j += 2)
      Modify(rt[i], 1, W, tim[i][j - 1], tim[i][j] - 1);
  q = read();
  while (q--) {
    int p = read(), q = read();
    if (mp.find({p, q}) != mp.end())
      printf("%d\n", mp[{p, q}]);
    else
      printf("%d\n", mp[{p, q}] = Merge(rt[p], rt[q], 1, W));
  }
  return 0;
}
2024/8/4 09:17
加载中...