分块套分块求调 QAQ
查看原帖
分块套分块求调 QAQ
406941
Register_int-std=c++14楼主2023/11/30 19:22

rt, WA on 10,瞪了好久也没找到哪里错了 qaq

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int MAXN = 2e5 + 10;
const int MAXM = 450;

int len, tot, a[MAXN], tl[MAXM], tr[MAXM], bel[MAXN];

int pre[MAXM][MAXM], cnt[MAXM][MAXN];

inline 
void init(int n) {
	len = sqrt(n), tot = (n - 1) / len + 1;
	for (int i = 1; i <= tot; i++) tl[i] = tr[i - 1] + 1, tr[i] = i * len; tr[tot] = n;
	for (int i = 1; i <= tot; i++) {
		for (int j = tl[i]; j <= tr[i]; j++) bel[j] = i;
		for (int j = 1; j <= tot; j++) pre[i][j] = pre[i - 1][j];
		for (int j = 1; j <= n; j++) cnt[i][j] = cnt[i - 1][j];
		for (int j = tl[i]; j <= tr[i]; j++) pre[i][bel[a[j]]]++, cnt[i][a[j]]++;
	}
}

inline 
void change(int x, int y) {
	if (x > y) swap(x, y);
	int p = bel[x], q = bel[y];
	for (int i = p; i < q; i++) {
		pre[i][bel[a[x]]]--, cnt[i][a[x]]--;
		pre[i][bel[a[y]]]++, cnt[i][a[y]]++;
	}
	swap(a[x], a[y]);
}

inline 
int ask(int l, int r, int lx, int rx) {
	if (l > r) return 0;
	int p = bel[lx], q = bel[rx], ans = 0;
	if (p == q) {
		for (int i = lx; i <= rx; i++) ans += cnt[r][i] - cnt[l - 1][i];
		return ans;
	}
	for (int i = lx; i <= tr[p]; i++) ans += cnt[r][i] - cnt[l - 1][i];
	for (int i = p + 1; i < q; i++) ans += pre[r][i] - pre[l - 1][i];
	for (int i = tl[q]; i <= rx; i++) ans += cnt[r][i] - cnt[l - 1][i];
	return ans;
}

inline 
int query(int l, int r, int lx, int rx) {
	int p = bel[l], q = bel[r], ans = 0;
	if (p == q) {
		for (int i = l; i <= r; i++) ans += lx <= a[i] && a[i] <= rx;
		return ans;
	}
	for (int i = l; i <= tr[p]; i++) ans += lx <= a[i] && a[i] <= rx;
	ans += ask(p + 1, q - 1, lx, rx);
	for (int i = tl[q]; i <= r; i++) ans += lx <= a[i] && a[i] <= rx;
	return ans;
}

int n, m, p[MAXN];

int main() {
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; i++) scanf("%d", &a[i]), p[a[i]] = i;
	for (int i = 1, x; i <= n; i++) scanf("%d", &x), a[i] = p[x]; init(n);
	for (int op, l, r, lx, rx; m--;) {
		scanf("%d%d%d", &op, &lx, &rx);
		if (op == 1) scanf("%d%d", &l, &r), printf("%d\n", query(l, r, lx, rx));
		else change(lx, rx);
	}
}
2023/11/30 19:22
加载中...