永无乡

永无乡

原题链接(acwing)

可持久化线段树合并与查询(权值的划分)

  1. 线段树的合并与查询加上并查集的访问根结点
  2. 创建线段树的时候,每一个点对应为一条链式结构,且创建好线段树后,它的空间大小不再发生变化
  3. 合并的时候是两条路径都要合并,不仅仅是一条路径的合并

~其实我感觉思路还是挺一目了然的,但是洛谷过不了(数据点全wa),然后下载了数据对比了一下前面和后面的,没有区别;然后我在y总的acwing里面提交时是 Accepted 的,求大佬指教!!!,解决了,输入的地方有问题,洛谷不能这样输入getchar();scanf("%c %d %d", &op, &x, &y);

代码

#include<bits/stdc++.h>
using namespace std;

const int N = 1e5 + 7;

int n, m, q, cnt, a[N], an[N], rt[N], f[N];

struct Node{
	int l ,r, sum;
}node[N * 60];

int find(int x){
	return f[x] == x ? x : f[x] = find(f[x]);
}

int build(int l, int r, int v){
	int p = ++ cnt; 
	node[p].sum ++;
	if(l == r) return p;
	int mid = (l + r) >> 1;
	if(v <= mid) node[p].l = build(l, mid, v);
	else node[p].r = build(mid + 1, r, v);
	return p;
}

void add(int &rx, int ry){
	if(!ry) return;
	if(!rx){ rx = ry; return; }
	node[rx].sum += node[ry].sum;
	add(node[rx].r, node[ry].r);
	add(node[rx].l, node[ry].l);
}

int query(int k, int p, int l, int r){
	if(l == r) return l;
	int mid = (l + r) >> 1;
	if(k > node[node[p].l].sum)
		return query(k - node[node[p].l].sum, node[p].r, mid + 1, r);
	else
		return query(k, node[p].l, l, mid);
}

int main(){
	scanf("%d%d", &n, &m);
	for(int i = 1;i <= n; i++){
		scanf("%d", &a[i]);
		rt[i] = build(1, n, a[i]);
		f[i] = i, an[a[i]] = i;
	}
	for(int i = 1;i <= m;i ++){
		int x, y;
		scanf("%d%d", &x, &y);
		int rx = find(x), ry = find(y);
		if(rx != ry){
			add(rt[rx], rt[ry]);
			f[ry] = f[rx];
		}
	}
	scanf("%d", &q);
	while(q --){
		char op;
		int x, y;
		getchar();
		scanf("%c %d %d", &op, &x, &y);
		if(op == 'Q'){
			int rx = find(x);
			if(node[rt[rx]].sum < y) printf("-1\n");
			else
				printf("%d\n", an[query(y, rt[rx], 1, n)]);
		}
		else{
			int rx = find(x), ry = find(y);
			if(rx != ry){
				add(rt[rx], rt[ry]);
				f[ry] = f[rx];
			}
		}
	}
	return 0;
}
posted @   feuerwerk  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示