BZOJ 3551 Peaks加强版
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3551
题意:给出一个图,n个点,m条边。边有权值点也有权值。若干询问,(v,x,k),问从v点开始经过边权不大于x的所有边到达的所有点中权值第K大的权值。强制在线。
思路:首先不在最小生成树上的边没用。将边权按照升序排序,并查集每次合并两个集合(x,y)时,新增一个点u,u的权值为这条边的权值,连有向边<u,x><u,y>。那么最后的这棵树是一个二叉树,从下到上权值增大。那么每次倍增求出最上的点r,那么以r为根的子树包含的所有点就是通过不大于x的所有边到达的点。因此dfs序+主席树(按照键值大小),那么每次查询r管辖的区间即可。
const int N=200005; int n,h[N],b[N]; pair<int,pair<int,int> > E[N*3]; int m,Q; int S[N]; int M; int get(int x) { if(S[x]!=x) S[x]=get(S[x]); return S[x]; } vector<int> g[N]; int mp[N<<1],id; int visit[N]; int st[N],ed[N]; int f[N][20],Max[N][20]; int eLen[N]; void DFS(int u) { visit[u]=1; mp[++id]=u; int i; for(i=0;i<SZ(g[u]);i++) { int v=g[u][i]; f[v][0]=u; Max[v][0]=eLen[u]; DFS(v); } if(u>n) mp[++id]=u; } struct node { int lson,rson,sum; }; node a[N*25]; int e; int root[N<<1]; int build(int L,int R) { int t=++e; a[t].lson=a[t].rson=-1; a[t].sum=0; if(L==R) return t; int M=(L+R)>>1; a[t].lson=build(L,M); a[t].rson=build(M+1,R); return t; } void insert(int &t1,int t,int L,int R,int h) { t1=++e; a[t1]=a[t]; a[t1].sum++; if(L==R) return; int M=(L+R)>>1; if(h<=M) insert(a[t1].lson,a[t].lson,L,M,h); else insert(a[t1].rson,a[t].rson,M+1,R,h); } int get(int u,int x) { int i; for(i=19;i>=0;i--) if(f[u][i]&&Max[u][i]<=x) { u=f[u][i]; } return u; } int query(int rt1,int rt2,int L,int R,int k) { if(L==R) return L; int tmp=a[a[rt2].lson].sum-a[a[rt1].lson].sum; int M=(L+R)>>1; if(tmp>=k) return query(a[rt1].lson,a[rt2].lson,L,M,k); else return query(a[rt1].rson,a[rt2].rson,M+1,R,k-tmp); } int main() { n=getInt(); m=getInt(); Q=getInt(); int i; for(i=1;i<=n;i++) h[i]=b[i]=getInt(); sort(b+1,b+n+1); M=unique(b+1,b+n+1)-(b+1); for(i=1;i<=n;i++) h[i]=lower_bound(b+1,b+M+1,h[i])-b; for(i=1;i<=n+n;i++) S[i]=i; for(i=1;i<=m;i++) { int u=getInt(); int v=getInt(); int w=getInt(); E[i]=MP(w,MP(u,v)); } sort(E+1,E+m+1); int cur=n; for(i=1;i<=m;i++) { int u=E[i].second.first; int v=E[i].second.second; int w=E[i].first; if(get(u)==get(v)) continue; u=get(u); v=get(v); cur++; S[get(u)]=S[get(v)]=cur; g[cur].pb(u); g[cur].pb(v); eLen[cur]=w; } for(i=1;i<=n;i++) if(!visit[i]) DFS(get(i)); int j; for(i=1;(1<<i)<=cur;i++) for(j=1;j<=cur;j++) { f[j][i]=f[f[j][i-1]][i-1]; Max[j][i]=max(Max[j][i-1],Max[f[j][i-1]][i-1]); } clr(root,-1); root[0]=build(1,M); for(i=1;i<=id;i++) { int u=mp[i]; if(u<=n) insert(root[i],root[i-1],1,M,h[u]); else { root[i]=root[i-1]; if(st[u]==0) st[u]=i; else ed[u]=i; } } int ans=0; while(Q--) { int v=getInt(); int x=getInt(); int k=getInt(); if(-1!=ans) v^=ans,x^=ans,k^=ans; int t=get(v,x); int L=st[t],R=ed[t]; int cnt=a[root[R]].sum-a[root[L]].sum; if(cnt<k) ans=-1; else ans=b[query(root[L],root[R],1,M,cnt+1-k)]; printf("%d\n",ans); } }
BZOJ 3551 Peaks加强版的更多相关文章
- Peaks BZOJ 3545 / Peaks加强版 BZOJ 3551
Peaks [问题描述] 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问 ...
- bzoj 3545&&3551: [ONTAK2010]Peaks &&加强版 平衡树&&并查集合并树&&主席树
3545: [ONTAK2010]Peaks Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 635 Solved: 177[Submit][Stat ...
- BZOJ 3551: [ONTAK2010]Peaks加强版 [Kruskal重构树 dfs序 主席树]
3551: [ONTAK2010]Peaks加强版 题意:带权图,多组询问与一个点通过边权\(\le lim\)的边连通的点中点权k大值,强制在线 PoPoQQQ大爷题解传送门 说一下感受: 容易发现 ...
- 【BZOJ-3545&3551】Peaks&加强版 Kruskal重构树 + 主席树 + DFS序 + 倍增
3545: [ONTAK2010]Peaks Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1202 Solved: 321[Submit][Sta ...
- 3551: [ONTAK2010]Peaks加强版
3551: [ONTAK2010]Peaks加强版 https://www.lydsy.com/JudgeOnline/problem.php?id=3551 分析: kruskal重构树 + 倍增 ...
- 【BZOJ3551】 [ONTAK2010]Peaks加强版
BZOJ3551 [ONTAK2010]Peaks加强版 Solution Kruscal重构树后发现可以对于小于的离散化然后倍增+主席树找到上一个的可行解. 然后就可以了. 如果数组开的不好,容易在 ...
- 【BZOJ3551】Peaks加强版(Kruskal重构树,主席树)
[BZOJ3551]Peaks加强版(Kruskal重构树,主席树) 题面 BZOJ Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相 ...
- 【BZOJ3551】[ONTAK2010]Peaks加强版 最小生成树+DFS序+主席树
[BZOJ3545][ONTAK2010]Peaks Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困 ...
- [BZOJ3551][ONTAK2010]Peaks(加强版)(Kruskal重构树,主席树)
3551: [ONTAK2010]Peaks加强版 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2438 Solved: 763[Submit][ ...
随机推荐
- 关于mybatis的参数2个使用经验(类似于struts2的通配所有页面的action配置,xmlsq语句参数类型为基本类型时的快捷指定办法)
1.我们都知道在struts2中为防止浏览器绕过struts过滤器直接请求页面,所以我们都会配置一个拦截所有页面的action,如下: <action name="*"> ...
- [CentOS] 使用gitolite搭建git服务端
1. 创建用户 #创建gitadmin用户 useradd gitadmin #设置gitadmin密码 passwd gitadmin #创建git用户 useradd git #设置git密码 p ...
- WCF技术的不同应用场景及其实现分析
这一篇文章,是总结一下WCF技术,以及基于这个技术发展出来的几个典型应用场景,并且我将尝试对这些不同的WCF实现的原理进行一些比较分析. 关于WCF这个技术的基本概念,如果你不是很清楚,可以参考一下有 ...
- shell 条件测试语句三种方法
1.test -f file 2.[ -f file ] 3.[[ -f file ]] [ -f file1 -a -f file2]逻辑与[ -f file1 -o -f file2]逻辑或 [ ...
- gerrit-git
解释为什么gerrit中的push是需要用refs/for/master http://stackoverflow.com/questions/10461214/why-is-git-push-ger ...
- Linux TTY框架【转】
本文转载自:http://ju.outofmemory.cn/entry/281168 1. 前言 由于串口的缘故,TTY是Linux系统中最普遍的一类设备,稍微了解Linux系统的同学,对它都不陌生 ...
- is_user_logged_in()
function is_user_logged_in() { $user = wp_get_current_user(); return $user->exists(); } wp_get_cu ...
- KindEditor图片批量上传
KindEditor编辑器图片批量上传采用了上传插件swfupload.swf,所以后台上传文件方法返回格式应为JSONObject的String格式(注). JSONObject格式: JSONOb ...
- PHP获取不了React Native Fecth参数的解决办法是怎么样呢?
fetch('https://mywebsite.com/endpoint/', { method: 'POST',headers: {'Accept': 'application/json','Co ...
- C#:插件、框架
1.开源实体映射框架EmitMapper(http://www.cnblogs.com/wuhong/archive/2011/09/21/2184313.html) 2.ffmpeg.exe是一个源 ...