「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 ...
随机推荐
- Mysql 中的伪列用法1
SELECT ( @rowNO := @rowNo + 1 ) AS rowno, A.*FROM ( SELECT * FROM t_user ) a, ( SELECT @rowNO := 0 ) ...
- loadView 和 viewDidLoad、viewDidunload 的区别
loadView 和 viewDidLoad 是 iPhone 开发中肯定要用到的两个方法. 他们都可以用来在视图载入的时候初始化一些内容. 但是他们有什么区别呢? viewDidLoad 方法只有当 ...
- C# 调用动态代码
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- VS2015 create a C++ console application based on WinRT
1. Enable /ZW 2. Disable /Gm 3. #using C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcpack ...
- eval 是执行一段完整的js字符串代码,并将结果返回
var strArray="[{"message1":{ "id": "-1","content": &quo ...
- weblogic如何部署web应用
weblogic如何部署web应用 程序员的基础教程:菜鸟程序员
- [C++] How to prevent memory leaks
How to prevent memory leaks ? overload new/delete
- 导入excel精华版
//须引入 NPOI, NPOI.OOXML, NPOI.Openxml4Net, NPOI.OpenxmlFormats等程序集 自己去下载吧 NPOI组件很好用不可能下不到自己去吧,通常去百度网盘 ...
- Java Persistence with MyBatis 3(中文版) 第五章 与Spring集成
MyBatis-Spring是MyBatis框架的子模块,用来提供与当前流行的依赖注入框架Spring的无缝集成. Spring框架是一个基于依赖注入(Dependency Injection)和面向 ...
- 常用工具类——DatetimeUtil
import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; imp ...