题目大意
感觉题目描述已经足够清楚了。
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