主席树求调
查看原帖
主席树求调
232838
huangkx楼主2022/8/11 09:16

样例过不了,但感觉没啥问题?

部分代码:

const int MAXN = 5e5;
int n, m, l, r;
int a[MAXN + 5];
int rt[MAXN + 5];
struct Segment_Tree{
	int tot;
	int sum[32 * MAXN + 5];
	int lc[32 * MAXN + 5], rc[32 * MAXN + 5];
	void Initialize(int n)
	{
		for(int u = 0; u <= 32 * n; u ++) sum[u] = 0, lc[u] = rc[u] = 0;
	}
	void Change(int pu, int &u, int l, int r, int P)
	{
		u = ++ tot;
		sum[u] = sum[pu] + 1, lc[u] = lc[pu], rc[u] = rc[pu];
		if(l == r) return;
		int mid = (l + r) >> 1;
		if(P <= mid) Change(lc[pu], lc[u], l, mid, P);
		else Change(rc[pu], rc[u], mid + 1, r, P);
	}
	int Query(int u, int v, int l, int r, int L)
	{
		if(l == r) return l;
		int mid = (l + r) >> 1;
		if(sum[lc[u]] - sum[lc[v]] >= L) return Query(lc[u], lc[v], l, mid, L);
		if(sum[rc[u]] - sum[rc[v]] >= L) return Query(rc[u], rc[v], mid + 1, r, L);
		return 0;
	}
}tree;
void solve()
{
	n = read(), m = read();
	tree.Initialize(n);
	for(int i = 1; i <= n; i ++){
		a[i] = read();
		tree.Change(rt[i - 1], rt[i], 1, n, a[i]);
	}
	while(m --){
		l = read(), r = read();
		write(tree.Query(rt[r], rt[l - 1], 1, n, (r - l + 1) / 2)), putchar('\n');
	}
}
2022/8/11 09:16
加载中...