强制在线

kruskal重构树,每两点间的最大边权即为其lca的点权。

倍增找,dfs序对应区间搞主席树

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#define N 100005
#define M 500005
using namespace std; int l[2*N],r[2*N],cnt,num_cnt,val[2*N],num[2*N],ans;
int sum[25*N],lon[25*N],ron[25*N];
int be[2*N],fa[2*N][21],dis[2*N][21],n,m,q,sz,oo,root[2*N];
int e=1,head[2*N];
bool vis[2*N];
struct edge{
int u,v,w,next;
}ed[M],a[M];
bool cmp1(edge a,edge b){return a.w<b.w;} void add(int u,int v,int w){
ed[e].u=u; ed[e].v=v; ed[e].w=w;
ed[e].next=head[u]; head[u]=e++;
}
int find(int x){
if(x==be[x])return x;
be[x]=find(be[x]);
return be[x];
}
void Kruskal(){
sort(a+1,a+m+1,cmp1);
for(int i=1;i<=m;++i){
int u=a[i].u,v=a[i].v;
u=find(u); v=find(v);
if(u!=v){
be[u]=be[v]=++n;
fa[u][0]=fa[v][0]=n;
dis[u][0]=dis[v][0]=a[i].w;
add(n,u,a[i].w); add(n,v,a[i].w);
}
}
}
void insert(int p,int &rt,int l,int r,int x){
rt=++sz;
sum[rt]=sum[p]+1;
if(l==r) return;
lon[rt]=lon[p]; ron[rt]=ron[p];
int mid=(l+r)>>1;
if(x<=mid) insert(lon[p],lon[rt],l,mid,x);
else insert(ron[p],ron[rt],mid+1,r,x);
}
void dfs(int x){
for(int i=1;i<=20;i++){
fa[x][i]=fa[fa[x][i-1]][i-1];
dis[x][i]=max(dis[x][i-1],dis[fa[x][i-1]][i-1]);
}
l[x]=++cnt;
if(x<=oo) insert(root[cnt-1],root[cnt],1,num_cnt,val[x]);
else root[cnt]=root[cnt-1];
for(int i=head[x];i;i=ed[i].next)
dfs(ed[i].v);
r[x]=cnt;
}
int query(int L,int R,int k){
L=root[L]; R=root[R];
if(k>sum[R]-sum[L]) return -1;
int x=1,y=num_cnt;
while(x<y){
int mid=(x+y)>>1;
int tmp=sum[ron[R]]-sum[ron[L]];
if(tmp>=k){x=mid+1;L=ron[L];R=ron[R];}
else{k-=tmp;y=mid;L=lon[L];R=lon[R];}
}
return num[x];
}
void print(int x,int l,int r){
if(!x) return;
printf("x==%d l==%d r==%d sum==%d\n",x,l,r,sum[x]);
int mid=(l+r)>>1;
print(lon[x],l,mid);
print(ron[x],mid+1,r);
}
int main()
{
//freopen("3545.in","r",stdin);
//freopen("3545.out","w",stdout);
int u,v,w,x,k;
scanf("%d%d%d",&n,&m,&q); oo=n;
for(int i=1;i<=n;i++){
scanf("%d",&val[i]);
num[i]=val[i];
}
sort(num+1,num+n+1);
num_cnt=unique(num+1,num+n+1)-num-1;
for(int i=1;i<=n;i++)
val[i]=lower_bound(num+1,num+num_cnt+1,val[i])-num;
for(int i=1;i<=m;i++)
scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].w);
for(int i=1;i<=2*n;++i)be[i]=i;
Kruskal();
memset(vis,0,sizeof vis);
for(int i=n;i>=1;--i)if(!l[i])dfs(i);
while(q--){
scanf("%d%d%d",&v,&x,&k);
if(ans!=-1){v^=ans;x^=ans;k^=ans;}
for(int i=20;~i;i--)
if(dis[v][i]<=x&&fa[v][i])
v=fa[v][i];
ans=query(l[v]-1,r[v],k);
printf("%d\n",ans);
}
return 0;
}

bzoj 3551 kruskal重构树dfs序上的主席树的更多相关文章

  1. BZOJ 3551: [ONTAK2010]Peaks加强版 [Kruskal重构树 dfs序 主席树]

    3551: [ONTAK2010]Peaks加强版 题意:带权图,多组询问与一个点通过边权\(\le lim\)的边连通的点中点权k大值,强制在线 PoPoQQQ大爷题解传送门 说一下感受: 容易发现 ...

  2. BZOJ 3551: [ONTAK2010]Peaks加强版 Kruskal重构树+dfs序+主席树+倍增

    建出来 $Kruskal$ 重构树. 将询问点向上跳到深度最小,且合法的节点上. 那么,得益于重构树优美的性质,这个最终跳到的点为根的所有子节点都可以与询问点互达. 对于子树中求点权第 $k$ 大的问 ...

  3. BZOJ3551 ONTAK2010Peaks加强版(kruskal重构树+dfs序+主席树)

    kruskal重构树本质就是给并查集显式建树来替代可持久化并查集.将边按困难度从小到大排序后建出该树,按dfs序建主席树即可.查询时跳到深度最浅的满足在该重要度下已被合并的点,在子树内查询第k大. # ...

  4. BZOJ 3551/3545: [ONTAK2010]Peaks加强版 (Kruskal树+dfs序上的主席树+倍增)

    Orz PoPoQQQ 学到了维护子树信息的时候用dfsdfsdfs序套主席树节省线段树空间. 学到了怎么用指针写可持久化线段树-emmm- CODE 只贴上3551加强版带强制在线的代码 #incl ...

  5. 【BZOJ-1146】网络管理Network DFS序 + 带修主席树

    1146: [CTSC2008]网络管理Network Time Limit: 50 Sec  Memory Limit: 162 MBSubmit: 3495  Solved: 1032[Submi ...

  6. BZOJ4771 七彩树(dfs序+树上差分+主席树)

    考虑没有深度限制怎么做.显然的做法是直接转成dfs序上主席树,但如果拓展到二维变成矩形数颜色数肯定没法做到一个log. 另一种做法是利用树上差分.对于同种颜色的点,在每个点处+1,dfs序相邻点的lc ...

  7. BZOJ_3545_[ONTAK2010]Peaks_主席树+倍增+kruscal重构树+dfs序

    BZOJ_3545_[ONTAK2010]Peaks_主席树+倍增+kruscal重构树 Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道 ...

  8. [luogu P4197] Peaks 解题报告(在线:kruskal重构树+主席树 离线:主席树+线段树合并)

    题目链接: https://www.luogu.org/problemnew/show/P4197 题目: 在Bytemountains有N座山峰,每座山峰有他的高度$h_i$.有些山峰之间有双向道路 ...

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

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

随机推荐

  1. 自动布局Autoresizing与Autolayout

    一.关于iPhone屏幕的一些基本常识 1.ios屏幕适配的尺寸 iPhone的尺寸3.5inch.4.0inch.4.7inch.5.5inch iPad的尺寸7.9inch.9.7inch 2.点 ...

  2. node_acl 路径通配

    最近做一个基于nodejs的权限管理,查阅了一两天,发现大致是这样的: passportjs node-oauth rbac node_acl express_acl connect-roles 需求 ...

  3. Python 3 中的json模块使用

    1. 概述 JSON (JavaScript Object Notation)是一种使用广泛的轻量数据格式. Python标准库中的json模块提供了JSON数据的处理功能. Python中一种非常常 ...

  4. javascript数组特性

    数组是一段线性分配的内存, 它通过整数计算偏移并访问其中的元素. 数组是一种性能出色的数据结构. 1.数组字面量 数组字面量提供了一种非常方便地创建新数组的表示法. 多个用逗号分隔的值的表达式. 数组 ...

  5. Eclipse如何提高开发效率

    Ctrl+Shift+J 反向增量查找(和上条相同,只不过是从后往前查) Ctrl+Shift+F4 关闭所有打开的Editer Ctrl+Shift+X 把当前选中的文本全部变为小写 Ctrl+Sh ...

  6. Python并发编程-RabbitMQ消息队列

    RabbitMQ队列 RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Queue, 消息队列 ...

  7. 如何在不使用三大地图的KEY和相关组件的情况下,直接传参数到相关的H5地图

    以高德地图为例: window.location.href='http://m.amap.com/navigation/index/daddr=104.188206%2C30.858513%2C'+' ...

  8. svn path already exists的解决办法

    这种问题的一般原因是这个path所指的目录在服务器端是一个空目录,对客户端不可见,客户端如果新建了这个目录,而且向服务器端commit的时候就会报错,服务器端此目录已存在,这个时候就会存在一个问题:就 ...

  9. View requires API level 14 (current min is 8): <GridLayout>

    在学习android的过程中,出现这个错误的是否,可以build clean解决

  10. SVD的概念以及应用

    第十四章 利用SVD简化数据 一.引言 SVD的全称是奇异值分解,SVD的作用是它能够将高维的数据空间映射到低维的数据空间,实现数据约减和去除噪声的功能. SVD的特点主要有以下几个方面: 1.它的优 ...