按照边权排序建出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. vue 过滤器基本使用

    Vue.js 允许你自定义过滤器,可被用于一些常见的文本格式化,例如时间戳格式化. 过滤器可以用在: 双花括号插值 v-bind 表达式 (2.1.0+ 开始支持). 过滤器应该被添加在 JavaSc ...

  2. Notepad++中的颜色属性设置大全

    Indent guideline style  缩进参考线的颜色Brace highlight style 鼠标指针在框架左右时框架的颜色(如css中{}   js中的())Bad brace col ...

  3. 【JUC源码解析】CompletableFuture

    简介 先说Future, 它用来描述一个异步计算的结果.isDone方法可以用来检查计算是否完成,get方法可以用来获取结果,直到完成前一直阻塞当前线程,cancel方法可以取消任务.而对于结果的获取 ...

  4. Socket异步通信及心跳包同时响应逻辑分析(最后附Demo)。

    有段时间没有更博了,刚好最近在做Socket通信的项目,原理大致内容:[二维码-(加logo)]-->提供主机地址和端口号信息(直接使用[ThoughtWorks.QRCode.dll]比较简单 ...

  5. Oracle数据库重做日志及归档日志的工作原理说明

    Oracle数据库重做日志及归档日志的工作原理: lgwr进程将redo log buffer中的重做数据写入到redo log中,此时的redo log分组,每当一个redo log group写满 ...

  6. 理解使用static import 机制

    J2SE 1.5里引入了“Static Import”机制,借助这一机制,可以用略掉所在的类或接口名的方式,来使用静态成员.本文介绍这一机制的使用方法,以及使用过程中的注意事项. 在Java程序中,是 ...

  7. 浅谈JS的作用域链(一)

    JS的执行环境 执行环境(Execution context,EC)或执行上下文,是JS中一个极为重要的概念. 在JavaScript中有三种代码运行环境: Global Code JavaScrip ...

  8. Python进阶量化交易场外篇5——标记A股市场涨跌周期

    新年伊始,很荣幸笔者的<教你用 Python 进阶量化交易>专栏在慕课专栏板块上线了,欢迎大家订阅!为了能够提供给大家更轻松的学习过程,笔者在专栏内容之外会陆续推出一些手记来辅助同学们学习 ...

  9. PHP magic_quotes_gpc 和 addslashes解析

    默认情况下,PHP 指令 magic_quotes_gpc 为 on,它主要是对所有的 GET.POST 和 COOKIE 数据自动运行 addslashes().不要对已经被 magic_quote ...

  10. linux及安全第八周总结

    进程的调度时机与进程的切换 操作系统原理中介绍了大量进程调度算法,这些算法从实现的角度看仅仅是从运行队列中选择一个新进程,选择的过程中运用了不同的策略而已. 对于理解操作系统的工作机制,反而是进程的调 ...