「ONTAK2010」 Peaks加强版
题目链接
\(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加强版的更多相关文章
- 「BZOJ3545」「ONTAK2010」Peaks
「BZOJ3545」「ONTAK2010」Peaks 题目传送门 题目大意: 给定一个 \(n\) 个点,\(m\) 条边的带点权边权无向图,有 \(q\) 次询问,每次询问从 \(v\) 点出发,经 ...
- BZOJ 3551: [ONTAK2010]Peaks加强版 [Kruskal重构树 dfs序 主席树]
3551: [ONTAK2010]Peaks加强版 题意:带权图,多组询问与一个点通过边权\(\le lim\)的边连通的点中点权k大值,强制在线 PoPoQQQ大爷题解传送门 说一下感受: 容易发现 ...
- 【BZOJ3551】 [ONTAK2010]Peaks加强版
BZOJ3551 [ONTAK2010]Peaks加强版 Solution Kruscal重构树后发现可以对于小于的离散化然后倍增+主席树找到上一个的可行解. 然后就可以了. 如果数组开的不好,容易在 ...
- 【BZOJ3551】[ONTAK2010]Peaks加强版 最小生成树+DFS序+主席树
[BZOJ3545][ONTAK2010]Peaks Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困 ...
- 3551: [ONTAK2010]Peaks加强版
3551: [ONTAK2010]Peaks加强版 https://www.lydsy.com/JudgeOnline/problem.php?id=3551 分析: kruskal重构树 + 倍增 ...
- [BZOJ3551][ONTAK2010]Peaks(加强版)(Kruskal重构树,主席树)
3551: [ONTAK2010]Peaks加强版 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2438 Solved: 763[Submit][ ...
- [ONTAK2010] Peaks 加强版
[ONTAK2010] Peaks 加强版 题目大意:原题变为强制在线查询 Solution 读入山高,排序后依然建立树链,初始化并查集,初始化重构树新节点标号为\(n+1\) 读入边,按照边权从小到 ...
- bzoj3545/bzoj3551 [ONTAK2010]Peaks/Peaks加强版
bzoj3545/bzoj3551 [ONTAK2010]Peaks/Peaks加强版 传送门:bzoj bzoj wdnmd为什么加强版不是权限题原题却是啊 3545: [ONTAK2010]Pe ...
- 【BZOJ-3545&3551】Peaks&加强版 Kruskal重构树 + 主席树 + DFS序 + 倍增
3545: [ONTAK2010]Peaks Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1202 Solved: 321[Submit][Sta ...
随机推荐
- c#文件下载---以文件流形式
/// <summary> /// 文件下载 /// </summary> /// <param name="FileName">文件名< ...
- kmp(详解)
大佬博客:https://blog.csdn.net/lee18254290736/article/details/77278769 对于正常的字符串模式匹配,主串长度为m,子串为n,时间复杂度会到达 ...
- 在struts2.3.4.1中使用注解、反射、拦截器实现基于方法的权限控制
权限控制是每一个系统都应该有的一个功能,有些只需要简单控制一下就可以了,然而有些却需要进行更加深入和细致的权限控制,尤其是对于一些MIS类系统,基于方法的权限控制就更加重要了. 用反射和自定义注解来实 ...
- 排序总结---常用的排序算法总结,java和js实现
这篇博客对几种常见的排序算法进行归纳总结,在接下来的博客中会依次给出每个排序算法的例子 [由于博客上面进行编辑不太方便,图表都是在电脑上编辑好,上传的图片] 1.排序的分类 2.几种内部排序方法的比较 ...
- solr的客户端操作:使用solrj进行curd操作
导入相关的jar包 <dependency> <groupId>org.apache.solr</groupId> <artifactId>solr-s ...
- [codevs3981]动态最大子段和不带修改(线段树)
解题关键:最大子段和需要多个信息维护. 注意查询时的pushup. #include<cstdio> #include<cstring> #include<algorit ...
- iOS-Runtime字体适配
你还在为适配字体大小发愁? 看这里: #define MyUIScreen 375 //UI设计原型图的手机尺寸宽度(6), 6p的--414 @implementation UIFont (Run ...
- 为什么ajax发GET请求就成功,POST请求则报错?
为什么ajax发GET请求就成功,POST请求则报错? (1)首先说明的是请求的URL是一个静态资源,比如一个json文件.(2)现在现象是发GET请求就成功,POST请求则报错.(3)最新发现:就算 ...
- 基于Mybatis分页插件PageHelper
基于Mybatis分页插件PageHelper 1.分页插件使用 1.POM依赖 PageHelper的依赖如下.需要新的版本可以去maven上自行选择 <!-- PageHelper 插件分页 ...
- easyui页签更新
1.首先引入这个js文件 <script src="/Scripts/tabs.js" type="text/javascript"></sc ...