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大佬的博客->这里 克鲁斯卡尔重构树 ...
随机推荐
- windows系统中搭建Jenkins服务器
1 须知 100.126.36.232等Jenkins服务器是通过设置代理访问外网,管理Jenkins和插件升级站点的,本地安装受黄区网络限制需要特殊配置,且有些插件无法下载. 前提条件: ...
- centos6.5环境openldap实战之ldap配置详解及web管理工具lam(ldap-account-manager)使用详解
ldap常用名称解释 1.环境搭建 操作系统:centos6.5 x86_64 关闭防火墙.selinux 开启时间同步 # crontab -e 加入 # time sync */5 * * * * ...
- centos6.5下编译安装mariadb-10.0.20
源码编译安装mariadb-10.0.20.tar.gz 一.安装cmake编译工具 跨平台编译器 # yum install -y gcc* # yum install -y cmake 解决依赖关 ...
- Web Services基础学习(W3C)
1.Web services 使用 XML 来编解码数据,并使用 SOAP 来传输数据 2.基础的 Web Services 平台是 XML + HTTP. Web services 平台的元素: S ...
- spring事物的传播行为及隔离
关于@Transactional注解: 添加事务注解1.使用 propagation 指定事务的传播行为, 即当前的事务方法被另外一个事务方法调用时如何使用事务, 默认取值为 REQUIRED, 即使 ...
- 如何把JS对象转成数组
1. 前言 首先,当JS对象是键值对的情况时(Json对象),因为数组时以数字为索引的,所以只能把JS对象中的Key或者Value组成数组使用. 2. 样例如下: var obj={"one ...
- centos7忘记登录密码修改
很多时候我们都会忘记Linux root 用户的口令,下面就教大家如果忘记root口令怎么办 第1步:开机后在内核上按“e”.截图如下 按e以后会进入内核启动页面,如下图 第2步:在linux16这行 ...
- mockito简单教程
注:本文来源:sdyy321的<mockito简单教程> 官网: http://mockito.org API文档:http://docs.mockito.googlecode.com/h ...
- python for dl
算是python的简明教程吧,总结的不错: https://zhuanlan.zhihu.com/p/24162430 python for opencv: https://zhuanlan.zhih ...
- keras2.0的一些变化
keras 变化太快了https://github.com/fchollet/keras/wiki/Keras-2.0-release-notes