社区讨论

萌新刚学算法主席树全wa求助

P3901数列找不同参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@loc1too2
此快照首次捕获于
2023/10/30 06:34
2 年前
此快照最后确认于
2023/11/04 12:09
2 年前
查看原帖
CPP
#include<iostream>
#include<algorithm>
using namespace std;
struct node {
	int l, r, ans;
}tree[200005];
int a[100005], all = 0,root[100005],lsh[1000005];
int new_node(int at){
	tree[++all] = tree[at];
	return all;
}
int build(int l,int r,int at) {
	at = ++all;
	if (l == r) {
		return at;
	}
	int mid = (l + r) >> 1;
	tree[at].l = build(l, mid, tree[at].l);
	tree[at].r = build(mid + 1, r, tree[at].r);
	return at;
}
int insert(int l,int r,int at,int to) {
	int now = new_node(at);
	if (l == r) {
		if (!tree[now].ans)
			tree[now].ans = 1;
		return now;
	}
	int mid = (l + r) >> 1;
	if (to <= mid)tree[now].l = insert(l, mid, tree[now].l, to);
	else tree[now].r = insert(mid + 1, r, tree[now].r, to);
	tree[now].ans = tree[tree[now].l].ans + tree[tree[now].r].ans;
	return now;
}
int main() {
	int n, t;
	cin >> n >> t;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		lsh[i] = a[i];
	}
	root[0] = build(1, n, 0);
	sort(a + 1, a + n + 1);
	int m = unique(a + 1, a + n + 1) - a - 1;
	for (int i = 1; i <= n; i++) {
		lsh[i] = lower_bound(a + 1, a + m + 1, lsh[i]) - a;
		root[i] = insert(1, n, root[i-1],lsh[i]);
	}
	while (t--) {
		int l, r;
		cin >> l >> r;
		int now = r - l + 1;
		int x = tree[root[r]].ans - tree[root[l - 1]].ans;
		if (x == now)
			cout << "Yes" << endl;
		else
			cout << "No" << endl;
	}
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...