强制在线
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序上的主席树的更多相关文章
-
BZOJ 3551: [ONTAK2010]Peaks加强版 [Kruskal重构树 dfs序 主席树]
3551: [ONTAK2010]Peaks加强版 题意:带权图,多组询问与一个点通过边权\(\le lim\)的边连通的点中点权k大值,强制在线 PoPoQQQ大爷题解传送门 说一下感受: 容易发现 ...
-
BZOJ 3551: [ONTAK2010]Peaks加强版 Kruskal重构树+dfs序+主席树+倍增
建出来 $Kruskal$ 重构树. 将询问点向上跳到深度最小,且合法的节点上. 那么,得益于重构树优美的性质,这个最终跳到的点为根的所有子节点都可以与询问点互达. 对于子树中求点权第 $k$ 大的问 ...
-
BZOJ3551 ONTAK2010Peaks加强版(kruskal重构树+dfs序+主席树)
kruskal重构树本质就是给并查集显式建树来替代可持久化并查集.将边按困难度从小到大排序后建出该树,按dfs序建主席树即可.查询时跳到深度最浅的满足在该重要度下已被合并的点,在子树内查询第k大. # ...
-
BZOJ 3551/3545: [ONTAK2010]Peaks加强版 (Kruskal树+dfs序上的主席树+倍增)
Orz PoPoQQQ 学到了维护子树信息的时候用dfsdfsdfs序套主席树节省线段树空间. 学到了怎么用指针写可持久化线段树-emmm- CODE 只贴上3551加强版带强制在线的代码 #incl ...
-
【BZOJ-1146】网络管理Network DFS序 + 带修主席树
1146: [CTSC2008]网络管理Network Time Limit: 50 Sec Memory Limit: 162 MBSubmit: 3495 Solved: 1032[Submi ...
-
BZOJ4771 七彩树(dfs序+树上差分+主席树)
考虑没有深度限制怎么做.显然的做法是直接转成dfs序上主席树,但如果拓展到二维变成矩形数颜色数肯定没法做到一个log. 另一种做法是利用树上差分.对于同种颜色的点,在每个点处+1,dfs序相邻点的lc ...
-
BZOJ_3545_[ONTAK2010]Peaks_主席树+倍增+kruscal重构树+dfs序
BZOJ_3545_[ONTAK2010]Peaks_主席树+倍增+kruscal重构树 Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道 ...
-
[luogu P4197] Peaks 解题报告(在线:kruskal重构树+主席树 离线:主席树+线段树合并)
题目链接: https://www.luogu.org/problemnew/show/P4197 题目: 在Bytemountains有N座山峰,每座山峰有他的高度$h_i$.有些山峰之间有双向道路 ...
-
luogu4197 Peaks (kruskal重构树+主席树)
按照边权排序建出kruskal重构树,每次就变成了先找一个权值<=x的最远的祖先,然后看这个子树的第k小.离散化一下,在dfs序上做主席树即可 而且只需要建叶节点的主席树 注意输出的是第k小点的 ...
随机推荐
-
java基础2_算术运算
一 算术运算符,包括+,-,*,/,%, 1. 如果在一个算术运算中有int,double,float那么最终运算的结果是double,那么也就是说参与运算的类型和得到的结果:结果一定是参与运算的精度 ...
-
html之大白
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
-
提高C#编程水平的50个要点
下面的文章转载于 提高C#编程水平的50个要点 1.总是用属性 (Property) 来代替可访问的数据成员 2.在 readonly 和 const 之间,优先使用 readonly 3.在 as ...
-
UVALive 6508 Permutation Graphs
Permutation Graphs Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit ...
-
Mac OS X 终端命令开启功能
1.系统目录下显示资源库2.Finder显示隐藏文件3.Xcode卸载4.在Finder标题栏显示完整路径5.去掉窗口截屏的阴影6.强制Safari在新标签中打开网页7.改变截屏图片的保存位置 1.系 ...
-
团队作业8——第二次项目冲刺(Beta阶段)5.20
1.当天站立式会议照片 会议内容: 本次会议为第二次会议 本次会议在陆大楼2楼召开,本次会议内容: ①:检查第一次任务完成情况 ②:做第二次任务的详细分工 ③:规定完成时间是在第三次任务之前 ④:遇到 ...
-
错误代码: 1054 Unknown column &#39;course&#39; in &#39;field list&#39;
1.错误描述 1 queries executed, 0 success, 1 errors, 0 warnings 查询:SELECT stu_name, course, score FROM t_ ...
-
vue Echarts 柱状图点击事件
drawBar(){ let that = this; let chart = this.$echarts.init(document.getElementById('bar-graph')); le ...
-
2.python中self详解(程序适用于python3版本)
先介绍下Python中的类和实例面向对象最重要的概念就是类(class)和实例(instance),类(class)是抽象的模板,比如学生这个抽象的事物,可以用一个Student类来表示.而实例是根据 ...
-
stm32架构初认识
刚接触stm32f373c8t6的芯片,这到底是怎末开发的,应该说它是SOC,内部有一个核心芯片,然后在芯片的外部添加了一些有特殊功能的外设,使开发者能够完成想要的功能,以stm32f373c 8t6 ...