P7834 [ONTAK2010] Peaks 加强版

本文详细解析了一道涉及图论和数据结构的在线算法问题,包括最小生成树、区间第k大问题以及重构树的应用。通过克鲁斯卡尔算法解决最小生成树,主席树解决静态区间查询,最后利用重构树将两者结合,高效地回答在线询问。文章适合对图论和数据结构有一定基础的读者深入理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传送门

题目大意

感觉题目描述已经足够清楚了。

Solution

这道题需要的东西有点多,我们不妨先来分解一下题目的需求。

  • 经过权值 ≤ x \le x x 的边所能到达的点。

马上想到最小生成树,很明显了,和货车运输一样。不赘述了。

  • 所有点中权值第 k k k 大。

好的,又是裸的静态区间第 k k k 大。由于是强制在线,所以一发主席树就结束了。

好接下来我们把这两个玩意儿结合一下,哦,然后我们掏出一个克鲁斯卡尔重构树就做完了。

我是 fyy,我一眼秒了,感觉这题没啥技巧啊。

好的我具体讲一下。我们对于图做一次重构树,然后在大法师的时候顺便记一下每个节点子树中涵盖的叶节点的 d f n dfn dfn 区间,并据此建主席树,然后直接回答询问就可以了,还是比较模板的,注意细节就可以了。

Code

#include<bits/stdc++.h>
#define ll long long
#define inf (1<<30)
#define INF (1ll<<60)
using namespace std;
const int MAXN=3e6+10;
struct Tree{
   
	int l,r,ls,rs;
	int sum;
}tr[MAXN];
int ntot,T[MAXN];
int build(int l,int r){
   
	int i=++ntot;
	tr[i].l=l;tr[i].r=r;
	if(l==r) return i;
	int mid=l+r>>1;
	tr[i].ls=build(l,mid);
	tr[i].rs=build(mid+1,r);
	return i;
}
int upd
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值