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重构树 + 倍增 ...
随机推荐
- 汇编invoke和call的关系
win32汇编里面,我们既可以用invoke也可以用call调用子程序/函数,不过invoke使用简单方便,所以绝大多数情况我们都用invoke. 但是很多人只是知道使用它,对它却不是很了解.我以前对 ...
- uva 10051
将每一个分解为六个两面的 简单地dp 回溯输出路径..... #include <cstdio> #include <cstring> #include <cmath&g ...
- oracle-number(5,2)
insert into emp values(70000.123); 只能存储 整数的前3位, 小数点后面的2位
- secureCRT中文字符乱码
1.远程linux机器.修改环境变量LANG.例如在~/.bash_profile里面添加 export LANG=zh_CN.UTF8 2.本地windows机器.修改SecureCRT的设置.找到 ...
- Python性能鸡汤
http://pythoner.org/wiki/257/ 毫无疑问:Python程序没有编译型语言高效快速. 甚至Python拥护者们会告诉你Python不适合这些领域. 然而,YouTube已用P ...
- 可以继承的C++ Singleton基类
单例模式(Singleton Pattern)是设计模式中的一种,它用来保证系统中最多只能存在一个它的实例,其做法是由类自身来创建和持有它的对象实例,把对实例的创建权和管理权都控制在自己手中,以便控制 ...
- C++11 FAQ中文版--转
更新至英文版October 3, 2012 译者前言: 经过C++标准委员会的不懈努力,最新的ISO C++标准C++11,也即是原来的C++0x,已经正式发布了.让我们欢迎C++11! 今天获得St ...
- POJ3697+BFS+hash存边
/* 疾速优化+hash存边 题意:给定一个包含N(1 ≤ N ≤ 10,000)个顶点的无向完全图,图中的顶点从1到N依次标号.从这个图中去掉M(0 ≤ M ≤ 1,000,000)条边,求最后与顶 ...
- SQL四种语言:DDL,DML,DCL,TCL
1.DDL(Data Definition Language)数据库定义语言statements are used to define the database structure or schema ...
- 封装SqlHelper
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.C ...