题目链接

戳我

\(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. JDBC中,如何动态的设置查询条件

    今天看JDBC,发现有段代码,可以减少重复的编写查询方法,如下: public List<Goddess> query(List<Map<String, Object>& ...

  2. Linux实战教学笔记33:lvs+keepalived集群架构服务

    一,LVS功能详解 1.1 LVS(Linux Virtual Server)介绍 LVS是Linux Virtual Server 的简写(也叫做IPVS),意即Linux虚拟服务器,是一个虚拟的服 ...

  3. Java-集合条件筛选

    import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.ArrayList; impor ...

  4. KVM下raw和qcow2格式磁盘文件IO测试

    1. Host OS 环境 CPU: Intel Xeon E5620 2.40GHz MEM: 16GB DISK: 500GB SATA OS: CentOS5.7 64bit 2. Guest ...

  5. C++ 重载操作符- 02 重载输入输出操作符

    重载输入输出操作符 本篇博客主要介绍两个操作符重载.一个是 <<(输出操作符).一个是 >> (输入操作符) 现在就使用实例来学习:如何重载输入和输出操作符. #include ...

  6. WebAPI如何返回json

    public HttpResponseMessage PostUser(User user) { JavaScriptSerializer serializer = new JavaScriptSer ...

  7. p4475 巧克力王国

    传送门 分析 我们多维护一个值,代表某个点子树中所有点的权值和 于是如果某个点它的min和max乘a(/b)的值小于范围则直接把整个子树都加进去 估价函数就是这个点的子树中的理论最小值 代码 #inc ...

  8. Python爬虫入门五之URLError异常处理

    大家好,本节在这里主要说的是URLError还有HTTPError,以及对它们的一些处理. 1.URLError 首先解释下URLError可能产生的原因: 网络无连接,即本机无法上网 连接不到特定的 ...

  9. 使用PPT演讲时,两个屏幕显示的内容不一样

    使用PPT演讲时,两个屏幕显示的内容不一样 摘自:http://blog.sina.com.cn/s/blog_75f3150b01018f3l.html 参考1:https://jingyan.ba ...

  10. python之CSV文件格式

    1.csv文件是以一些以逗号分隔的值 import csv filename = "wenjian.csv" with open(filename) as f: reader = ...