强制在线

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. List内存分配

    当采用默认构造函数List<int> value = new List<int>();实例化一个List<T>对象时,.Net Framework只是在内存中申请了 ...

  2. Bash里面如何返回绝对路径

    1.返回当前目录的绝对路径: basepath=$(cd `dirname $0`; pwd) echo $basepath 2.返回当前路径的上一级目录: xp_path=`dirname &quo ...

  3. 使用Cli构建Go的命令行应用

    转载出处:http://www.opscoder.info/cli.html   在Go里面应用中flag这一标准库,提供了很多我们在写命令行时需要的interface,然而如果你需要更强大更好的结构 ...

  4. Java开源生鲜电商平台-系统简介

    Java开源生鲜电商平台-系统简介 1.生鲜电商平台的价值与定位. 生鲜电商平台是一家致力于打造全国餐饮行业智能化.便利化.平台化与透明化服务的创新型移动互联网平台,连接买家与卖家之间的一个平台 看以 ...

  5. Linux 安装 MongoDB

    一.下载 Linux:CentOS 7.3 64位 MongoDB:3.6.4 安装目录:/usr/local cd /usr/local wget https://fastdl.mongodb.or ...

  6. RocketMQ源码 — 九、 RocketMQ延时消息

    上一节消息重试里面提到了重试的消息可以被延时消费,其实除此之外,用户发送的消息也可以指定延时时间(更准确的说是延时等级),然后在指定延时时间之后投递消息,然后被consumer消费.阿里云的ons还支 ...

  7. PHP_保留两位小数并且四舍五入(可用于精度计算)_保留两位小数并且不四舍五入

    小数例子: PHP保留两位小数并且四舍五入 1 $n=0.1265489; 2 echo sprintf("%.2f", $n); // 0.13 大家可以看到我们用到了sprin ...

  8. cocos2d-x_ Windows下Android环境搭建

    在Windows环境下编译cocos2d-x-3.0 Android-NDK编译:cocos2d-x(二) Mac 下搭建:http://www.cocoachina.com/bbs/read.php ...

  9. 高性能网络通信框架 HP-Socket

      HP-Socket 详细介绍 HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件.客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/UDP/ ...

  10. JavaScrip对象

    一.JavaScript对象概述 JavaScript 中的所有事物都是对象:字符串.数值.数组.函数...此外,JavaScript 允许自定义对象.JavaScript 提供多个内建对象,比如 S ...