题意:多次求从点x出发经过边权不超过k的边能走到的点中第k大的权值。

解:离线排序 + 并查集 + 线段树合并。

题面有锅...是第k大的权值不是第k大的山。

 #include <cstdio>
#include <algorithm> const int N = , M = , V = ; struct Edge {
int x, y, h;
inline bool operator <(const Edge &w) const {
return h < w.h;
}
}edge[M]; struct Ask {
int x, h, k, id;
inline bool operator <(const Ask &w) const {
return h < w.h;
}
}ask[M]; int fa[N], rt[N], ls[V], rs[V], sum[V], siz[N], tot, ans[M], X[N], val[N]; int find(int x) {
if(x == fa[x]) {
return x;
}
return fa[x] = find(fa[x]);
} int merge(int x, int y) {
if(!x || !y) {
return x | y;
}
int o = ++tot;
sum[o] = sum[x] + sum[y];
ls[o] = merge(ls[x], ls[y]);
rs[o] = merge(rs[x], rs[y]);
return o;
} int query(int k, int l, int r, int o) {
if(l == r) {
return r;
}
int mid = (l + r) >> ;
if(k > sum[rs[o]]) {
return query(k - sum[rs[o]], l, mid, ls[o]);
}
else {
return query(k, mid + , r, rs[o]);
}
} inline void Xmerge(int x, int y) {
x = find(x);
y = find(y);
if(x == y) {
return;
}
fa[y] = x;
siz[x] += siz[y];
// printf("siz %d += %d = %d \n", x, siz[y], siz[x]);
rt[x] = merge(rt[x], rt[y]);
return;
} void insert(int p, int l, int r, int &o) {
if(!o) {
o = ++tot;
}
sum[o] = ;
if(l == r) {
return;
}
int mid = (l + r) >> ;
if(p <= mid) {
insert(p, l, mid, ls[o]);
}
else {
insert(p, mid + , r, rs[o]);
}
return;
} int main() {
int n, m, q;
scanf("%d%d%d", &n, &m, &q);
for(int i = ; i <= n; i++) {
scanf("%d", &val[i]);
X[i] = val[i];
}
std::sort(X + , X + n + );
int xx = std::unique(X + , X + n + ) - X - ;
for(int i = ; i <= n; i++) {
val[i] = std::lower_bound(X + , X + xx + , val[i]) - X;
insert(val[i], , xx, rt[i]);
fa[i] = i; siz[i] = ;
}
for(int i = ; i <= m; i++) {
scanf("%d%d%d", &edge[i].x, &edge[i].y, &edge[i].h);
}
for(int i = ; i <= q; i++) {
scanf("%d%d%d", &ask[i].x, &ask[i].h, &ask[i].k);
ask[i].id = i;
}
std::sort(edge + , edge + m + );
std::sort(ask + , ask + q + ); int p = ;
for(int i = ; i <= q; i++) {
while(p <= m && edge[p].h <= ask[i].h) {
Xmerge(edge[p].x, edge[p].y);
p++;
// printf("Xmerge %d %d \n", edge[p].x, edge[p].y);
}
int x = find(ask[i].x);
// printf("x = %d \n", x);
// printf("%d < %d \n", siz[x], ask[i].k);
if(siz[x] < ask[i].k) ans[ask[i].id] = -;
else ans[ask[i].id] = X[query(ask[i].k, , xx, rt[x])];
}
for(int i = ; i <= q; i++) {
printf("%d\n", ans[i]);
}
return ;
}

AC代码

bzoj3545 Peaks的更多相关文章

  1. [bzoj2733]永无乡&&[bzoj3545]Peaks

    并不敢说完全会了线段树合并,只是至少知道原理写法了...还是太菜了,每天被大佬吊锤qwq 我看到的几道线段树合并都是权值线段树的合并.这个算法适用范围应该只是01线段树的. 这两道算入门题了吧... ...

  2. BZOJ3545 Peaks 离线处理+线段树合并

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

  3. bzoj3545 Peaks 线段树合并

    离线乱搞... 也就是一个线段树合并没什么 #include<algorithm> #include<iostream> #include<cstring> #in ...

  4. [您有新的未分配科技点][BZOJ3545&BZOJ3551]克鲁斯卡尔重构树

    这次我们来搞一个很新奇的知识点:克鲁斯卡尔重构树.它也是一种图,是克鲁斯卡尔算法求最小生成树的升级版首先看下面一个问题:BZOJ3545 Peaks. 在Bytemountains有N座山峰,每座山峰 ...

  5. [学习笔记]kruskal重构树 && 并查集重构树

    Kruskal 重构树 [您有新的未分配科技点][BZOJ3545&BZOJ3551]克鲁斯卡尔重构树 kruskal是一个性质优秀的算法 加入的边是越来越劣的 科学家们借这个特点尝试搞一点事 ...

  6. bzoj3545: [ONTAK2010]Peaks 重构树 主席树

    题目链接 bzoj3545: [ONTAK2010]Peaks 题解 套路重构树上主席树 代码 #include<cstdio> #include<algorithm> #de ...

  7. 【BZOJ3545】 [ONTAK2010]Peaks

    BZOJ3545 [ONTAK2010]Peaks Solution 既然会加强版,直接把强制在线的操作去掉就好了. 代码实现 #include<stdio.h> #include< ...

  8. 【bzoj3545】[ONTAK2010]Peaks 线段树合并

    [bzoj3545][ONTAK2010]Peaks 2014年8月26日3,1512 Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路 ...

  9. 「BZOJ3545」「ONTAK2010」Peaks

    「BZOJ3545」「ONTAK2010」Peaks 题目传送门 题目大意: 给定一个 \(n\) 个点,\(m\) 条边的带点权边权无向图,有 \(q\) 次询问,每次询问从 \(v\) 点出发,经 ...

随机推荐

  1. 【下一代核心技术DevOps】:(二)Rancher的应用及优点简介

    1.环境选择 安装Rancher环境,一定要在干净的linux主机上进行,避免出现因配置导致的莫名其妙的问题.服务器操作系统建议CentOS7.4(内核3.10以上)低于这个版本的系统 如7.3 7. ...

  2. Jmeter(二十九)_dotnet搭建本地接口服务

    这里使用的服务名为Bookshelf,在github上,自行下载.要运行此服务,需要.Net Core SDK 2.1或更高版本.如果尚未安装,从.Net Core官方网站下载并安装. 在本地克隆项目 ...

  3. #个人博客作业Week2——关于代码规范的讨论

    <1> 这些规范都是官僚制度下产生的浪费大家的编程时间.影响人们开发效率, 浪费时间的东西. 反驳:官僚制度在一定程度下维持了社会的和谐稳定,一个没有法律.没有拥有完善的管理体制.完全崇尚 ...

  4. 个人作业Week1

    一.<构建之法>提问 1.需求是什么?需求的规范需要明确吗? 2.一个人开发效率非常高,多人开发,个人效率随团队人数上升而直线下降,我们一般需要将大项目拆为小项目,使协作耦合产生的效率负影 ...

  5. BugPhobia开发终结篇章:Beta阶段第XI次Scrum Meeting

    0x01 :Scrum Meeting基本摘要 Beta阶段第十一次Scrum Meeting 敏捷开发起始时间 2015/01/06 00:00 A.M. 敏捷开发终止时间 2016/01/10 0 ...

  6. Android 學習之旅!(1)

    就這樣就過去了一年加一個學期,現在是大二第二個學期而且是下半學期了,以前都是無所事事,沒事睡睡覺,打打遊戲就過去了,但是想到家境和以後的路,我還是決心自己找點東西學習下,以後出去還能有一技之長(雖然可 ...

  7. 通过LVM给Linux扩容

    主要参考以下两篇文章: 1:https://www.cnblogs.com/sixiweb/p/3360008.html 2:https://wenku.baidu.com/view/42deee1a ...

  8. Install Jetty web server on CentOS 7 / RHEL 7

    http://www.eclipse.org/jetty/download.html http://www.eclipse.org/jetty/documentation/current/startu ...

  9. python之hasattr、getattr和setattr函数

    hasattr函数使用方法 # hasattr函数使用方法 # hasattr(object,attr) # 判断一个对象里是否有某个属性或方法,返回布尔值,有为True,否则False class ...

  10. python之类的继承

    # 类的的操作实例 # 子类ECar继承父类Car,并将实例Battery用作属性 class Car(): def __init__(self, name, model, year): self.n ...