永无乡

永无乡

原题链接(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;
}

原文链接: https://www.cnblogs.com/loser--QAQ/p/17024539.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    永无乡

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/309603

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月16日 上午11:08
下一篇 2023年2月16日 上午11:09

相关推荐