为什么下面这份代码将对查询的排序删掉后能过样例,但是 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。