按照边权排序建出kruskal重构树,每次就变成了先找一个权值<=x的最远的祖先,然后看这个子树的第k小。离散化一下,在dfs序上做主席树即可

而且只需要建叶节点的主席树

注意输出的是第k小点的高度值

 #include<bits/stdc++.h>
#define pa pair<int,int>
#define ll long long
using namespace std;
const int maxn=1e5+,maxm=5e5+; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} struct Edge{
int a,b,l;
}eg[maxm];
pa st[maxn];
int N,M,Q,L,h[maxn<<];
int fa[maxn<<],source[maxn];
int tf[maxn<<][],ch[maxn<<][],pct;
int dfn[maxn<<][],tot;
int root[maxn],ztr[maxn*],zch[maxn*][],zct; inline int getf(int x){
return x==fa[x]?x:fa[x]=getf(fa[x]);
} inline bool cmp(Edge a,Edge b){
return a.l<b.l;
} void insert(int pre,int &now,int l,int r,int x){
now=++zct;ztr[now]=ztr[pre]+;
if(l<r){
int m=l+r>>;
if(x<=m) zch[now][]=zch[pre][],insert(zch[pre][],zch[now][],l,m,x);
else zch[now][]=zch[pre][],insert(zch[pre][],zch[now][],m+,r,x);
}
}
int query(int pre,int now,int l,int r,int k){
// printf("%d %d %d\n",l,r,k);
if(l==r) return l;
int w=ztr[zch[now][]]-ztr[zch[pre][]];
int m=l+r>>;
if(w>=k) return query(zch[pre][],zch[now][],l,m,k);
else return query(zch[pre][],zch[now][],m+,r,k-w);
} void dfs(int x){
// printf("%d %d %d %d\n",x,tf[x][0],ch[x][0],ch[x][1]);
for(int i=;tf[x][i-]&&tf[tf[x][i-]][i-];i++){
tf[x][i]=tf[tf[x][i-]][i-];
}
if((!ch[x][])&&(!ch[x][])){
dfn[x][]=dfn[x][]=++tot;
insert(root[tot-],root[tot],,L,h[x]);
}else{
dfn[x][]=tot+;
dfs(ch[x][]);dfs(ch[x][]);
dfn[x][]=tot;
}
} int find(int x,int y){
for(int i=;i>=;i--){
if(tf[x][i]&&h[tf[x][i]]<=y) x=tf[x][i];
}return x;
} int main(){
//freopen("4197.in","r",stdin);
int i,j,k;
N=rd(),M=rd(),Q=rd();
for(i=;i<=N;i++) st[i]=make_pair(rd(),i);
sort(st+,st+N+);
for(i=,j=;i<=N;i++){
if(st[i].first!=st[i-].first) j++;
h[st[i].second]=j;source[j]=st[i].first;
}L=j;
for(i=;i<=M;i++){
int a=rd(),b=rd(),c=rd();
eg[i].a=a;eg[i].b=b;eg[i].l=c;
}
sort(eg+,eg+M+,cmp);
for(i=;i<=N*;i++) fa[i]=i;
pct=N;
for(i=;i<=M;i++){
int a=getf(eg[i].a),b=getf(eg[i].b);
if(a==b) continue;
fa[a]=fa[b]=++pct;h[pct]=eg[i].l;
tf[a][]=tf[b][]=pct;
ch[pct][]=a,ch[pct][]=b;
}
for(i=pct;i;i--){
if(!dfn[i][]) dfs(i);
}
for(i=;i<=Q;i++){
int a=rd(),b=rd(),c=rd();
int x=find(a,b);
int pr=root[dfn[x][]-],no=root[dfn[x][]];
int w=ztr[no]-ztr[pr];
if(w<c) printf("-1\n");
else{
printf("%d\n",source[query(pr,no,,L,w-c+)]);
}
}
return ;
}

luogu4197 Peaks (kruskal重构树+主席树)的更多相关文章

  1. BZOJ3545&3551[ONTAK2010]Peaks——kruskal重构树+主席树+dfs序+树上倍增

    题目描述 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点v开始只 ...

  2. 洛谷P4197 Peaks(Kruskal重构树 主席树)

    题意 题目链接 往后中文题就不翻译了qwq Sol 又是码农题..出题人这是强行把Kruskal重构树和主席树拼一块了啊.. 首先由于给出的限制条件是<=x,因此我们在最小生成树上走一定是最优的 ...

  3. 【BZOJ3545】Peaks(Kruskal重构树 主席树)

    题目链接 大意 给出有\(N\)个点\(M\)条边的一张图,其中每个点都有一个High值,每条边都有一个Hard值. 再给出\(Q\)个询问:\(v\) \(x\) \(k\) 每次询问查询从点\(v ...

  4. 【BZOJ3551】【BZOJ3545】 【ONTAK2010】 Peaks (kruskal重构树+主席树)

    Description ​ 在\(Bytemountains\)有\(~n~\)座山峰,每座山峰有他的高度\(~h_i~\). 有些山峰之间有双向道路相连,共\(~m~\)条路径,每条路径有一个困难值 ...

  5. luoguP4197:Peaks(Kruskal重构树+主席树)或者(点分树+离线)

    题意:有N座山,M条道路.山有山高,路有困难值(即点权和边权).现在Q次询问,每次给出(v,p),让求从v出发,只能结果边权<=p的边,问能够到达的山中,第K高的高度(从大到小排序). 思路:显 ...

  6. 【BZOJ-3545&3551】Peaks&加强版 Kruskal重构树 + 主席树 + DFS序 + 倍增

    3545: [ONTAK2010]Peaks Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1202  Solved: 321[Submit][Sta ...

  7. [BZOJ3551][ONTAK2010]Peaks(加强版)(Kruskal重构树,主席树)

    3551: [ONTAK2010]Peaks加强版 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2438  Solved: 763[Submit][ ...

  8. [luogu P4197] Peaks 解题报告(在线:kruskal重构树+主席树 离线:主席树+线段树合并)

    题目链接: https://www.luogu.org/problemnew/show/P4197 题目: 在Bytemountains有N座山峰,每座山峰有他的高度$h_i$.有些山峰之间有双向道路 ...

  9. LOJ.2865.[IOI2018]狼人(Kruskal重构树 主席树)

    LOJ 洛谷 这题不就是Peaks(加强版)或者归程么..这算是\(IOI2018\)撞上\(NOI2018\)的题了? \(Kruskal\)重构树(具体是所有点按从小到大/从大到小的顺序,依次加入 ...

随机推荐

  1. LINUX内核设计第五周——扒开系统调用的三层皮(下)

  2. vue 项目引入字体报错

    vue 项目引入特殊字体,总是提示有问题 原因是,在webpack 里面的配置有问题 在项目文件里面引入字体的时候,应该写url-loader 而不能是url

  3. Notepad++ 大小写转换

    code_field_text 普通文本 code_field_user_id 用户ID code_field_customer_id 客户ID code_field_dict 数据字典 code_f ...

  4. No input file specified ci

    1. php.ini(/etc/php5/cgi/php.ini)的配置中这两项cgi.fix_pathinfo=1  (这个是自己添加的)

  5. [转帖]关于hostnamectl 命令

    作者:Linux运维 来源:CSDN 原文:https://blog.csdn.net/linuxnews/article/details/51112022 版权声明:本文为博主原创文章,转载请附上博 ...

  6. 转载 linux常用的监控命令工具

    工具 简单介绍top 查看进程活动状态以及一些系统状况vmstat 查看系统状态.硬件和系统信息等iostat 查看CPU 负载,硬盘状况sar 综合工具,查看系统状况mpstat 查看多处理器状况n ...

  7. [转帖]服务器操作系统应该选择 Debian/Ubuntu 还是 CentOS?

    来源:https://www.zhihu.com/question/19599986 作者: https://www.zhihu.com/people/yuan-hao-yang/answers IT ...

  8. PRML读书笔记_绪论

    一.基本名词 泛化(generalization) 训练集所训练的模型对新数据的适用程度. 监督学习(supervised learning) 训练数据的样本包含输入向量以及对应的目标向量. 分类( ...

  9. Angular 序列化和反序列化和遍历

    <!DOCTYPE html><html ng-app="myApp"><head lang="en"> <meta ...

  10. SpringBoot(十五)_springboot实现预览pdf

    最近,项目上要做个打印的东西,还要预览.我想就直接生成pdf预览,然后用户选择打印 于是,昨天找了找资料.一般用itext 进行转pdf.于是我就用springboot试了试,代码比较简单,现在只是简 ...