【BZOJ 3551】[ONTAK2010] Peaks加强版 Kruskal重构树+树上倍增+主席树
I.关于Kruskal重构树,我只能开门了,不过补充一下那玩意还是一棵满二叉树。(看一下内容之前请先进门坐一坐)
II.原来只是用树上倍增求Lca,但其实树上倍增是一种方法,Lca只是他的一种应用,他可以搞各种树上问题,树上倍增一般都会用到f数组。
|||.我们跑出来dfs序就能在他的上面进行主席树了。
IV.别忘了离散。
V.他可能不连通,我一开始想到了,但是我觉得出题人可能会是好(S)人(B),但是......
#include <cstdio>
#include <algorithm>
#define N 150000
#define M 550000
using namespace std;
inline int read()
{
register int sum=;
register char ch=getchar();
while(ch<''||ch>'')ch=getchar();
while(ch>=''&&ch<=''){
sum=(sum<<)+(sum<<)+ch-'';
ch=getchar();
}
return sum;
}
int n,m,Q;
struct E{
int x,y,z;
}e[M+];
int comp(const E a,const E b){
return a.z<b.z;
}
struct Via{
int to,next;
}c[M];
int head[M>>],t;
int h[N+],dfs[M>>],l[M>>],r[M>>],Time;
int len,Hash[N+];
struct Seg_Tree{
Seg_Tree *ch[];
int l,r,size;
}*root[M>>],*null;
int d[M>>][],f[M>>][],P[N+],fa[M>>];
int Comp(const int x,const int y){
return h[x]>h[y];
}
//*********************Define***********************
inline Seg_Tree *New(int l,int r){
register Seg_Tree *p=new Seg_Tree;
p->l=l,p->r=r,p->size=,p->ch[]=p->ch[]=null;
return p;
}
void ins(Seg_Tree *&p,Seg_Tree *last,int z,int y,int key)
{
p=New(z,y),p->size=last->size,p->size++;
if(p->l==p->r) return;
p->ch[]=last->ch[],p->ch[]=last->ch[];
if(key<=((z+y)>>))ins(p->ch[],last->ch[],z,((z+y)>>),key);
else ins(p->ch[],last->ch[],((z+y)>>)+,y,key);
}
int query(Seg_Tree *a,Seg_Tree *b,int k,int z,int y)
{
if(z==y)return z;
if(a->ch[]->size-b->ch[]->size>=k)return query(a->ch[],b->ch[],k,z,(z+y)>>);
else return query(a->ch[],b->ch[],k-(a->ch[]->size-b->ch[]->size),((z+y)>>)+,y);
}
//*********************Seg_Tree*********************
inline void add(int x,int y){
c[++t].to=y;
c[t].next=head[x];
head[x]=t;
}
inline int find(int x){
return x==fa[x]?x:(fa[x]=find(fa[x]));
}
inline int Max(int x,int y){
return x>y?x:y;
}
void Dfs(int x){
l[x]=++Time,dfs[Time]=x;
for(register int i=;i<;i++)f[x][i]=f[f[x][i-]][i-];
for(register int i=;i<;i++)d[x][i]=Max(d[x][i-],d[f[x][i-]][i-]);
for(register int i=head[x];i;i=c[i].next)Dfs(c[i].to);
r[x]=Time;
}
inline void Kruskal(){
sort(e+,e+m+,comp);
for(register int i=;i<=n+n;i++)fa[i]=i;
for(register int i=,had=;had<n-&&i<=m;i++)
if(find(e[i].x)!=find(e[i].y)){
register int X=find(e[i].x),Y=find(e[i].y);
had++,add(had+n,X),add(had+n,Y),d[X][]=d[Y][]=e[i].z;
f[X][]=f[Y][]=fa[X]=fa[Y]=had+n;
}
for(register int i=;i<=n;i++)
if(!l[find(i)])Dfs(find(i));
}
inline int get_root(int x,int lim)
{
for(register int i=;i>=;i--)
if(f[x][i]&&d[x][i]<=lim)
x=f[x][i];
return x;
}
//********************Kruskal************************
inline void HASH(){
sort(P+,P+n+,Comp);
for(register int i=;i<=n;i++)
if(i==||h[P[i]]!=h[P[i-]])
Hash[++len]=h[P[i]],h[P[i]]=len;
else h[P[i]]=len;
}
//********************Hash***************************
inline void Init(){
n=read(),m=read(),Q=read(),null=New(,),null->ch[]=null->ch[]=null,root[]=null;
for(register int i=;i<=n;i++)h[i]=read(),P[i]=i;HASH();
for(register int i=;i<=m;i++)e[i].x=read(),e[i].y=read(),e[i].z=read();Kruskal();
for(register int i=;i<=Time;i++)
if(dfs[i]<=n) root[i]=null,ins(root[i],root[i-],,len,h[dfs[i]]);
else root[i]=root[i-];
}
inline void Work(){
register int v,x,k,ans=;
while(Q--){
v=read(),x=read(),k=read();
register int Root=get_root(v,x);
if(root[r[Root]]->size-root[l[Root]-]->size<k){
puts("-1"),ans=;continue;
}
printf("%d\n",(ans=Hash[query(root[r[Root]],root[l[Root]-],k,,len)]));
}
}
int main(){
Init();
Work();
return ;
}
【BZOJ 3551】[ONTAK2010] Peaks加强版 Kruskal重构树+树上倍增+主席树的更多相关文章
- BZOJ 3551: [ONTAK2010]Peaks加强版 [Kruskal重构树 dfs序 主席树]
3551: [ONTAK2010]Peaks加强版 题意:带权图,多组询问与一个点通过边权\(\le lim\)的边连通的点中点权k大值,强制在线 PoPoQQQ大爷题解传送门 说一下感受: 容易发现 ...
- BZOJ 3551: [ONTAK2010]Peaks加强版 Kruskal重构树+dfs序+主席树+倍增
建出来 $Kruskal$ 重构树. 将询问点向上跳到深度最小,且合法的节点上. 那么,得益于重构树优美的性质,这个最终跳到的点为根的所有子节点都可以与询问点互达. 对于子树中求点权第 $k$ 大的问 ...
- BZOJ.3551.[ONTAK2010]Peaks加强版(Kruskal重构树 主席树)
题目链接 \(Description\) 有n个座山,其高度为hi.有m条带权双向边连接某些山.多次询问,每次询问从v出发 只经过边权<=x的边 所能到达的山中,第K高的是多少. 强制在线. \ ...
- 【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][ ...
- bzoj 3551 [ONTAK2010]Peaks加强版(kruskal,主席树,dfs序)
Description [题目描述]同3545 Input 第一行三个数N,M,Q. 第二行N个数,第i个数为h_i 接下来M行,每行3个数a b c,表示从a到b有一条困难值为c的双向路径. 接下来 ...
- BZOJ3551: [ONTAK2010]Peaks加强版【Kruskal重构树】【主席树】
重要的事情说三遍 不保证图联通 不保证图联通 不保证图联通 那些和我一样认为重构树是点数的童鞋是要GG Description [题目描述]同3545 Input 第一行三个数N,M,Q. 第二行N个 ...
- bzoj 3551: [ONTAK2010]Peaks加强版
Description [题目描述]同3545 Input 第一行三个数N,M,Q. 第二行N个数,第i个数为h_i 接下来M行,每行3个数a b c,表示从a到b有一条困难值为c的双向路径. 接下来 ...
- BZOJ3551 Peaks加强版 [Kruskal重构树,主席树]
BZOJ 思路 我觉得这题可持久化线段树合并也可以做 我觉得这题建出最小生成树之后动态点分治+线段树也可以做 还是学习一下Kruskal重构树吧-- Kruskal重构树,就是在做最小生成树的时候,如 ...
随机推荐
- 利用phpspreadsheet切割excel大文件
背景: 利用phpspreadsheet可以轻松的解析excel文件,但是phpspreadsheet的内存消耗也是比较大的,我试过解析将近5M的纯文字excel内存使用量就会超过php默认的最大内存 ...
- MVC4+EF 列表数据不能绑定
最新准备使用.net 的mvc+Ef来写个项目,开始一切顺利,到了数据绑定时出现了问题. 我的mvc视图引擎是Razor,后台提取数据的是Linq来处理,发现不管怎么样都不能绑定列表数据,可以将后台的 ...
- linux挂载命令mount及U盘、移动硬盘的挂载
一.mount的命令格式是(注意mount只能在root权限下运行) mount dervice dir dervice是要挂载的设备,dir是挂载点 二.查看当前磁盘列表的设备 fdisk -l 显 ...
- xss挑战赛小记 0x02(prompt(1))
0x0O 上次搜xss挑战赛的时候 还找到了一个看上去难度更高的挑战赛 今天做了一下 学到了很多新东西 这个挑战赛能够在页面成功prompt(1)就算过关了 挑战地址 http://prompt.ml ...
- P1103 书本整理
P1103 书本整理 题目描述 Frank是一个非常喜爱整洁的人.他有一大堆书和一个书架,想要把书放在书架上.书架可以放下所有的书,所以Frank首先将书按高度顺序排列在书架上.但是Frank发现,由 ...
- vs13发布web程序 iis上
一.配置iis 1,找到控制面板--程序--启用或关闭Windows功能 2,从列表中选择Internet Infomation Services,并且把相应的功能条目勾选上,如果不清楚,可以全部选中 ...
- Error loading MySQLdb module: libmysqlclient.so.18: cannot open shared object file: No such file or directory
在hue上配置Mysql的时候,出现的错误: 发生服务器错误: Error loading MySQLdb module: libmysqlclient.so.18: cannot open sha ...
- [HNOI2012]三角形覆盖问题
题面 二维平面中,给定 \(N\) 个等腰直角三角形(每个三角形的两条直角边分别平行于坐标轴,斜边从左上到右下).我们用三个非负整数 \((x, y, d)\) 来描述这样一个三角形,三角形三个顶点的 ...
- [Linux] 服务器镜像定时备份解决方案 crontab+rsync+flock
两台服务器定时同步文件解决方案: 环境: 主机:192.168.1.1 镜像机:192.168.1.2 需要将主机内容备份至镜像机(假设用户都为root) 备份内容为 /export 目录下所有内容至 ...
- docker基础-虚拟化与容器介绍
正如所有关心docker技术的人所知道的那样,docker是以容器虚拟化为技术为基础的软件,因此在学习docker具体的内容之前,有必要讨论一下虚拟化和容器技术. 虚拟化技术: 在了解虚拟化技术时,各 ...