Description

【题目描述】同3545

Input

第一行三个数N,M,Q。
第二行N个数,第i个数为h_i
接下来M行,每行3个数a b c,表示从a到b有一条困难值为c的双向路径。
接下来Q行,每行三个数v x k,表示一组询问。v=v xor lastans,x=x xor lastans,k=k xor lastans。如果lastans=-1则不变。
 

Output

同3545

【思路】

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序)的更多相关文章

  1. BZOJ 3551: [ONTAK2010]Peaks加强版 [Kruskal重构树 dfs序 主席树]

    3551: [ONTAK2010]Peaks加强版 题意:带权图,多组询问与一个点通过边权\(\le lim\)的边连通的点中点权k大值,强制在线 PoPoQQQ大爷题解传送门 说一下感受: 容易发现 ...

  2. BZOJ 3551: [ONTAK2010]Peaks加强版 Kruskal重构树+dfs序+主席树+倍增

    建出来 $Kruskal$ 重构树. 将询问点向上跳到深度最小,且合法的节点上. 那么,得益于重构树优美的性质,这个最终跳到的点为根的所有子节点都可以与询问点互达. 对于子树中求点权第 $k$ 大的问 ...

  3. 【bzoj3545/bzoj3551】[ONTAK2010]Peaks/加强版 Kruskal+树上倍增+Dfs序+主席树

    bzoj3545 题目描述 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询 ...

  4. BZOJ.3551.[ONTAK2010]Peaks加强版(Kruskal重构树 主席树)

    题目链接 \(Description\) 有n个座山,其高度为hi.有m条带权双向边连接某些山.多次询问,每次询问从v出发 只经过边权<=x的边 所能到达的山中,第K高的是多少. 强制在线. \ ...

  5. 【刷题】BZOJ 3551 [ONTAK2010]Peaks加强版

    Description [题目描述]同3545 Input 第一行三个数N,M,Q. 第二行N个数,第i个数为h_i 接下来M行,每行3个数a b c,表示从a到b有一条困难值为c的双向路径. 接下来 ...

  6. bzoj 3551: [ONTAK2010]Peaks加强版

    Description [题目描述]同3545 Input 第一行三个数N,M,Q. 第二行N个数,第i个数为h_i 接下来M行,每行3个数a b c,表示从a到b有一条困难值为c的双向路径. 接下来 ...

  7. 【BZOJ-3545&3551】Peaks&加强版 Kruskal重构树 + 主席树 + DFS序 + 倍增

    3545: [ONTAK2010]Peaks Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1202  Solved: 321[Submit][Sta ...

  8. [BZOJ3551][ONTAK2010]Peaks(加强版)(Kruskal重构树,主席树)

    3551: [ONTAK2010]Peaks加强版 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2438  Solved: 763[Submit][ ...

  9. 3551: [ONTAK2010]Peaks加强版

    3551: [ONTAK2010]Peaks加强版 https://www.lydsy.com/JudgeOnline/problem.php?id=3551 分析: kruskal重构树 +  倍增 ...

随机推荐

  1. datagridview 右键选中行 并弹出菜单

    private void dataGridView_OLUsers_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) { i ...

  2. Unity3d大会的部分总结

    原地址:http://blog.csdn.net/sgnyyy/article/details/23775219 一.项目开发,管理和发布策略 1.       四大准则 a.       美术的资源 ...

  3. 深入浅出 Java 8 Lambda 表达式

    摘要:此篇文章主要介绍 Java8 Lambda 表达式产生的背景和用法,以及 Lambda 表达式与匿名类的不同等.本文系 OneAPM 工程师编译整理. Java 是一流的面向对象语言,除了部分简 ...

  4. linux下mysql修改数据库账户root密码

    #先停止mysql,再运行下一句 $ mysqld_safe --user=mysql --skip-grant-tables --skip-networking & $ mysql -u r ...

  5. spring结合时,web.xml的配置

    <!-- 1. web.xml配置 <context-param> <param-name>webAppRootKey</param-name> <pa ...

  6. JVM内存状况查看方法和分析工具

    Java本身提供了多种丰富的方法和工具来帮助开发人员查看和分析GC及JVM内存的状况,同时开源界和商业界也有一些工具可用于查看.分析GC及JVM内存的状况.通过这些分析,可以排查程序中内存泄露的问题及 ...

  7. MAC OS Nginx php-fpm相关

    Nginx 命令 sudo nginx // 启动Nginx #重新加载|重启|停止|退出 sudo nginx -s reload|reopen|stop|quit #上传文件限制更改: 进入ngi ...

  8. 锋利的JQuery-认识Jquery

    今天开始学习菜鸟的JQuery,这本书在一前看过一遍了,但是由于虽然看了,但是将近一年在工作中基本上没有用上,很是悲催,菜鸟想,用一到两个星期时间把这本书看一遍吧.就像菜鸟前面的jsdom一样,菜鸟写 ...

  9. ADT中的代码补全设置

    设置自动补全代码 刚刚学Android,有很多变量和方法 都不熟悉.需要有提示,才更加方便. 快捷方式:Alt + /    可以出现代码提示. 默认的只有输入“ .” 以后才会有代码补全提示,可作如 ...

  10. 2013 ACM/ICPC Asia Regional Changsha Online - G(DP)

    第一眼就想到DP,然后想了N久就想不到可以不重算的DP  最后没办法了 先算出来 再去重.. 因为最多只有三个 对于三个来说有三种组合情况 x+y+z, x*y*z, x*y+z 那要么 x,y,z都 ...