题意:多次求从点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. 使用ajax方法实现form表单的提交

    作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载. 写在前面的话 在使用form表单的时候,一旦点击提交触发submit ...

  2. 浅谈JS的作用域链(三)

    前面两篇文章介绍了JavaScript执行上下文中两个重要属性:VO/AO和scope chain.本文就来看看执行上下文中的this. 首先看看下面两个对this的概括: this是执行上下文(Ex ...

  3. “耐撕团队”部署并测试onezero团队记帐本项目

    耐撕团队 对onezero团队记帐本项目的部署并测试 测试指标参见下面给出的博客: http://www.ltesting.net/ceshi/ceshijishu/xncs/2014/1030/20 ...

  4. Fake NP CodeForces - 805A (思维)

    Tavak and Seyyed are good friends. Seyyed is very funny and he told Tavak to solve the following pro ...

  5. Magazine Ad CodeForces - 803D (二分+贪心)

    The main city magazine offers its readers an opportunity to publish their ads. The format of the ad ...

  6. 递归拼装Tree结构数据

    @Override public List<Map<String, Object>> queryListTree() { List<Map<String,Objec ...

  7. centos7编译安装zabbix的错误

    [Z3001] connection to database 'zabbix' failed: [2002] Can't connect to local MySQL server through s ...

  8. PHP使用Redis实现消息队列

    消息队列可以使用MySQL来实现,可以参考博客PHP使用MySQL实现消息队列,虽然用MySQL可以实现,但是一般不这么用,因为MySQL的数据都存在硬盘中,而从硬盘中对MySQL的操作,I/O花费的 ...

  9. HDU 2075 A|B?

    http://acm.hdu.edu.cn/showproblem.php?pid=2075 Problem Description 正整数A是否能被正整数B整除,不知道为什么xhd会研究这个问题,来 ...

  10. 服务器RAID设置以及简单理解

    备注: 适用于测试环境,生产环境暂时未验证 1. RAID种类 最高性能的RAID0 完全拆分所有的IO 不进行校验 但是单盘损坏, 数据完全丢失 最高损耗的RAID1 损失一半的存储容量, 做镜像, ...