bzoj 3551 [ONTAK2010]Peaks加强版(kruskal,主席树,dfs序)
Description
Input
Output
【思路】
Kruskal+主席树+dfs序
一个叫kruskal重构树的方法QWQ。在kruskal合并子树的时候新建一个ext结点,然后让它成为两棵子树公共的根,赋边权为权值。
新建成的树的性质:
对于一个询问,我们找到v的点权值不超过x的最小祖先,以该祖先为根的子树中所有的点与v都满足条件,然后就是在一个子树中找到第k大的问题,可以基于dfs序建主席树处理。
【代码】
#include<cstdlib>
#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define FOR(a,b,c) for(int a=(b);a<=(c);a++)
using namespace std; typedef long long ll;
const int N = ;
const int M = ;
const int D = ; struct Edge {
int u,v,w;
bool operator < (const Edge& rhs) const {
return w<rhs.w;
}
};
struct LEdge { int v,nxt;
};
struct Tnode{
int lc,rc,sum;
}T[M]; ll read() {
char c=getchar();
ll f=,x=;
while(!isdigit(c)) {
if(c=='-') f=-; c=getchar();
}
while(isdigit(c))
x=x*+c-'',c=getchar();
return x*f;
} int n,m,q,sz,tot,dfsc;
int hash[N],h[N],rt[N],val[N],bin[N];
int p[N],dep[N],fa[N][D],mx[N][D],L[N],R[N]; Edge es[N<<]; LEdge e[N<<];
int en=-,front[N];
void adde(int u,int v)
{
en++; e[en].v=v; e[en].nxt=front[u]; front[u]=en;
}
int ifind(int u)
{
return u==p[u]? u: p[u]=ifind(p[u]);
}
void update(int l,int r,int x,int& y,int num)
{
T[y=++sz]=T[x];
T[y].sum++;
if(l>=r) return ;
int mid=(l+r)>>;
if(num<=mid) update(l,mid,T[x].lc,T[y].lc,num);
else update(mid+,r,T[x].rc,T[y].rc,num);
}
int query(int l,int r,int a,int b,int rk)
{
int mid=(l+r)>>;
if(l>=r) return mid;
int now=T[T[b].rc].sum-T[T[a].rc].sum;
if(rk<=now) return query(mid+,r,T[a].rc,T[b].rc,rk);
else return query(l,mid,T[a].lc,T[b].lc,rk-now);
}
void dfs(int u)
{
L[u]=++dfsc;
update(,tot,rt[L[u]-],rt[L[u]],h[u]);
FOR(i,,D-) {
fa[u][i]=fa[fa[u][i-]][i-];
mx[u][i]=max(mx[u][i-],mx[fa[u][i-]][i-]);
}
for(int i=front[u];i>=;i=e[i].nxt) {
int v=e[i].v;
dep[v]=dep[u]+,
dfs(v);
}
R[u]=dfsc;
}
int find_root(int u,int x)
{
for(int i=D-;i>=;i--)
if(fa[u][i] && mx[u][i]<=x)
u=fa[u][i];
return u;
} int main()
{
//reopen("in.in","r",stdin);
//freopen("out.out","w",stdout); memset(front,-,sizeof(front));
n=read(),m=read(),q=read();
FOR(i,,n) h[i]=read(),hash[i]=h[i];
int u,v,w,x,k,ans=;
FOR(i,,m) {
u=read(),v=read(),w=read();
es[i]=(Edge){u,v,w};
} FOR(i,,*n) p[i]=i;
sort(hash+,hash+n+);
tot=unique(hash+,hash+n+)-hash-;
FOR(i,,n)
h[i]=lower_bound(hash+,hash+tot+,h[i])-hash; sort(es+,es+m+);
FOR(i,,m) {
Edge e=es[i];
int x=ifind(e.u),y=ifind(e.v);
if(x!=y) {
int ext=++n;
fa[x][]=fa[y][]=ext;
mx[x][]=mx[y][]=e.w;
p[x]=p[y]=ext;
adde(ext,x),adde(ext,y);
}
} dfs(n); FOR(i,,q) {
v=read(),x=read(),k=read();
v^=ans,x^=ans,k^=ans;
int root=find_root(v,x);
if(R[root]-L[root]+<k) puts("-1"),ans=;
else {
ans=query(,tot,rt[L[root]-],rt[R[root]],k);
if(!ans) puts("-1");
else printf("%d\n",ans=hash[ans]);
}
}
return ;
}
bzoj 3551 [ONTAK2010]Peaks加强版(kruskal,主席树,dfs序)的更多相关文章
- BZOJ 3551: [ONTAK2010]Peaks加强版 [Kruskal重构树 dfs序 主席树]
3551: [ONTAK2010]Peaks加强版 题意:带权图,多组询问与一个点通过边权\(\le lim\)的边连通的点中点权k大值,强制在线 PoPoQQQ大爷题解传送门 说一下感受: 容易发现 ...
- BZOJ 3551: [ONTAK2010]Peaks加强版 Kruskal重构树+dfs序+主席树+倍增
建出来 $Kruskal$ 重构树. 将询问点向上跳到深度最小,且合法的节点上. 那么,得益于重构树优美的性质,这个最终跳到的点为根的所有子节点都可以与询问点互达. 对于子树中求点权第 $k$ 大的问 ...
- 【bzoj3545/bzoj3551】[ONTAK2010]Peaks/加强版 Kruskal+树上倍增+Dfs序+主席树
bzoj3545 题目描述 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询 ...
- BZOJ.3551.[ONTAK2010]Peaks加强版(Kruskal重构树 主席树)
题目链接 \(Description\) 有n个座山,其高度为hi.有m条带权双向边连接某些山.多次询问,每次询问从v出发 只经过边权<=x的边 所能到达的山中,第K高的是多少. 强制在线. \ ...
- 【刷题】BZOJ 3551 [ONTAK2010]Peaks加强版
Description [题目描述]同3545 Input 第一行三个数N,M,Q. 第二行N个数,第i个数为h_i 接下来M行,每行3个数a b c,表示从a到b有一条困难值为c的双向路径. 接下来 ...
- bzoj 3551: [ONTAK2010]Peaks加强版
Description [题目描述]同3545 Input 第一行三个数N,M,Q. 第二行N个数,第i个数为h_i 接下来M行,每行3个数a b c,表示从a到b有一条困难值为c的双向路径. 接下来 ...
- 【BZOJ-3545&3551】Peaks&加强版 Kruskal重构树 + 主席树 + DFS序 + 倍增
3545: [ONTAK2010]Peaks Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1202 Solved: 321[Submit][Sta ...
- [BZOJ3551][ONTAK2010]Peaks(加强版)(Kruskal重构树,主席树)
3551: [ONTAK2010]Peaks加强版 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2438 Solved: 763[Submit][ ...
- 3551: [ONTAK2010]Peaks加强版
3551: [ONTAK2010]Peaks加强版 https://www.lydsy.com/JudgeOnline/problem.php?id=3551 分析: kruskal重构树 + 倍增 ...
随机推荐
- Scala的Pattern Matching Anonymous Functions
参考自http://stackoverflow.com/questions/19478244/how-does-a-case-anonymous-function-really-work-in-sca ...
- wordpress如何删除没有文章的tags标签
wordpress站点除了可以按博客category分类外,还可以在写文章的时候适当添加tags标签(当然,if you are lazy,哈哈,可以安装auto tag插件来实现),发布的posts ...
- 国外程序员整理的 C++ 资源大全
摘要:C++是在C语言的基础上开发的一种集面向对象编程.泛型编程和过程化编程于一体的编程语言.应用较为广泛,是一种静态数据类型检查的,支持多重编程的通用程序设计语言. 关于 C++ 框架.库和资源的一 ...
- 李洪强iOS开发本人集成环信的经验总结_07_监听好友请求
李洪强iOS开发本人集成环信的经验总结_07_监听好友请求 来到Appdalegate中: 遵守代理协议 设置代理 实现监听好友请求的回调的方法
- PHP的执行原理/执行流程
http://www.cnblogs.com/hongfei/archive/2012/06/12/2547119.html 更深入的学习和了解可以查看下面: 风雨的博客http://www.laru ...
- 首次接触Winform前端交互
首次接触到在winform中加入网页,且跟前端脚本交互.找了一下这方面的资料 此博文转载原地址为:http://www.cnblogs.com/Charles2008/archive/2009/08/ ...
- sizeof运算符来获取各种数据类型在内存中所占字节数--gyy整理
C++并没有规定各种数据类型在内存中的存储大小,依赖于不同的编译器的不同而不同,要想获知当前编译器对各种数据类型分配的大小,可以通过sizeof运算符来获取. 使用方法1: sizeof(数据类型) ...
- Android:requestWindowFeature应用程序窗体显示状态操作
注意requestWindowFeature必须在 setContentView()之前调用. 1.DEFAULT_FEATURES:系统默认状态,一般不需要指定 2.FEATURE_CONTEXT_ ...
- 关于 hot code replace fail 问题 .
频频出现Hot code replace failed问题.网上查不到解决方法,想来想去,是否是jvm的问题?我的jre使用自己下载的jdk1.6.07,而MyEclipse的jvm自带的是1.5.0 ...
- Android 启动过程总结
SystemServer的启动 frameworks/base/services/java/com/android/server/SystemServer.java: run() 其中调用Activi ...