抄完了题解,但是有个弱智问题(
查看原帖
抄完了题解,但是有个弱智问题(
704668
WZWZWZWY楼主2024/3/7 18:56

tree为什么不用开2倍空间,它不是树状数组吗

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e6 + 5;
int n, m;
int a[N], ans[N], vis[N], tree[N];

struct ques {
	int l, r, id;
} q[N];

bool cmp(ques a, ques b) {
	return a.r < b.r;
}
inline int lowbit(int x) {
	return x & (-x);
}
void modify(int p, int v) { //单点修改 
	for (; p <= n; p += lowbit(p))
		tree[p] += v;
}
int query(int p) { //查询前缀和 
	int res = 0;
	for (; p; p -= lowbit(p))
		res += tree[p];
	return res;
}

signed main() {
	cin.tie(0); ios::sync_with_stdio(0);
	cin >> n;
	for (int i = 1; i <= n; i++) cin >> a[i];
	cin >> m;
	for (int i = 1; i <= m; i++) {
		cin >> q[i].l >> q[i].r; q[i].id = i;
	}
	sort(q + 1, q + 1 + m, cmp);
	int pow = 1;
	for (int i = 1; i <= m; i++) {
		for (int j = pow; j <= q[i].r; j++) {
			if (vis[a[j]]) modify(vis[a[j]], -1);
			modify(j, 1);
			vis[a[j]] = j;
		}
		pow = q[i].r + 1;
		ans[q[i].id] = query(q[i].r) - query(q[i].l - 1);
	}
	for (int i = 1; i <= m; i++) cout << ans[i] << "\n";
	
}
2024/3/7 18:56
加载中...