2018.09.30 bzoj3551:Peaks加强版(dfs序+主席树+倍增+kruskal重构树)
传送门
一道考察比较全面的题。
这道题又用到了熟悉的kruskal+倍增来查找询问区间的方法。
查到询问的子树之后就可以用dfs序+主席树统计答案了。
代码:
#include<bits/stdc++.h>
#define N 200005
#define M 500005
using namespace std;
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
inline void write(int x){
if(x>9)write(x/10);
putchar((x%10)^48);
}
int n,m,Q,h[N],val[N],fa[N],cnt=0,first[N],rt[N*3],num,son[N*25][2],siz[N*25],sz=0,st[N][20],w[N],mx[N][20],dep[N],q[N*3],bg[N],ed[N],top=0,lastans;
bool vis[N];
struct node{int u,v,w;}tt[M];
struct edge{int v,next;}e[N];
inline int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
inline int cmp(node a,node b){return a.w<b.w;}
inline void add(int u,int v){e[++cnt].v=v,e[cnt].next=first[u],first[u]=cnt;}
inline void update(int&p,int las,int l,int r,int v){
p=++sz,siz[p]=siz[las]+1;
if(l==r)return;
son[p][0]=son[las][0],son[p][1]=son[las][1];
int mid=l+r>>1;
if(v<=mid)update(son[p][0],son[las][0],l,mid,v);
else update(son[p][1],son[las][1],mid+1,r,v);
}
inline int query(int a,int b,int l,int r,int k){
if(l==r)return l;
int mid=l+r>>1;
if(siz[son[b][0]]-siz[son[a][0]]>=k)return query(son[a][0],son[b][0],l,mid,k);
return query(son[a][1],son[b][1],mid+1,r,k-siz[son[b][0]]+siz[son[a][0]]);
}
inline int Find(int x,int v){
for(int i=17;~i;--i)if(dep[x]>=(1<<i)&&mx[x][i]<=v)x=st[x][i];
return x;
}
inline void dfs(int p){
q[++top]=p,vis[p]=1;
for(int i=1;(1<<i)<=dep[p];++i)st[p][i]=st[st[p][i-1]][i-1],mx[p][i]=max(mx[p][i-1],mx[st[p][i-1]][i-1]);
for(int i=first[p];i;i=e[i].next){
int v=e[i].v;
dep[v]=dep[p]+1,mx[v][0]=w[p],st[v][0]=p,dfs(v);
}
if(p>n)q[++top]=p;
}
inline void kruskal(){
sort(tt+1,tt+m+1,cmp);
for(int i=1;i<=n*2;++i)fa[i]=i;
for(int i=1;i<=m;++i){
int fx=find(tt[i].u),fy=find(tt[i].v);
if(fx!=fy)fa[fx]=fa[fy]=++num,w[num]=tt[i].w,add(num,fx),add(num,fy);
if(num==n*2-1)break;
}
for(int i=1;i<=n;++i)if(!vis[i])dfs(find(i));
for(int i=1;i<=top;++i){
int tmp=q[i];
if(tmp<=n)update(rt[i],rt[i-1],1,n,h[tmp]);
else{
rt[i]=rt[i-1];
if(!bg[tmp])bg[tmp]=i;
else ed[tmp]=i;
}
}
}
int main(){
n=read(),m=read(),Q=read(),lastans=-1,num=n;
for(int i=1;i<=n;++i)val[i]=h[i]=read();
sort(val+1,val+n+1);
for(int i=1;i<=n;++i)h[i]=lower_bound(val+1,val+n+1,h[i])-val;
for(int i=1;i<=m;++i)tt[i].u=read(),tt[i].v=read(),tt[i].w=read();
kruskal();
while(Q--){
int v=read(),x=read(),k=read();
if(~lastans)v^=lastans,x^=lastans,k^=lastans;
int Rt=Find(v,x),ql=rt[bg[Rt]],qr=rt[ed[Rt]];
if(siz[qr]-siz[ql]<k)puts("-1"),lastans=-1;
else lastans=val[query(ql,qr,1,n,siz[qr]-siz[ql]-k+1)],printf("%d\n",lastans);
}
return 0;
}
2018.09.30 bzoj3551:Peaks加强版(dfs序+主席树+倍增+kruskal重构树)的更多相关文章
- BZOJ_3545_[ONTAK2010]Peaks_主席树+倍增+kruscal重构树+dfs序
BZOJ_3545_[ONTAK2010]Peaks_主席树+倍增+kruscal重构树 Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道 ...
- BZOJ 3551: [ONTAK2010]Peaks加强版 Kruskal重构树+dfs序+主席树+倍增
建出来 $Kruskal$ 重构树. 将询问点向上跳到深度最小,且合法的节点上. 那么,得益于重构树优美的性质,这个最终跳到的点为根的所有子节点都可以与询问点互达. 对于子树中求点权第 $k$ 大的问 ...
- 2018.09.30 bzoj2223: [Coci 2009]PATULJCI(主席树)
传送门 主席树经典题目. 直接利用主席树差分的思想判断区间中数的个数是否合法然后决定左走右走就行了. 实际上跟bzoj3524是同一道题. 代码: #include<bits/stdc++.h& ...
- 【bzoj3545/bzoj3551】[ONTAK2010]Peaks/加强版 Kruskal+树上倍增+Dfs序+主席树
bzoj3545 题目描述 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询 ...
- dfs序+主席树 或者 树链剖分+主席树(没写) 或者 线段树套线段树 或者 线段树套splay 或者 线段树套树状数组 bzoj 4448
4448: [Scoi2015]情报传递 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 588 Solved: 308[Submit][Status ...
- 【bzoj1803】Spoj1487 Query on a tree III DFS序+主席树
题目描述 You are given a node-labeled rooted tree with n nodes. Define the query (x, k): Find the node w ...
- 【BZOJ3551】[ONTAK2010]Peaks加强版 最小生成树+DFS序+主席树
[BZOJ3545][ONTAK2010]Peaks Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困 ...
- BZOJ 3551: [ONTAK2010]Peaks加强版 [Kruskal重构树 dfs序 主席树]
3551: [ONTAK2010]Peaks加强版 题意:带权图,多组询问与一个点通过边权\(\le lim\)的边连通的点中点权k大值,强制在线 PoPoQQQ大爷题解传送门 说一下感受: 容易发现 ...
- BZOJ3551 ONTAK2010Peaks加强版(kruskal重构树+dfs序+主席树)
kruskal重构树本质就是给并查集显式建树来替代可持久化并查集.将边按困难度从小到大排序后建出该树,按dfs序建主席树即可.查询时跳到深度最浅的满足在该重要度下已被合并的点,在子树内查询第k大. # ...
随机推荐
- JAVA Spring JavaBean 引入 JavaBean ( 外部引用, 内部定义, 级联属性 )
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- as3 判断鼠标移动方向
import flash.events.MouseEvent; var odx:Number=mouseX; var ody:Number=mouseY; stage.addEventListener ...
- 18 subprocess模块(跟操作系统交互)
1.基本概念介绍 我们经常需要通过Python去执行一条系统命令或脚本,系统的shell命令是独立于你的python进程之外的, 每执行一条命令,就是发起一个新进程,通过python调用系统命令或脚本 ...
- js中函数传参的情况
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- "\\s+"的使用
详解 "\\s+" 正则表达式中\s匹配任何空白字符,包括空格.制表符.换页符等等, 等价于[ \f\n\r\t\v] \f -> 匹配一个换页 \n -> 匹配一个换 ...
- dp-最长公共子序列
最长公共子序列(NYOJ36) 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列.tip:最长公 ...
- zabbix3.2的server和zabbix-agent2.2怎么监控MySQL的办法
zabbix官方支持监控MySQL,但直接使用默认的模板是不可用的,还需要经过额外的设置才可以使用.如果只需要对mysql数据库做简单的监控,zabbix自带的模板完全能够满足要求:如果有更高的需求那 ...
- ubuntu部署jenkins
https://www.cnblogs.com/lozz/p/9962316.html 1.安装 wget -q -O - https://pkg.jenkins.io/debian/jenkins- ...
- CentOS 6.3安装配置supervisor进程管理工具
1. Supervisor是一个C/S系统,它可以在类unix操作系统让用户来监视和控制后台服务进程的数量,一个很重要的功能就是监控服务器的主要后台进程,并在出现问题是自动重启. 2. 根据服务器上的 ...
- 执行js,通过js显示隐藏的输入框,或者给input赋值
在测试过程中,有些输入框是隐藏的,如果直接对他进行赋值,会找不到这个输入框,从而导致脚本运行失败. 例如下面的这个密码输入框: 登录密码输入框分为两个input,下面的是提示的,上面的才是真正存下来的 ...