树套树 TLE 求助
查看原帖
树套树 TLE 求助
700558
williamwei楼主2024/7/24 21:27
#include <iostream>
using namespace std;
#define lson (k << 1)
#define rson (k << 1 | 1)
const int maxn = 2e5 + 10;
int n, m, a[maxn], b[maxn], B[maxn], rt[maxn << 2];
namespace ST {
	int tot, c[maxn << 6], ls[maxn << 6], rs[maxn << 6];
	void update(int &k, int l, int r, int p, int v) {
		if (!k) k = ++tot; c[k] += v;
		if (l == r) return;
		int mid = (l + r) >> 1;
		if (p <= mid) update(ls[k], l, mid, p, v);
		else update(rs[k], mid + 1, r, p, v);
	}
	int query(int k, int l, int r, int L, int R) {
		if (!k) return 0;
		if (L <= l && r <= R) return c[k];
		int mid = (l + r) >> 1, res = 0;
		if (L <= mid) res += query(ls[k], l, mid, L, R);
		if (R > mid) res += query(rs[k], mid + 1, r, L, R);
		return res;
	}
}
void update(int k, int l, int r, int x, int y, int v) {
	ST::update(rt[k], 1, n, y, v);
	if (l == r) return;
	int mid = (l + r) >> 1;
	if (x <= mid) update(lson, l, mid, x, y, v);
	else update(rson, mid + 1, r, x, y, v);
}
int query(int k, int l, int r, int L1, int R1, int L2, int R2) {
	if (L1 <= l && r <= R1) return ST::query(rt[k], 1, n, L2, R2);
	int mid = (l + r) >> 1, res = 0;
	if (L1 <= mid) res += query(lson, l, mid, L1, R1, L2, R2);
	if (R1 > mid) res += query(rson, mid + 1, r, L1, R1, L2, R2);
	return res;
}
int main() {
	ios::sync_with_stdio(false);
	cin >> n >> m;
	for (int i = 1, x; i <= n; i++) cin >> x, a[x] = i;
	for (int i = 1; i <= n; i++) cin >> B[i], b[B[i]] = i;
	for (int i = 1; i <= n; i++) update(1, 1, n, a[i], b[i], 1);
	while (m--) {
		int op, l1, r1, l2, r2; cin >> op >> l1 >> r1;
		if (op == 1) cin >> l2 >> r2, cout << query(1, 1, n, l1, r1, l2, r2) << '\n';
		else update(1, 1, n, a[B[l1]], l1, -1), update(1, 1, n, a[B[l1]], r1, 1),
			update(1, 1, n, a[B[r1]], r1, -1), update(1, 1, n, a[B[r1]], l1, 1), swap(B[l1], B[r1]);
	}
	return 0;
}

怎么看都是O(nlog⁡2n)O(n \log^2 n)的啊,6s6s的时限也不至于TLE啊

2024/7/24 21:27
加载中...