luogu4197 Peaks (kruskal重构树+主席树)
按照边权排序建出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重构树+主席树)的更多相关文章
- BZOJ3545&3551[ONTAK2010]Peaks——kruskal重构树+主席树+dfs序+树上倍增
题目描述 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点v开始只 ...
- 洛谷P4197 Peaks(Kruskal重构树 主席树)
题意 题目链接 往后中文题就不翻译了qwq Sol 又是码农题..出题人这是强行把Kruskal重构树和主席树拼一块了啊.. 首先由于给出的限制条件是<=x,因此我们在最小生成树上走一定是最优的 ...
- 【BZOJ3545】Peaks(Kruskal重构树 主席树)
题目链接 大意 给出有\(N\)个点\(M\)条边的一张图,其中每个点都有一个High值,每条边都有一个Hard值. 再给出\(Q\)个询问:\(v\) \(x\) \(k\) 每次询问查询从点\(v ...
- 【BZOJ3551】【BZOJ3545】 【ONTAK2010】 Peaks (kruskal重构树+主席树)
Description 在\(Bytemountains\)有\(~n~\)座山峰,每座山峰有他的高度\(~h_i~\). 有些山峰之间有双向道路相连,共\(~m~\)条路径,每条路径有一个困难值 ...
- luoguP4197:Peaks(Kruskal重构树+主席树)或者(点分树+离线)
题意:有N座山,M条道路.山有山高,路有困难值(即点权和边权).现在Q次询问,每次给出(v,p),让求从v出发,只能结果边权<=p的边,问能够到达的山中,第K高的高度(从大到小排序). 思路:显 ...
- 【BZOJ-3545&3551】Peaks&加强版 Kruskal重构树 + 主席树 + DFS序 + 倍增
3545: [ONTAK2010]Peaks Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1202 Solved: 321[Submit][Sta ...
- [BZOJ3551][ONTAK2010]Peaks(加强版)(Kruskal重构树,主席树)
3551: [ONTAK2010]Peaks加强版 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2438 Solved: 763[Submit][ ...
- [luogu P4197] Peaks 解题报告(在线:kruskal重构树+主席树 离线:主席树+线段树合并)
题目链接: https://www.luogu.org/problemnew/show/P4197 题目: 在Bytemountains有N座山峰,每座山峰有他的高度$h_i$.有些山峰之间有双向道路 ...
- LOJ.2865.[IOI2018]狼人(Kruskal重构树 主席树)
LOJ 洛谷 这题不就是Peaks(加强版)或者归程么..这算是\(IOI2018\)撞上\(NOI2018\)的题了? \(Kruskal\)重构树(具体是所有点按从小到大/从大到小的顺序,依次加入 ...
随机推荐
- [已解决]An unhandled exception occurred while processing the request.
An unhandled exception occurred while processing the request. InvalidOperationException: The layout ...
- 懒人小工具:T4生成实体类Model,Insert,Select,Delete以及导出Excel的方法
由于最近公司在用webform开发ERP,用到大量重复机械的代码,之前写了篇文章,懒人小工具:自动生成Model,Insert,Select,Delete以及导出Excel的方法,但是有人觉得这种方法 ...
- 【nodejs】让nodejs像后端mvc框架(asp.net mvc)一样处理请求--控制器和处理函数的注册篇(4/8)【controller+action】
文章目录 前情概要 前边的文章把一些基本的前置任务都完成了.接下就是比较重要的处理函数action是如何自动发现和注册的拉,也就是入口函数RouteHandler(也是我们的第一个express中间件 ...
- CSS 分类 (Classification) 实例
CSS 分类 (Classification) 实例CSS 分类属性 (Classification)CSS 分类属性允许你控制如何显示元素,设置图像显示于另一元素中的何处,相对于其正常位置来定位元素 ...
- open-falcon ---安装Dashboard时候报错"SSLError: The read operation timed out"
在部署open-falcon环境过程中,安装Dashboard时候报错"SSLError: The read operation timed out".如下: [root@open ...
- 2-Twenty Second Scrum Meeting-20151222
任务安排 成员 今日完成 明日任务 闫昊 服务器关闭,开发停滞…… …… 唐彬 服务器关闭,开发停滞…… …… 史烨轩 服务器关闭,开发停滞…… …… 余帆 路径保存 路径整合 金哉仁 ...
- nodejs框架对比
最近想实操nodejs,在选择框架的时候,查阅后大致整理为如下表格内容. 此处列举下才开始使用eggjs框架: 1.其基于koa开发: 2.若为企业级项目,用其脚手架egg-inint搭建会快很多,后 ...
- hg命令
hg常用命令 hg命令跟git命令大同小异 hg version 查看hg版本 hg clone url 克隆代码仓库 hg branch newBranch 创建分支 hg update other ...
- 修复PLSQL Developer 与 Office 2010的集成导出Excel 功能
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\.htm]"PerceivedType"="text&qu ...
- Jira 自定义工作流
一.添加修改工作流 打开 设置--问题--工作流 复制一个工作流,然后进去编辑页面 添加状态 增加转换动作 切换到文本,设置跳转过程中的事件 针对Stop Progress事件,修改跳转界面(界面需先 ...