题目链接

戳我

\(Solution\)

首先来介绍一下kruskal重构树:详见

知道kruskal重构树后这一道题就可以几乎没了.

利用kruskal重构树的性质,一个节点的左右儿子都比他小(其实就是一个堆),所以从点\(v\)开始只经过困难值小于等于\(x\)的路径实际上就是找到一个权值小于等于\(x\)的且深度最小的点

我们将这个点叫做\(K\).那么点\(v\)可以走的路径就是点\(K\)的子树.现在要求第k高的山峰,这直接用主席树+dfs序搞一搞就好了

\(Code\)

#include<bits/stdc++.h>
using namespace std;
const int N=200011;
int read(){
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9') f=(c=='-')?-1:1,c=getchar();
while(c>='0'&&c<='9') x=x*10+c-48,c=getchar();
return f*x;
}
struct node1 {
int to,next;
}e[500001];
struct node{
int x,y,v;
}b[500001];
struct node2 {
int l,r,v;
}a[N*20];
int root,tot,res,cnt,n,m,t,h[N],pre[N],head[N],T[N];
int fa[N][21],dep[N],bin[101],val[N],r[N],l[N],tail[N];
void add(int x,int y){ e[++cnt].to=y,e[cnt].next=head[x],head[x]=cnt; }
int find(int x){ return pre[x]==x?x:pre[x]=find(pre[x]); }
bool cmp(const node & a , const node & b ){ return a.v<b.v; }
int query(int x,int v){
for(int i=19;i>=0;i--)
if(dep[x]>=bin[i]&&val[fa[x][i]]<=v)
x=fa[x][i];
return x;
}
void dfs(int x){
if(x<=n)
h[++tot]=tail[x];
l[x]=tot;
for(int i=1;i<=16;i++)
if(dep[x]>=bin[i])
fa[x][i]=fa[fa[x][i-1]][i-1];
for(int i=head[x];i;i=e[i].next)
dep[e[i].to]=dep[x]+1,fa[e[i].to][0]=x,dfs(e[i].to);
r[x]=tot;
}
void build(){
res=n,sort(b+1,b+1+m,cmp);
for(int i=1;i<=m;i++){
int fx=find(b[i].x),fy=find(b[i].y);
if(fx!=fy)
val[++res]=b[i].v,pre[fx]=res,pre[fy]=res,add(res,fx),add(res,fy);
if(res==n*2-1)
break;
}
}
void insert(int &k,int l,int r,int v){
a[++root]=a[k],k=root,a[k].v++;
if(l==r) return ;
int mid=(l+r)>>1;
if(v<=mid)
insert(a[k].l,l,mid,v);
else insert(a[k].r,mid+1,r,v);
}
int answer(int x,int k,int l,int r,int v){
if(l==r) return l;
int mid=(l+r)>>1,pos=a[a[k].l].v-a[a[x].l].v;
if(v<=pos)
return answer(a[x].l,a[k].l,l,mid,v);
else return answer(a[x].r,a[k].r,mid+1,r,v-pos);
}
void solve(){
int last=-1;
while(t--){
int v=read(),x=read(),k=read();
if(last!=-1)
v^=last,x^=last,k^=last;
int now=query(v,x);
(r[now]-l[now]<k)?last=-1:last=tail[answer(T[l[now]],T[r[now]],1,n,r[now]-l[now]-k+1)];
printf("%d\n",last);
}
}
int main(){
n=read(),m=read(),t=read(),bin[0]=1;
for(int i=1;i<=n;i++)
tail[i]=read();
for(int i=1;i<n*2;i++)
pre[i]=i;
for(int i=1;i<=19;i++)
bin[i]=bin[i-1]<<1;
for(int i=1;i<=m;i++)
b[i].x=read(),b[i].y=read(),b[i].v=read();
build(),dfs(find(1));
sort(tail+1,tail+1+n);
int k=unique(tail+1,tail+1+n)-tail-1;
for(int i=1;i<=n;i++)
T[i]=T[i-1],insert(T[i],1,k,lower_bound(tail+1,tail+1+k,h[i])-tail);
n=k,solve();
}

「ONTAK2010」 Peaks加强版的更多相关文章

  1. 「BZOJ3545」「ONTAK2010」Peaks

    「BZOJ3545」「ONTAK2010」Peaks 题目传送门 题目大意: 给定一个 \(n\) 个点,\(m\) 条边的带点权边权无向图,有 \(q\) 次询问,每次询问从 \(v\) 点出发,经 ...

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

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

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

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

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

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

  5. 3551: [ONTAK2010]Peaks加强版

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

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

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

  7. [ONTAK2010] Peaks 加强版

    [ONTAK2010] Peaks 加强版 题目大意:原题变为强制在线查询 Solution 读入山高,排序后依然建立树链,初始化并查集,初始化重构树新节点标号为\(n+1\) 读入边,按照边权从小到 ...

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

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

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

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

随机推荐

  1. Git(五):Git分支管理策略

    转:http://www.ruanyifeng.com/blog/2012/07/git.html 如果你严肃对待编程,就必定会使用"版本管理系统"(Version Control ...

  2. linux下项目开发加载动态库:ldconfig与 /etc/ld.so.conf

    场景:自己开发一个项目,程序里包含一些自定义动态库.运行,需要加载这些动态库. 假如这些库在/pro/output/lib/下面,可执行程序在/pro/output/bin/下面. 那么,我们需要: ...

  3. 手工创建Oracle数据库

    数据库版本: SQL> select * from v$version; BANNER ----------------------------------------------------- ...

  4. ArcGIS中地图导出格式比较(转)

    转自:http://blog.sina.com.cn/s/blog_6438c8360101eqfx.html   有人问过这样的问题,用于出挂图的地图格式应该怎么选择?熟悉ArcGIS的用户都知道, ...

  5. vs2015发布网站至azure web应用服务

    进入www.azure.cn管理门户 1,左下角新建web应用,实例如下,url设置为demo(有防止重名判断) 2,进入demo配置页(左侧web应用下点击demo) 3,demo首页,下载配置文件 ...

  6. linux常用Java程序员使用命令(一)

    pwd 显示当前路径cd 切换目录 . .. ~ls 显示文件(夹) -l 显示详细信息 -a 显示全部,包括隐藏文件(夹) mkdir 创建文件夹 -p 递归创建 touch 创建空白文件 echo ...

  7. 从零开始学习前端JAVASCRIPT — 7、JavaScript基础EVENT

    1:事件驱动 1)事件:所谓事件就是js侦测到的用户的操作或是页面的一些行为(怎么发生的) 2)事件源对象:引发事件的元素.(发生在谁的身上) 3)事件处理程序:对事件处理的程序或是函数 (发生了什么 ...

  8. POJ 2546 Circular Area(两个圆相交的面积)

    题目链接 题意 : 给你两个圆的半径和圆心,让你求两个圆相交的面积大小. 思路 : 分三种情况讨论 假设半径小的圆为c1,半径大的圆为c2. c1的半径r1,圆心坐标(x1,y1).c2的半径r2,圆 ...

  9. 使用word文档直接发表博客 8 )

    目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...

  10. C#:几种数据库的大数据批量插入 - faib

    在之前只知道SqlServer支持数据批量插入,殊不知道Oracle.SQLite和MySql也是支持的,不过Oracle需要使用Orace.DataAccess驱动,今天就贴出几种数据库的批量插入解 ...