题目链接

bzoj3545: [ONTAK2010]Peaks

题解

套路重构树上主席树

代码

#include<cstdio>
#include<algorithm>
#define gc getchar
#define pc putchar
inline int read() {
int x = 0,f = 1;
char c = getchar();
while(c < '0' || c > '9') { if(c == '-')f = -1; c = gc(); }
while(c <= '9' && c >= '0') x = x * 10 + c - '0',c = gc();
return x * f;
}
void print(int x) {
if(x < 0) {
pc('-');
x = -x;
}
if(x >= 10) print(x / 10);
pc(x % 10 + '0');
}
int n,m,q;
const int maxn = 500007;
int h[maxn];
struct node {
int u,v,w,next;
} e[maxn],edge[maxn];
int num = 0,head[maxn];
inline void add_edge(int u,int v) {
edge[++ num].v = v; edge[num].next = head[u],head[u] = num;
}
inline bool cmp(node a,node b) {
return a.w < b.w;
}
int fa[maxn];
int dad[maxn][23],mn[maxn];
int tot = 0;
int L[maxn],R[maxn];
int rt[maxn];
int lin[maxn],cnt = 0;
void dfs(int x) {
L[x] = 0x3f3f3f3f;
R[x] = 0;
if(!head[x]) {
lin[++ cnt] = x;
L[x] = R[x] = cnt;
return;
}
for(int i = head[x];i ;i = edge[i].next) {
int v = edge[i].v;
dfs(v);
L[x] = std::min(L[v],L[x]);
R[x] = std::max(R[v],R[x]);
}
} int b[maxn];
int sum = 0;
struct Cmt {
int ls[100000 * 20],rs[100000 * 20],siz[100000 * 20];
void insert(int px,int &x,int l,int r,int k) {
x = ++ sum;
siz[x] = siz[px] + 1;
if(l == r) return;
ls[x] = ls[px], rs[x] = rs[px];
int mid = l + r >> 1;
if(k <= mid) insert(ls[px],ls[x],l,mid,k);
else insert(rs[px],rs[x],mid + 1,r,k);
}
int query(int lx,int rx,int l,int r,int k) {
if(l == r) return l;
int mid = l + r >> 1, tmp = siz[rs[rx]] - siz[rs[lx]];
if(tmp >= k) return query(rs[lx],rs[rx],mid + 1,r,k);
else return query(ls[lx],ls[rx],l,mid,k - tmp);
}
} t;
int get(int x,int val) {
for(int i = 20;i >= 0;-- i)
if(mn[dad[x][i]] <= val)
x = dad[x][i];
return x;
}
int find(int x) {
if(fa[x] != x) fa[x] = find(fa[x]);
return fa[x];
}
int main() {
mn[0] = 0x3f3f3f3f;
n = read(); m = read(); q = read();
for(int i = 1;i <= n;++ i) b[i] = h[i] = read();
std::sort(b + 1,b + n + 1);
int len = std::unique(b + 1,b + n + 1) - b - 1; for(int i = 1;i <= n;++ i) h[i] = std::lower_bound(b + 1,b + len + 1,h[i]) - b; for(int i = 1;i <= m;++ i)
e[i].u = read(),e[i].v = read(),e[i].w = read();
tot = n;
for(int i = 1;i <= n;++ i) fa[i] = i;
std::sort(e + 1,e + m + 1,cmp);
int nnn = 0;
for(int i = 1;i <= m;++ i) {
int u = e[i].u,v = e[i].v;
int fu = find(u),fv = find(v);
if(fu != fv) {
++ tot;
dad[fu][0] = tot;
dad[fv][0] = tot;
add_edge(tot,fu);
add_edge(tot,fv);
fa[fu] = tot;
fa[fv] = tot;
fa[tot] = tot;
mn[tot] = e[i].w;
nnn ++;
}
if(nnn == n - 1) break;
}
for(int i = 1;i <= 20;++ i)
for(int j = 1;j <= tot; ++ j)
dad[j][i] = dad[dad[j][i - 1]][i - 1];
//print(dad[15][0]);
dfs(tot);
for(int i = 1;i <= cnt;++ i)
t.insert(rt[i - 1],rt[i],1,len,h[lin[i]]);
for(int i = 1;i <= q;++ i) {
int v = read(),x = read(),k = read();
int p = v;
v = get(v,x);
if(R[v] - L[v] + 1 < k) puts("-1");
else print(b[t.query(rt[L[v] - 1],rt[R[v]],1,len,k)]),pc('\n');
}
return 0;
}
/* */

bzoj3545: [ONTAK2010]Peaks 重构树 主席树的更多相关文章

  1. luoguP4197:Peaks(Kruskal重构树+主席树)或者(点分树+离线)

    题意:有N座山,M条道路.山有山高,路有困难值(即点权和边权).现在Q次询问,每次给出(v,p),让求从v出发,只能结果边权<=p的边,问能够到达的山中,第K高的高度(从大到小排序). 思路:显 ...

  2. BZOJ3545&3551[ONTAK2010]Peaks——kruskal重构树+主席树+dfs序+树上倍增

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

  3. 【BZOJ3551】【BZOJ3545】 【ONTAK2010】 Peaks (kruskal重构树+主席树)

    Description ​ 在\(Bytemountains\)有\(~n~\)座山峰,每座山峰有他的高度\(~h_i~\). 有些山峰之间有双向道路相连,共\(~m~\)条路径,每条路径有一个困难值 ...

  4. 【BZOJ-3545&3551】Peaks&加强版 Kruskal重构树 + 主席树 + DFS序 + 倍增

    3545: [ONTAK2010]Peaks Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1202  Solved: 321[Submit][Sta ...

  5. [BZOJ3551][ONTAK2010]Peaks(加强版)(Kruskal重构树,主席树)

    3551: [ONTAK2010]Peaks加强版 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2438  Solved: 763[Submit][ ...

  6. 【BZOJ3545】Peaks(Kruskal重构树 主席树)

    题目链接 大意 给出有\(N\)个点\(M\)条边的一张图,其中每个点都有一个High值,每条边都有一个Hard值. 再给出\(Q\)个询问:\(v\) \(x\) \(k\) 每次询问查询从点\(v ...

  7. BZOJ.3551.[ONTAK2010]Peaks加强版(Kruskal重构树 主席树)

    题目链接 \(Description\) 有n个座山,其高度为hi.有m条带权双向边连接某些山.多次询问,每次询问从v出发 只经过边权<=x的边 所能到达的山中,第K高的是多少. 强制在线. \ ...

  8. luogu4197 Peaks (kruskal重构树+主席树)

    按照边权排序建出kruskal重构树,每次就变成了先找一个权值<=x的最远的祖先,然后看这个子树的第k小.离散化一下,在dfs序上做主席树即可 而且只需要建叶节点的主席树 注意输出的是第k小点的 ...

  9. 洛谷P4197 Peaks&&克鲁斯卡尔重构树学习笔记(克鲁斯卡尔重构树+主席树)

    传送门 据说离线做法是主席树上树+启发式合并(然而我并不会) 据说bzoj上有强制在线版本只能用克鲁斯卡尔重构树,那就好好讲一下好了 这里先感谢LadyLex大佬的博客->这里 克鲁斯卡尔重构树 ...

随机推荐

  1. 使用Groovy的sql模块操作mysql进行多种查询

    连接数据库,这里要创建一个sql实例来操作数据库,必须加载jdbc驱动包,使用两个注解,否则会报错: import groovy.sql.Sql url='jdbc:mysql://localhost ...

  2. jvm系列二、JVM内存结构

    原文链接:http://www.cnblogs.com/ityouknow/p/5610232.html 所有的Java开发人员可能会遇到这样的困惑?我该为堆内存设置多大空间呢?OutOfMemory ...

  3. saltstack文件模块的replace操作简化

    代码已经过测试 import re import mmap import os import shutil old_text='test' new_text='text' path=r'C:\User ...

  4. WPF 未能加载文件或程序集“CefSharp.Core.dll”或它的某一个依赖项

    1.检查代码不存在问题,最后找到问题,Nut管理包没有安装CefSharp.wpf. 2.安装对应的版本即可.

  5. Windows 10 的一些快捷键

    Win键 + Q: 呼出[Cortana] Win键 + W:呼出[Windows INNK 工作区] Win键 + E: 呼出[资源管理器] Win键 + R: 呼出[运行] Win键 + A: 呼 ...

  6. maven 跳过test

    -DskipTests,不执行测试用例,但编译测试用例类生成相应的class文件至target/test-classes下. -Dmaven.test.skip=true,不执行测试用例,也不编译测试 ...

  7. jQuery .on() and .off() 命名空间

    jQuery .on() and .off() 命名空间 博客分类: 生活 前端开发   jQuery1.7开始,jQuery引入了全新的事件绑定机制,jQuery .on() 和 off() 两个函 ...

  8. LeetCode(2):Add Two Numbers 两数相加

    Medium! 题目描述: 给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头 ...

  9. 关系操作符 == != equals()

    ==  和!= //: object/test.java package object; import java.util.*; public class Test{ public static vo ...

  10. 微信h5支付源码DEMO参考

    类库代码 wechatH5Pay.php <?php //use Flight; /** * 微信支付服务器端下单 * 微信APP支付文档地址: https://pay.weixin.qq.co ...