主席树逆天 MLE 36pts 求助
查看原帖
主席树逆天 MLE 36pts 求助
1033727
toolazy楼主2024/4/22 13:42

救命别人的主席树都相当正常救我的怎么调都是 MLE qwq

#include <iostream>
using namespace std;

const int MAXN = 1e6 + 5;

int n, m, c[MAXN], nxt[MAXN], bucket[MAXN];

namespace LRZorz {
	
	struct node * nil;
	
	struct node {
		
		int l, r, sum;
		
		node * ls, * rs;
		
		node() : l(0), r(0), sum(0), ls(this), rs(this) {}
		
		inline node(int ll, int rr) : l(ll), r(rr), sum(0), ls(nil), rs(nil) {}
		
	} * rt[MAXN];
	
	void add(int idx, int v, node * rt) {
		if (rt -> r < idx || idx < rt -> l)
			return;
		rt -> sum += v;
		if (rt -> l == idx && rt -> r == idx)
			return;
		int l = rt -> l, r = rt -> r, m = (l + r) >> 1;
		if (idx <= m)
			add(idx, v, rt -> ls = (rt -> ls == nil ? new node(l, m) : new node(*(rt -> ls))));
		else
			add(idx, v, rt -> rs = (rt -> rs == nil ? new node(m + 1, r) : new node(*(rt -> rs))));
	}
	
	int query(int l, int r, node * rt) {
		if (rt -> r < l || r < rt -> r)
			return 0;
		if (l <= rt -> l && rt -> r <= r)
			return rt -> sum;
		return query(l, r, rt -> ls) + query(l, r, rt -> rs);
	}
	
	void build() {
		nil = new node;
		rt[0] = new node(2, n + 1);
		for (int i = 1; i <= n; i ++) {
			rt[i] = new node(*(rt[i - 1]));
			add(nxt[i], 1, rt[i]);
		}
	}
	
	inline int query(int l, int r) {
		return query(r + 1, n + 1, rt[r]) - query(r + 1, n + 1, rt[l - 1]);
	}
	
}

void init() {
	cin >> n;
	for (int i = 1; i <= n; i ++)
		cin >> c[i];
	for (int i = n; i; i --) {
		nxt[i] = (bucket[c[i]] == 0 ? n + 1 : bucket[c[i]]);
		bucket[c[i]] = i;
	}
	LRZorz :: build();
}

int main() {
	ios :: sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	init();
	for (cin >> m; m; m --) {
		int l, r;
		cin >> l >> r;
		cout << LRZorz :: query(l, r) << '\n';
	}
	return 0;
}

感谢(跪

2024/4/22 13:42
加载中...