按照边权排序建出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. Luogu P2568 GCD

    我们首先发现这样肯定是做不了的,所以我们枚举为\(gcd(x,y)=d\)的\(d\) 然后考虑以下的性质: \(gcd(x,y)=1 \Leftrightarrow gcd(px,py)=p(p为素 ...

  2. ETL流程介绍及常用实现方法

    ETL是英文Extract-Transform-Load 的缩写,用来描述将数据从来源端经过抽取(extract).转换(transform).加载(load)至目的端的过程.常见于数据仓库开发中将数 ...

  3. 关于EasyUI datagrid 无法在dialog中显示的问题分析及解决方案!

    最近项目中引用了easyUI,很大程度上的简化了开发过程,但是随之而来的也遇到一些问题,比如:标题中遇到的问题,去网上搜罗了下关于这个问题的解决方案,不是说的很复杂就是干脆文不对题,国外的使用这种稍微 ...

  4. 一个很好用的在线编辑、展示、分享、交流JavaScript 代码的平台

    在发表博客时,有一些代码只能粘贴进去,而不能看到代码运行的效果,需要读者把代码粘贴进自己的编辑器,然后再运行看效果,这是一件很耗时的事情 在平时百度的时候,我发现一些网站可以在线预览功能,而且可以在线 ...

  5. 一文让你熟练掌握Linux的ncat(nc)命令

    一文让你熟练掌握Linux的ncat(nc)命令 ncat 或者说 nc 是一款功能类似 cat 的工具,但是是用于网络的.它是一款拥有多种功能的 CLI 工具,可以用来在网络上读.写以及重定向数据. ...

  6. youtube下载工具

    Youtube是一个全球性的视频分享网站,其种类之多,内容之丰富,是大家有目共睹的.特别是原创视频更是多不胜数, 每分钟都有400+小时的youtube视频上传,每天都有30亿+的视频被观看.随着视频 ...

  7. SCRUM 12.20

    以下为我们爬虫遇到问题的报告 我们团队的m2阶段原本计划是爬取美团的信息以支持我们的app对比功能,但在这一阶段遇到很多问题,主要表现如下: 美团反爬机制: 由于我们团队人员在事先并不知道美团具有反爬 ...

  8. 关于对springboot程序配置文件使用jasypt开源工具自定义加密

    一.前言 在工作中遇到需要把配置文件加密的要求,很容易就在网上找到了开源插件 jasypt  (https://github.com/ulisesbocchio/jasypt-spring-boot# ...

  9. beanutils的使用

    在项目进行中,使用到beanutils时发现1.9.X以上版本搭配logging搭配使用用不了,实在搞不明白.----stackoverflow提问吧 BeanUtils工具由Apache软件基金组织 ...

  10. Java的JDK下Hashtable与HashMap的区别

    时间角度: Hashtable * @since JDK1.0 ; HashMap* @since   1.2 基类与接口角度: public class Hashtable<K,V> e ...