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\)重构树(具体是所有点按从小到大/从大到小的顺序,依次加入 ...
随机推荐
- 基于Angular+WebAPI+OData的增删改查
对于在ASP.NET WebAPI中怎么使用OData,已经在我前面的日志中的说明, 在ASP.NET Web API中使用OData 在这个示例中.我新建了一个Order的实体,在前端使用Angul ...
- C. Banh-mi
链接 [http://codeforces.com/contest/1062/problem/C] 题意 给你有n个字符(0 or 1)的串,当去某个位置时所有的剩下的位置都加上这个位置的数字,q次查 ...
- B. Forgery
链接 [http://codeforces.com/contest/1059/problem/B] 题意 要伪造医生签名,先给你医生的签名nm的网格'.'表示空白',#'表示墨水,你的笔可以这么画以一 ...
- 个人作业-Week1(新增详细说明)
快速看完整部教材,列出你仍然不懂的5到10个问题,发布在你的个人博客上. 如何提出有价值的问题? 请看这个文章:http://www.cnblogs.com/rocedu/p/5167941.html ...
- pair work结对编程(张艺 杨伊)
一.结对编程人员: 张艺(学号后三位:185) 杨伊(学号后三位:151) 二.这是我们工作的样子:(图片) 三.结对编程优缺点: 优点: 1.结对编程时间紧密,在一定程度上可以督促双方学习,提高 ...
- Github以及推广
非常抱歉,我忘记在这个博客上发一遍了,之前是我同学代发,而我忘记把链接给发过来... Github: http://www.cnblogs.com/case1/p/5060015.html 推广: h ...
- Get filename from URL using Javascript
http://befused.com/javascript/get-filename-url Get filename from URL using Javascript This snippet ...
- Docker 安装私有镜像库的简单使用
公司的网络实在是太差了, 想着自己搭建一个私有的镜像库进行使用测试使用.... docker pull registry.docker-cn.com/library/registry docker t ...
- CentOS 使用SMB服务 让windows能够上传文件
1. 新增加用户 useradd zhaobsh 2. 使用 pdbedit的方式新增加用户 pdbedit -a -u zhaobsh 3. 修改smb服务 systemctl restart sm ...
- html 统一资源定位器(url)和url编码
url,即统一资源定位器,也叫网址. 点击<a>标签就会连接到url指定的服务器web资源,文档或者其它数据: url的命名规则:url可是域名或者IP地址 url="shcem ...