首先强制在线的话,肯定是不能再离线排序+平衡树启发式合并了。

这回要用的是线段树合并,每次把两棵线段树合并,总复杂度为$O(n\log n)$

预处理:

把边按权值从小到大排序,依次加边,

对于边(x,y),权值为z,如果x和y已经在一个联通块里就无视掉

假设x块大小小于等于y块大小

将x,y两块的线段树合并,设合并后线段树根为r,并在y所在块根节点处root表后面加入一个(r,z)

然后把x块内所有点的top表后面加入一个(top[y],z)

这里启发式合并的总复杂度也为$O(n\log n)$

查询从v出发走权值不超过x所到达的点中第k大:

先在v的top表里二分出最后面的权值不超过x的根节点r

再在r的root表里二分出最后面的权值不超过x的线段树根节点t

最后在t树中查询第k大

所以查询一次的复杂度为$O(\log n)$

所以总复杂度为$O((n+q)\log n)$

(吐槽:$O(n\log n)$的线段树合并不知道为什么比我之前$O(n\log^2n)$的平衡树启发式合并还要慢1S)

#include<cstdio>
#include<algorithm>
#define N 100010
#define M 3500000
#define T 1500000
using namespace std;
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
struct edge{int a,b,c;}e[500010];
inline bool cmp(edge a,edge b){return a.c<b.c;}
int n,m,q,i,j,et,x,y,k,last;
int h[N],b[N];
inline int lower(int x){
int l=1,r=n,mid,t;
while(l<=r)if(b[mid=(l+r)>>1]<x)l=mid+1;else r=(t=mid)-1;
return t;
}
int l[M],r[M],val[M],tot;
int merge(int x,int y,int a,int b){
if(!x)return y;
if(!y)return x;
int z=++tot;
if(a==b){
val[z]=val[x]+val[y];
return z;
}
int mid=(a+b)>>1;
l[z]=merge(l[x],l[y],a,mid);
r[z]=merge(r[x],r[y],mid+1,b);
val[z]=val[l[z]]+val[r[z]];
return z;
}
int build(int a,int b,int c){
int x=++tot;
val[x]=1;
if(a==b)return x;
int mid=(a+b)>>1;
if(c<=mid)l[x]=build(a,mid,c);else r[x]=build(mid+1,b,c);
return x;
}
int kth(int x,int k){
if(k>val[x])return 0;
int a=1,b=n,mid,t;
while(1){
if(a==b)return a;
mid=(a+b)>>1,t=val[r[x]];
if(k<=t)x=r[x],a=mid+1;else k-=t,x=l[x],b=mid;
}
}
int size[N],g[N],nxt[N<<1],v[N<<1],ed;
int top_st[N],top_en[N],top_nxt[T],top_v[T],top_w[T],top_list[T],top_bg[N],top_cnt[N],td;
int root_st[N],root_en[N],root_nxt[N<<1],root_v[N<<1],root_w[N<<1],root_list[N<<1],root_bg[N],root_cnt[N],rd;
inline void addedge(int x,int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}
inline void addtop(int x,int y,int z){top_v[++td]=y;top_w[td]=z;top_nxt[top_en[x]]=td;top_en[x]=td;}
inline void addroot(int x,int y,int z){root_v[++rd]=y;root_w[rd]=z;root_nxt[root_en[x]]=rd;root_en[x]=rd;}
void go(int x,int pre,int y,int t){
addtop(x,y,t);
for(int i=g[x];i;i=nxt[i])if(v[i]!=pre)go(v[i],x,y,t);
}
inline void link(int x,int y,int t){
if(top_v[top_en[x]]==top_v[top_en[y]])return;
if(size[top_v[top_en[x]]]>size[top_v[top_en[y]]])swap(x,y);
addroot(top_v[top_en[y]],merge(root_v[root_en[top_v[top_en[x]]]],root_v[root_en[top_v[top_en[y]]]],1,n),t);
size[top_v[top_en[y]]]+=size[top_v[top_en[x]]];
go(x,0,top_v[top_en[y]],t);
addedge(x,y);
addedge(y,x);
}
inline int gettop(int x,int y){
int l=top_bg[x],r=l+top_cnt[x]-1,mid,t;
while(l<=r)if(top_w[top_list[mid=(l+r)>>1]]<=y)t=top_v[top_list[mid]],l=mid+1;else r=mid-1;
return t;
}
inline int getroot(int x,int y){
int l=root_bg[x],r=l+root_cnt[x]-1,mid,t;
while(l<=r)if(root_w[root_list[mid=(l+r)>>1]]<=y)t=root_v[root_list[mid]],l=mid+1;else r=mid-1;
return t;
}
int main(){
read(n);read(m);read(q);
for(i=1;i<=n;i++)read(h[i]),b[i]=h[i];b[0]=-1;
sort(b+1,b+n+1);
for(i=1;i<=n;i++)root_v[i]=build(1,n,lower(h[i])),top_st[i]=top_en[i]=top_v[i]=root_st[i]=root_en[i]=i,top_w[i]=root_w[i]=-1,size[i]=1;
td=rd=n;
for(i=1;i<=m;i++)read(e[i].a),read(e[i].b),read(e[i].c);
sort(e+1,e+m+1,cmp);
for(i=1;i<=m;i++)link(e[i].a,e[i].b,e[i].c);
td=rd=0;
for(i=1;i<=n;i++){
for(top_bg[i]=td+1,j=top_st[i];j;j=top_nxt[j])++top_cnt[i],top_list[++td]=j;
for(root_bg[i]=rd+1,j=root_st[i];j;j=root_nxt[j])++root_cnt[i],root_list[++rd]=j;
}
while(q--){
read(x);read(y);read(k);
if(~last)x^=last,y^=last,k^=last;
printf("%d\n",last=b[kth(getroot(gettop(x,y),y),k)]);
}
return 0;
}

  

BZOJ3551 : [ONTAK2010]Peaks加强版的更多相关文章

  1. [BZOJ3551][ONTAK2010]Peaks(加强版)(Kruskal重构树,主席树)

    3551: [ONTAK2010]Peaks加强版 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2438  Solved: 763[Submit][ ...

  2. BZOJ3551 [ONTAK2010]Peaks加强版 kruskal 并查集 主席树 dfs序

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3551 题意概括 Description 在Bytemountains有N座山峰,每座山峰有他的高度 ...

  3. bzoj3545 [ONTAK2010]Peaks、bzoj3551 [ONTAK2010]Peaks加强版

    题目描述: bzoj3545,luogu bzoj3551 题解: 重构树+线段树合并. 可以算是板子了吧. 代码(非强制在线): #include<cstdio> #include< ...

  4. BZOJ3551: [ONTAK2010]Peaks加强版【Kruskal重构树】【主席树】

    重要的事情说三遍 不保证图联通 不保证图联通 不保证图联通 那些和我一样认为重构树是点数的童鞋是要GG Description [题目描述]同3545 Input 第一行三个数N,M,Q. 第二行N个 ...

  5. 【BZOJ3551】 [ONTAK2010]Peaks加强版

    BZOJ3551 [ONTAK2010]Peaks加强版 Solution Kruscal重构树后发现可以对于小于的离散化然后倍增+主席树找到上一个的可行解. 然后就可以了. 如果数组开的不好,容易在 ...

  6. 【BZOJ3551】[ONTAK2010]Peaks加强版 最小生成树+DFS序+主席树

    [BZOJ3545][ONTAK2010]Peaks Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困 ...

  7. bzoj3545/bzoj3551 [ONTAK2010]Peaks/Peaks加强版

    bzoj3545/bzoj3551 [ONTAK2010]Peaks/Peaks加强版 传送门:bzoj  bzoj wdnmd为什么加强版不是权限题原题却是啊 3545: [ONTAK2010]Pe ...

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

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

  9. 【BZOJ3551】Peaks加强版(Kruskal重构树,主席树)

    [BZOJ3551]Peaks加强版(Kruskal重构树,主席树) 题面 BZOJ Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相 ...

随机推荐

  1. Shell编程基础教程2--变量和运算符

    2.变量和运算符 2.1.变量的类型 本地变量:环境变量:变量替换(显示变量):位置变量:标准变量:特殊变量: 2.2.本地变量 本地变量在用户现在的shell生命周期的脚本中使用 在命令行, LOC ...

  2. 【转载】Pyqt 编写的俄罗斯方块

    #!/usr/bin/env python # -*- coding: utf-8 -*- from __future__ import print_function from __future__ ...

  3. python 之socket 网络编程

    socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. socket起源于Un ...

  4. Snowflake Snow Snowflakes(哈希表的应用)

    Snowflake Snow Snowflakes Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 27312   Accep ...

  5. 开个坑, 写个阿里云开放储存服务(OSS)的C++版SDK以及客户端

    这应该是继我研究手册QQ协议后的第2个稍微正式一点的网络程序, 不只是Scoket套接字编程, 还涉及到更多的HTTP协议知识! 阿里云开放储存服务OSS官方已经提供了不少SDK, 包括PHP/Pyt ...

  6. 【openGL】画圆

    #include "stdafx.h" #include <GL/glut.h> #include <stdlib.h> #include <math ...

  7. git 常用的简单命令

    git add . 会把当前目录中所有有改动的文件(不包括.gitignore中要忽略的文件)都添加到git缓冲区以待提交 git add * 会把当前目录中所有有改动的文件(包括.gitignore ...

  8. Freemarker使用入门

    一.概述: FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写 Template + data_model = output FreeMarker也是与Web容 ...

  9. Centos6.5里安装Erlang 并安装riak

    一.Erlang安装: 1 首先进入www.erlang.org 下载页面,下载otp_src_17.5.tar.gz. IT网,http://www.it.net.cn 2 解压缩:tar -xzv ...

  10. Java Hour 67 Java Collection API

    本文不是一个大而全的讲述Java Coleection 相关的APi, 而是笔者认为哪些是一个初学者所能够而且必须确切知道的知识点. Collection 一脉 这里有我们比较常用的List<E ...