[BZOJ3551][ONTAK2010]Peaks(加强版)(Kruskal重构树,主席树)
3551: [ONTAK2010]Peaks加强版
Time Limit: 20 Sec Memory Limit: 128 MB
Submit: 2438 Solved: 763
[Submit][Status][Discuss]Description
【题目描述】同3545Input
第一行三个数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
同3545Sample Input
Sample Output
HINT
【数据范围】同3545Source
做一遍Kruskal,每次加入一条边的时候为这条边新建一个点,点权为其边权,分别连向两个连通块。就建出了一个Kruskal重构树。
重构树的性质:是一个二叉堆,且原图中两点的满足“路径上最大边权最小”的路径的最大边权就是新树中两点的LCA的点权。
建出来求出DFS序跑主席树即可。
接下来吐槽这道题。题目是3545的加强版,加了强制在线不给样例,结果拿原题的样例死活测不对。导致我对着一个正确的程序调了整整一个下午。
#include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=l; i<=r; i++)
using namespace std; const int N=,M=;
int n,m,Q,x,ans,val[N],tot,u,lim,k,tim,cnt,nd,dep[N],dfn[N],L[N],R[N],ls[M],rs[M],sz[M];
int fa[N][],mp[N],f[N],to[N<<],nxt[N<<],h[N],root[N];
struct P{ int u,v,w; bool operator <(const P &r)const{ return w<r.w; }}a[];
int find(int x){ return (x==f[x]) ? x : f[x]=find(f[x]); }
void add(int u,int v){ to[++cnt]=v; nxt[cnt]=h[u]; h[u]=cnt; } void Kruskal(){
sort(a+,a+m+); int k=;
rep(i,,m){
int u=a[i].u,v=a[i].v,w=a[i].w,x=find(u),y=find(v);
if (x==y) continue;
val[++tot]=w; add(tot,x); add(tot,y); f[x]=f[y]=f[tot]=tot;
if (++k==n-) break;
}
} void dfs(int u){
if (u<=n) dfn[++tim]=u; L[u]=tim;
for (int i=; (<<i)<=dep[u]; i++) fa[u][i]=fa[fa[u][i-]][i-];
for (int i=h[u],k; i; i=nxt[i])
if ((k=to[i])!=fa[u][]) fa[k][]=u,dep[k]=dep[u]+,dfs(k);
R[u]=tim;
} void insert(int y,int &x,int L,int R,int pos){
ls[x=++nd]=ls[y]; rs[x]=rs[y]; sz[x]=sz[y]+;
if (L==R) return; int mid=(L+R)>>;
if (pos<=mid) insert(ls[y],ls[x],L,mid,pos); else insert(rs[y],rs[x],mid+,R,pos);
} int que(int x,int y,int k){
x=root[x]; y=root[y]; int all=sz[y]-sz[x];
if (k>all) return -;
k=all-k+; int L=,R=*mp;
while (L!=R){
int S=sz[ls[y]]-sz[ls[x]],mid=(L+R)>>;
if (k<=S) x=ls[x],y=ls[y],R=mid;
else x=rs[x],y=rs[y],L=mid+,k-=S;
}
return L;
} int main(){
freopen("bzoj3551.in","r",stdin);
freopen("bzoj3551.out","w",stdout);
scanf("%d%d%d",&n,&m,&Q); tot=n;
rep(i,,n) scanf("%d",&x),val[i]=mp[i]=x,f[i]=i;
val[]=1e9+; rep(i,,m) scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].w);
Kruskal(); dfs(tot); sort(mp+,mp+n+); mp[]=unique(mp+,mp+n+)-mp-;
rep(i,,n) val[i]=lower_bound(mp+,mp+mp[]+,val[i])-mp;
rep(i,,n) insert(root[i-],root[i],,*mp,val[dfn[i]]);
rep(i,,Q){
if (ans==-) ans=;
scanf("%d%d%d",&u,&lim,&k); u^=ans; lim^=ans; k^=ans;
for (int i=; ~i; i--) if (val[fa[u][i]]<=lim) u=fa[u][i];
ans=que(L[u],R[u],k);
if (~ans) ans=mp[ans]; printf("%d\n",ans);
}
return ;
}
[BZOJ3551][ONTAK2010]Peaks(加强版)(Kruskal重构树,主席树)的更多相关文章
- BZOJ.3551.[ONTAK2010]Peaks加强版(Kruskal重构树 主席树)
题目链接 \(Description\) 有n个座山,其高度为hi.有m条带权双向边连接某些山.多次询问,每次询问从v出发 只经过边权<=x的边 所能到达的山中,第K高的是多少. 强制在线. \ ...
- 【BZOJ-3545&3551】Peaks&加强版 Kruskal重构树 + 主席树 + DFS序 + 倍增
3545: [ONTAK2010]Peaks Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1202 Solved: 321[Submit][Sta ...
- luoguP4197:Peaks(Kruskal重构树+主席树)或者(点分树+离线)
题意:有N座山,M条道路.山有山高,路有困难值(即点权和边权).现在Q次询问,每次给出(v,p),让求从v出发,只能结果边权<=p的边,问能够到达的山中,第K高的高度(从大到小排序). 思路:显 ...
- BZOJ 3551: [ONTAK2010]Peaks加强版 [Kruskal重构树 dfs序 主席树]
3551: [ONTAK2010]Peaks加强版 题意:带权图,多组询问与一个点通过边权\(\le lim\)的边连通的点中点权k大值,强制在线 PoPoQQQ大爷题解传送门 说一下感受: 容易发现 ...
- 【BZOJ 3551】[ONTAK2010] Peaks加强版 Kruskal重构树+树上倍增+主席树
这题真刺激...... I.关于Kruskal重构树,我只能开门了,不过补充一下那玩意还是一棵满二叉树.(看一下内容之前请先进门坐一坐) II.原来只是用树上倍增求Lca,但其实树上倍增是一种方法,L ...
- BZOJ 3551: [ONTAK2010]Peaks加强版 Kruskal重构树+dfs序+主席树+倍增
建出来 $Kruskal$ 重构树. 将询问点向上跳到深度最小,且合法的节点上. 那么,得益于重构树优美的性质,这个最终跳到的点为根的所有子节点都可以与询问点互达. 对于子树中求点权第 $k$ 大的问 ...
- BZOJ3551 Peaks加强版 [Kruskal重构树,主席树]
BZOJ 思路 我觉得这题可持久化线段树合并也可以做 我觉得这题建出最小生成树之后动态点分治+线段树也可以做 还是学习一下Kruskal重构树吧-- Kruskal重构树,就是在做最小生成树的时候,如 ...
- BZOJ3545&3551[ONTAK2010]Peaks——kruskal重构树+主席树+dfs序+树上倍增
题目描述 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点v开始只 ...
- 【BZOJ3545&BZOJ3551】Peaks(kruskal重构树,主席树,dfs序)
题意:在Bytemountains有N座山峰,每座山峰有他的高度h_i. 有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走, 现在有Q组询问,每组询问询问从点v开始只 ...
随机推荐
- Codeforces Round #351 (VK Cup 2016 Round 3, Div. 2 Edition) A
A. Bear and Game time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- 关于JAVA正则匹配空白字符的问题(全角空格与半角空格)
今天遇到一个字符串,怎么匹配空格都不成功!!! 我把空格复制到test.properties文件 显示“\u3000” ,这是什么? 这是全角空格!!! 查了一下 \s 不支持全角 1.& ...
- centos配置数据源和java环境配置
---恢复内容开始--- 一:前言 今天送走了一位同事,看着别人走勾起了我蠢蠢欲动的心啊,但是我知道,我不能那么的任性,我是men,这几天难得的清闲,所以我就弄一弄linux,昨天把网给配通了,今天配 ...
- MVC前台获取ViewData的数组中的值
查了一上午资料,找到了一种比较有效的方法 后台控制器:public ActionResult Index() { List<string> colors = new List<str ...
- Nginx配置配置文件详解
文章目录 配置文件 nginx.conf配置文件详解 用于调试.定位问题的配置参数 正常运行必备的配置参数 优化性能的配置参数 事件相关配置 Fastcgi相关配置参数 常需要调整的参数 nginx作 ...
- CodeForces - 682B 题意水题
CodeForces - 682B Input The first line of the input contains a single integer n (1 ≤ n ≤ 100 000) — ...
- 鼠标DPI和液晶显示器分辨率的关系
鼠标DPI和液晶显示器分辨率的关系 说起鼠标,有两个性能指标是我们不能忽略的.一是游戏玩家相当熟悉的扫描率(单位:Frames Per Second),二是我们今天要和大家探讨的鼠标的分辨率(单位:D ...
- 【mysql优化】大数据量分页优化
limit 翻页原理 limit offset,N, 当offset非常大时, 效率极低, 原因是mysql并不是跳过offset行,然后单取N行, 而是取offset+N行,返回放弃前offset行 ...
- python面向对象之继承与派生
一.继承 继承是一种创建新的类的方式,在python中,新建的类可以继承自一个或者多个父类,原始类称为基类或超类,新建的类称为派生类或子类. python中类的继承分为:单继承和多继承,如果是多继承的 ...
- 千万不要使用xfce和KDE版Manjaro Linux--之荒谬言论
Manjaro Linux 使用经验: ①千万不要使用xfce版,虽然性能上廉价,但是吃亏,调声音80%几率卡死调不了,托盘图标很容易不响应!关机的Beep声,分分钟吓死人!按照网上各种方法弄,下次开 ...