首页 > 其他分享 >永无乡

永无乡

时间:2023-01-04 13:25:17浏览次数:47  
标签:node return int 永无 mid sum 线段

永无乡

原题链接(acwing)

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

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

其实我感觉思路还是挺一目了然的,但是洛谷过不了(数据点全wa),然后下载了数据对比了一下前面和后面的,没有区别;然后我在y总的acwing里面提交时是 Accepted 的,求大佬指教!!!

代码

#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;
}

标签:node,return,int,永无,mid,sum,线段
From: https://www.cnblogs.com/loser--QAQ/p/17024539.html

相关文章

  • 洛谷P3224 [HNOI2012]永无乡 题解 splay tree 启发式合并
    题目链接:https://www.luogu.com.cn/problem/P3224主要知识点是:树上启发式合并,即每次合并将小的树里面的每个点合并大大的树里面,时间复杂度\(O(n\log^2n)\)。同时需要......
  • 【XSY4375】永无乡(二元GF)
    以下“二叉树”均默认为有根无标号但区分左右儿子的二叉树。设\(h_{n,k}\)表示\(n,k\)的答案,有:\[h_{n,k}=\sum_{i=0}^{n-1}\left(h_{i,k}\cdotf_{n-i-1}+f_{i}\cd......
  • BZOJ 2733: [HNOI2012]永无乡
    题目链接:​​传送门​​​Description永无乡包含n座岛,编号从1到n,每座岛都有自己的独一无二的重要度,按照重要度可以将这n座岛排名,名次用1到n来表示。某些岛之间......
  • 洛谷 P3224 [HNOI2012]永无乡 题解
    查询第\(k\)小值想到权值线段树。合并操作想到线段树合并。维护连通性想到并查集。并查集合并方向应与线段树合并方向一致。查询时,先求出并查集的根再在线段树上询......
  • luoguP3224 [HNOI2012]永无乡【线段树,并查集】
    洞庭青草,近中秋,更无一点风色。玉鉴琼田三万顷,着我扁舟一叶。素月分辉,明河共影,表里俱澄澈。悠然心会,妙处难与君说。应念岭表经年,孤光自照,肝胆皆冰雪。短发萧骚襟袖冷,稳泛......