求问
查看原帖
求问
931664
sieve楼主2025/8/2 08:45

为什么下面这份代码将对查询的排序删掉后能过样例,但是 WA 3 TLE 7,而不删掉过不了样例?

:::info[code 无排序]

#include <bits/stdc++.h>
#define int long long

using namespace std;

const int kN = 1e6 + 1;

struct Q {
  int l, r, c, id, t;
} qm[kN];

struct C {
  int p, c;
} qc[kN];

int n, m, q, v[kN], w[kN], c[kN], stk[kN], top, st[kN], mq, mc;
int f[kN][20], dep[kN], len, s[kN], t[kN], sum[kN];
vector<int> e[kN];
bool vis[kN];
int res, ans[kN];

inline int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') {
      f = -1;
    }
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + ch - '0', ch = getchar();
  }
  return x * f;
}

inline int G(int x) {
  return (x - 1) / len;
}

inline void write(int x) {
  if (x < 0) {
    putchar('-'), x = -x;
  }
  if (x > 9) {
    write(x / 10);
  }
  putchar(x % 10 + '0');
}

inline void T(int x, int fa) {
  stk[++top] = x;
  s[x] = top;
  dep[x] = dep[fa] + 1, f[x][0] = fa;
  for (int i = 1; i < 20; i++) {
    f[x][i] = f[f[x][i - 1]][i - 1];
  }
  for (int i : e[x]) {
    if (i != fa) {
      T(i, x);
    }
  }
  stk[++top] = x;
  t[x] = top;
}

inline int C(int x, int y) {
  if (dep[x] < dep[y]) {
    swap(x, y);
  }
  for (int i = 19; i >= 0; i--) {
    if (dep[f[x][i]] >= dep[y]) {
      x = f[x][i];
    }
  }
  if (x == y) {
    return x;
  }
  for (int i = 19; i >= 0; i--) {
    if (f[x][i] != f[y][i]) {
      x = f[x][i], y = f[y][i];
    }
  }
  return f[x][0];
}

inline void add(int i) {
  if (vis[i] == 0) {
    sum[c[i]]++;
    res += v[c[i]] * w[sum[c[i]]];
    vis[i] = 1;
  } else {
    res -= v[c[i]] * w[sum[c[i]]];
    sum[c[i]]--;
    vis[i] = 0;
  }
}

signed main() {
  n = read(), m = read(), q = read();
  for (int i = 1; i <= m; i++) {
    v[i] = read();
  }
  for (int i = 1; i <= n; i++) {
    w[i] = read();
  }
  for (int i = 1, x, y; i < n; i++) {
    x = read(), y = read(), e[x].emplace_back(y), e[y].emplace_back(x);
  }
  T(1, 0);
  for (int i = 1; i <= n; i++) {
    c[i] = read();
  }
  for (int ty, x, y, i = 1; i <= q; i++) {
    cin >> ty >> x >> y;
    if (ty == 0) {
      qc[++mc] = {x, y};
    } else {
      int c = C(x, y);
      if (s[x] > s[y]) {
        swap(x, y);
      }
      mq++;
      if (x == c) {
        x = s[x], y = s[y];
      } else {
        x = t[x], y = s[y], qm[mq].c = c;
      }
      qm[mq].l = x, qm[mq].r = y, qm[mq].id = mq, qm[mq].t = mc;
    }
  }
  len = cbrt(n * 1.0 * max(mc, 1ll)) + 1;
  // sort(qm + 1, qm + mq + 1, [&](Q x, Q y) {
  //   int xl = G(x.l), xr = G(x.r), yl = G(y.l), yr = G(y.r);
  //   if (xl != yl) {
  //     return xl < yl;
  //   }
  //   if (xr != yr) {
  //     return xr < yr;
  //   }
  //   return x.t < y.t;
  // });
  for (int k = 1, i = 1, j = 0, tt = 0; k <= mq; k++) {
    int l = qm[k].l, r = qm[k].r, id = qm[k].id, tm = qm[k].t;
    for (; i < l; add(stk[i++])) {
    }
    for (; i > l; add(stk[--i])) {
    }
    for (; j < r; add(stk[++j])) {
    }
    for (; j > r; add(stk[j--])) {
    }
    if (qm[k].c) {
      add(qm[k].c);
    }
    for (; tt < tm;) {
      tt++;
      if (i <= qc[tt].p && qc[tt].p <= j) {
        add(qc[tt].p);
      }
      swap(c[qc[tt].p], qc[tt].c);
      if (i <= qc[tt].p && qc[tt].p <= j) {
        add(qc[tt].p);
      }
    }
    for (; tt > tm;) {
      if (i <= qc[tt].p && qc[tt].p <= j) {
        add(qc[tt].p);
      }
      swap(c[qc[tt].p], qc[tt].c);
      if (i <= qc[tt].p && qc[tt].p <= j) {
        add(qc[tt].p);
      }
      tt--;
    }
    ans[id] = res;
    if (qm[k].c) {
      add(qm[k].c);
    }
  }
  for (int i = 1; i <= mq; i++) {
    cout << ans[i] << '\n';
  }
  return 0;
}

:::

也可以帮我将这份代码调成 TLE 不 WA。

2025/8/2 08:45
加载中...