Description

【题目描述】同3545

Input

第一行三个数N,M,Q。
第二行N个数,第i个数为h_i
接下来M行,每行3个数a b c,表示从a到b有一条困难值为c的双向路径。
接下来Q行,每行三个数v x k,表示一组询问。v=v xor lastans,x=x xor lastans,k=k xor lastans。如果lastans=-1则不变。
 

Output

同3545

Sample Input

Sample Output

HINT

【数据范围】同3545

Source

Kruskal重构树,就是在合并的时候新建一个节点,点权为边权。。

有一些性质:

1.这是一棵二叉树。(没卵用)

2.原树点都是叶子结点。

3.子结点比父结点点权小(大根堆)。

4.原树与新树两点间路径最大值与新树相等,且等于新树两点lcalca点权。

所以只要从v点往上跳到深度最浅的<=x的点,然后查询子树第k大即可。。

然而死活RE,弃了弃了。。。

// MADE BY QT666
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<cstring>
#define RG register
using namespace std;
typedef long long ll;
const int N=400050;
int n,m,Q,sz,fa[N],rt[N],ls[N*20],rs[N*20],sum[N*20],hsh[N],Fa[N];
int id[N],dfn[N],ed[N],h[N],v[N],size[N],son[N],top[N];
struct data{
int a,b,c;
}e[500050];
bool cmp(const data &a,const data &b){return a.c<b.c;}
int head[N],to[N],nxt[N],cnt,tt,tot,res;
inline void lnk(int x,int y){
to[++cnt]=y,nxt[cnt]=head[x],head[x]=cnt;
}
inline int find(int x){
if(x!=fa[x]) fa[x]=find(fa[x]);
return fa[x];
}
inline void dfs1(int x,int f){
size[x]=1;
for(RG int i=head[x];i;i=nxt[i]){
int y=to[i];
if(y!=f){
Fa[y]=x;dfs1(y,x);size[x]+=size[y];
if(size[y]>size[son[x]]) son[x]=y;
}
}
}
inline void dfs2(int x,int ff){
dfn[x]=++tot;id[tot]=x;top[x]=ff;
if(son[x]) dfs2(son[x],ff);
for(RG int i=head[x];i;i=nxt[i]){
int y=to[i];
if(y!=Fa[x]&&y!=son[x]) dfs2(y,y);
}
ed[x]=tot;
}
inline void insert(RG int x,RG int &y,RG int l,RG int r,RG int u){
y=++sz;ls[y]=ls[x],rs[y]=rs[x];sum[y]=sum[x]+1;
if(l==r) return;
RG int mid=(l+r)>>1;
if(u<=mid) insert(ls[x],ls[y],l,mid,u);
else insert(rs[x],rs[y],mid+1,r,u);
}
inline int query(RG int x,RG int y,RG int l,RG int r,RG int k){
if(l==r) return l;
RG int mid=(l+r)>>1;
if(sum[ls[y]]-sum[ls[x]]>=k) return query(ls[x],ls[y],l,mid,k);
else return query(rs[x],rs[y],mid+1,r,k-(sum[ls[y]]-sum[ls[x]]));
}
inline int jump(RG int x,RG int lim){
RG int j=x;
while(x&&v[top[x]]<=lim){
j=top[x],x=Fa[top[x]];
}
if(v[x]>lim||v[top[x]]<=lim) return j;
RG int l=dfn[top[x]],r=dfn[x],ret=0;
while(l<=r){
RG int mid=(l+r)>>1;
if(v[id[mid]]<=lim) r=mid-1,ret=mid;
else l=mid+1;
}
return id[ret];
}
int main(){
freopen("Peaks.in","r",stdin);
freopen("Peaks.out","w",stdout);
scanf("%d%d%d",&n,&m,&Q);
for(RG int i=1;i<=n;i++) scanf("%d",&h[i]),hsh[++res]=h[i];
for(RG int i=1;i<=m;i++) scanf("%d%d%d",&e[i].a,&e[i].b,&e[i].c);
sort(e+1,e+1+m,cmp);for(int i=1;i<=n;i++) fa[i]=i;tt=n;
for(RG int i=1;i<=m;i++){
RG int x=find(e[i].a),y=find(e[i].b);
if(y!=x){
tt++;v[tt]=e[i].c;fa[x]=fa[y]=tt;fa[tt]=tt;
lnk(tt,x);lnk(tt,y);
}
}
for(RG int i=1;i<=tt;i++){
RG int g=find(i);
if(!dfn[g]) dfs1(g,g),dfs2(g,g);
}
sort(hsh+1,hsh+res+1);res=unique(hsh+1,hsh+1+res)-hsh-1;
for(RG int i=1;i<=tot;i++){
rt[i]=rt[i-1];
if(id[i]<=n) insert(rt[i],rt[i],1,res,lower_bound(hsh+1,hsh+1+res,h[id[i]])-hsh);
}
RG int lastans=0;
while(Q--){
RG int u,x,k;scanf("%d%d%d",&u,&x,&k);
u^=lastans,x^=lastans,k^=lastans;
RG int Lca=jump(u,x);
if(sum[rt[ed[Lca]]]-sum[rt[dfn[Lca]-1]]<k) puts("-1"),lastans=0;
else lastans=query(rt[dfn[Lca]-1],rt[ed[Lca]],1,res,(sum[rt[ed[Lca]]]-sum[rt[dfn[Lca]-1]])-k+1),printf("%d\n",hsh[lastans]);
}
return 0;
}

  

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

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

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

  2. bzoj 3551 [ONTAK2010]Peaks加强版(kruskal,主席树,dfs序)

    Description [题目描述]同3545 Input 第一行三个数N,M,Q. 第二行N个数,第i个数为h_i 接下来M行,每行3个数a b c,表示从a到b有一条困难值为c的双向路径. 接下来 ...

  3. BZOJ.3551.[ONTAK2010]Peaks加强版(Kruskal重构树 主席树)

    题目链接 \(Description\) 有n个座山,其高度为hi.有m条带权双向边连接某些山.多次询问,每次询问从v出发 只经过边权<=x的边 所能到达的山中,第K高的是多少. 强制在线. \ ...

  4. 【刷题】BZOJ 3551 [ONTAK2010]Peaks加强版

    Description [题目描述]同3545 Input 第一行三个数N,M,Q. 第二行N个数,第i个数为h_i 接下来M行,每行3个数a b c,表示从a到b有一条困难值为c的双向路径. 接下来 ...

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

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

  6. 3551: [ONTAK2010]Peaks加强版

    3551: [ONTAK2010]Peaks加强版 https://www.lydsy.com/JudgeOnline/problem.php?id=3551 分析: kruskal重构树 +  倍增 ...

  7. bzoj 3545&&3551: [ONTAK2010]Peaks &&加强版 平衡树&&并查集合并树&&主席树

    3545: [ONTAK2010]Peaks Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 635  Solved: 177[Submit][Stat ...

  8. ●BZOJ 3551 [ONTAK2010]Peaks(在线)

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3551 题解: 最小生成树 Kruskal,主席树,在线 这个做法挺巧妙的...以Kruska ...

  9. 【BZOJ-3545&3551】Peaks&加强版 Kruskal重构树 + 主席树 + DFS序 + 倍增

    3545: [ONTAK2010]Peaks Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1202  Solved: 321[Submit][Sta ...

随机推荐

  1. 十二、Hadoop学习笔记————Hive的基本原理

    一般用户用CLI(命令行界面)接口,元数据库含有表结构 单用户.多用户.远程服务 生成db文件,只能单客户端使用数据库 多用户是最常用的使用模式 配置与多用户一致 数据格式用户自定义 所有的表都存于改 ...

  2. Service 之间如何通信?- 每天5分钟玩转 Docker 容器技术(101)

    微服务架构的应用由若干 service 组成.比如有运行 httpd 的 web 前端,有提供缓存的 memcached,有存放数据的 mysql,每一层都是 swarm 的一个 service,每个 ...

  3. Imageloader框架

    package adapter;import android.content.Context;import android.graphics.Bitmap;import android.graphic ...

  4. 基于 HTML5 Canvas 的 3D 模型贴图问题

    之前注意到的一个例子,但是一直没有沉下心来看这个例子到底有什么优点,总觉得就是一个 list 列表,也不知道右边的 3d 场景放两个节点是要干嘛,今天突然想起来就仔细地看了一下这个例子的代码,实际操作 ...

  5. 实践作业2:黑盒测试实践——小组任务分工 Day 1

    今日教学实验任务分配后,课下小组例会完成任务分工,具体分工如下: (1)系统需求分析--刘思佳 (2)设计测试用例--王俊杰 (3)编写.运行测试脚本--郜昌磊 (4)记录测试过程--吴慧杰 (5)记 ...

  6. The authenticity of host 'github.com (192.30.253.113)' can't be established.

    在初始化git之后(git init),同时在github建立好仓库之后,本地也新增了ssh kye(ssh-keygen -t rsa -C 'mail address'),同时也在本地新增了远程仓 ...

  7. ElasticSearch 学习记录之集群分片内部原理

    分片内部原理 分片是如何工作的 为什么ES搜索是近实时性的 为什么CRUD 操作也是实时性 ES 是怎么保证更新被持久化时断电也不丢失数据 为什么删除文档不会立即释放空间 refresh, flush ...

  8. django同时查询两张表的数据,合并检索对象返回

    原始需求: 1.一篇文章内容分N个版块,每篇文章的版块数量不同. 2.有个文章搜索功能,需要同时搜索标题和内容. 实现思路: 1.由于每篇文章的内容版块数量不同,因此将每个文章的标题和内容分开存入2张 ...

  9. linux crontab yum安装

    crontab工具来做计划任务,定时任务,执行某个脚本等等 1.检查是否已安装crontab # crontab -bash: crontab: command not found 执行 cronta ...

  10. Ajax中的JSON格式与php传输过程的浅析

    在Ajax中的JSON格式与php传输过程中有哪些要注意的小地方呢? 先来看一下简单通用的JSON与php传输数据的代码 HTML文件: <input type="button&quo ...