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 重构树 主席树的更多相关文章
- luoguP4197:Peaks(Kruskal重构树+主席树)或者(点分树+离线)
题意:有N座山,M条道路.山有山高,路有困难值(即点权和边权).现在Q次询问,每次给出(v,p),让求从v出发,只能结果边权<=p的边,问能够到达的山中,第K高的高度(从大到小排序). 思路:显 ...
- BZOJ3545&3551[ONTAK2010]Peaks——kruskal重构树+主席树+dfs序+树上倍增
题目描述 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点v开始只 ...
- 【BZOJ3551】【BZOJ3545】 【ONTAK2010】 Peaks (kruskal重构树+主席树)
Description 在\(Bytemountains\)有\(~n~\)座山峰,每座山峰有他的高度\(~h_i~\). 有些山峰之间有双向道路相连,共\(~m~\)条路径,每条路径有一个困难值 ...
- 【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][ ...
- 【BZOJ3545】Peaks(Kruskal重构树 主席树)
题目链接 大意 给出有\(N\)个点\(M\)条边的一张图,其中每个点都有一个High值,每条边都有一个Hard值. 再给出\(Q\)个询问:\(v\) \(x\) \(k\) 每次询问查询从点\(v ...
- BZOJ.3551.[ONTAK2010]Peaks加强版(Kruskal重构树 主席树)
题目链接 \(Description\) 有n个座山,其高度为hi.有m条带权双向边连接某些山.多次询问,每次询问从v出发 只经过边权<=x的边 所能到达的山中,第K高的是多少. 强制在线. \ ...
- luogu4197 Peaks (kruskal重构树+主席树)
按照边权排序建出kruskal重构树,每次就变成了先找一个权值<=x的最远的祖先,然后看这个子树的第k小.离散化一下,在dfs序上做主席树即可 而且只需要建叶节点的主席树 注意输出的是第k小点的 ...
- 洛谷P4197 Peaks&&克鲁斯卡尔重构树学习笔记(克鲁斯卡尔重构树+主席树)
传送门 据说离线做法是主席树上树+启发式合并(然而我并不会) 据说bzoj上有强制在线版本只能用克鲁斯卡尔重构树,那就好好讲一下好了 这里先感谢LadyLex大佬的博客->这里 克鲁斯卡尔重构树 ...
随机推荐
- ppt 制作圆角三角形
制作圆角三角形: PART 01 :插入三角形与三个等大的圆形: PART 02 :利用[任意多边形]和[合并形状-剪除]获得缺三角: (先选中大三角形,然后再选中任意多边形,"格式&quo ...
- 【逆向工具】使用x64dbg+spy去除WinRAR5.40(64位)广告弹框
1 学习目标 WinRAR5.40(64位)的弹框广告去除,由于我的系统为x64版本,所以安装了WinRAR(x64)版本. OD无法调试64位的程序,可以让我熟悉x64dbg进行调试的界面. 其次是 ...
- Software development skills for data scientists
Software development skills for data scientists Data scientists often come from diverse backgrounds ...
- Pytorch 入门之Siamese网络
首次体验Pytorch,本文参考于:github and PyTorch 中文网人脸相似度对比 本文主要熟悉Pytorch大致流程,修改了读取数据部分.没有采用原作者的ImageFolder方法: ...
- ORB feature(O for orientation)
参考链接:http://blog.csdn.net/yang843061497/article/details/38553765 绪论 假如我有2张美女图片,我想确认这2张图片中美女是否是同一个人.这 ...
- __ATTR引发的编译错误【原创】
有一天我编译内核模块驱动的时候发现如下错误 Linux kernel版本:4.1.15 error: negative width in bit-field '<anonymous>' 代 ...
- 福利爬虫妹子图之获取种子url
import os import uuid from lxml import html import aiofiles import logging from ruia import Spider, ...
- root权限使用vim不能修改权限
1.背景: 有时候我们会发现使用root权限不能修改某个文件,大部分原因是曾经使用chattr将文件锁定了 2.chattr命令介绍: 用来改变文件属性,能防止root用户误删文件等作用 3.使用方法 ...
- 日常用的css基础和自己常用的js封装
css基础:base /* * 初始化 */ *::after, *::before { box-sizing: border-box; } body { font-family: 'Microsof ...
- elasticsearch5.0集群大数据量迁移方法及注意事项
当es集群的数据量较小的情况下elasticdump这个工具比较方便,但是当数据量达到一定级别比如上百G的时候,elasticdump速度就很慢了,此时我们可以使用快照的方法进行备份 elasticd ...