【BZOJ3545&BZOJ3551】Peaks(kruskal重构树,主席树,dfs序)
题意:在Bytemountains有N座山峰,每座山峰有他的高度h_i。
有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,
现在有Q组询问,每组询问询问从点v开始只经过困难值小于等于x的路径所能到达的山峰中第k高的山峰,如果无解输出-1。
N<=10^5, M,Q<=5*10^5,h_i,c,x<=10^9。
强制在线
思路:考虑按照最小生成树的过程,维护联通块能走到的所有权值的个数,可以用线段树合并
kruskal重构树是类似用kruskal计算最小生成树的过程,但每次合并两个点x,y时不是直接连边,而是新建一个点T,分别链接T和x,y,T的点权为(x,y)的边权
这样生成的树最多有2*n-1个点,而且有以下性质:
1.从某个点v出发,能走到的点一定在v向上走直到点权>u的点y,这个点u的子树中
2.是二叉树
3.按最小生成树生成是一个大根堆
4.任意两点路径上的最大值是lca的点权
预处理之后变成查询静态子树k大,dfs序+主席树即可
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int,int> PII;
typedef pair<ll,int> Pli;
typedef pair<ll,ll> Pll;
typedef vector<int> VI;
typedef vector<PII> VII;
typedef pair<ll,ll>P;
#define N 200000+10
#define M 400000+10
#define INF 1e9
#define fi first
#define se second
#define MP make_pair
#define pb push_back
#define pi acos(-1)
#define mem(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
#define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
#define lowbit(x) x&(-x)
#define Rand (rand()*(1<<16)+rand())
#define id(x) ((x)<=B?(x):m-n/(x)+1)
#define ls p<<1
#define rs p<<1|1
#define fors(i) for(auto i:e[x]) if(i!=p) const int MOD=1e9+,inv2=(MOD+)/;
//int p=1e6+3;
//double eps=1e-6;
int dx[]={-,,,};
int dy[]={,,-,}; struct edge
{
int x,y,z;
}a[]; bool cmp(edge a,edge b)
{
return a.z<b.z;
} struct node
{
int l,r,s;
}t[]; int f[N][],g[N][],head[N],vet[M],nxt[M],val[M],st[N],ed[N],
q[M],vis[N],fa[N],dep[N],h[N],d[N],root[M],bin[],tot,n,m,Q,cnt,len,num; int read()
{
int v=,f=;
char c=getchar();
while(c<||<c) {if(c=='-') f=-; c=getchar();}
while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
return v*f;
} ll readll()
{
ll v=,f=;
char c=getchar();
while(c<||<c) {if(c=='-') f=-; c=getchar();}
while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
return v*f;
} void add(int a,int b)
{
nxt[++tot]=head[a];
vet[tot]=b;
head[a]=tot;
} void dfs(int u)
{
vis[u]=; q[++len]=u;
int e=head[u];
while(e)
{
int v=vet[e];
if(!vis[v])
{
dep[v]=dep[u]+;
f[v][]=u;
g[v][]=val[u];
dfs(v);
}
e=nxt[e];
}
if(u>n) q[++len]=u;
} int dsu(int k)
{
if(fa[k]!=k) fa[k]=dsu(fa[k]);
return fa[k];
} int calc(int u,int x)
{
per(i,,) if(dep[u]>=bin[i]&&g[u][i]<=x) u=f[u][i];
return u;
} void update(int l,int r,int x,int p1,int &p2)
{
t[p2=++cnt]=t[p1];
t[p2].s++;
if(l==r) return;
int mid=(l+r)>>;
if(x<=mid) update(l,mid,x,t[p1].l,t[p2].l);
else update(mid+,r,x,t[p1].r,t[p2].r);
} int query(int l,int r,int k,int p1,int p2)
{
if(l==r) return l;
int mid=(l+r)>>;
int tmp=t[t[p2].l].s-t[t[p1].l].s;
if(tmp>=k) return query(l,mid,k,t[p1].l,t[p2].l);
else return query(mid+,r,k-tmp,t[p1].r,t[p2].r);
} void build()
{
num=n;
sort(a+,a+m+,cmp);
tot=;
rep(i,,m)
{
int p=dsu(a[i].x),q=dsu(a[i].y);
if(p!=q)
{
num++;
fa[p]=fa[q]=num;
val[num]=a[i].z;
add(num,q);
add(num,p);
if(num==*n-) break;
}
}
len=;
rep(i,,n)
if(!vis[i]) dfs(dsu(i));
rep(i,,)
rep(j,,num)
if(dep[j]>=bin[i])
{
f[j][i]=f[f[j][i-]][i-];
g[j][i]=max(g[j][i-],g[f[j][i-]][i-]);
}
cnt=;
rep(i,,len)
{
int u=q[i];
if(u<=n) update(,n,h[u],root[i-],root[i]);
else
{
root[i]=root[i-];
if(!st[u]) st[u]=i;
else ed[u]=i;
}
}
} void solve()
{
int v,x,k;
int lastans=;
rep(i,,Q)
{
v=read(),x=read(),k=read();
if(lastans!=-) v^=lastans,x^=lastans,k^=lastans;
int u=calc(v,x);
int L=root[st[u]],R=root[ed[u]];
if(t[R].s-t[L].s<k) lastans=-;
else lastans=d[query(,n,t[R].s-t[L].s-k+,L,R)];
printf("%d\n",lastans);
}
} int main()
{
bin[]=;
rep(i,,) bin[i]=bin[i-]<<;
n=read(),m=read(),Q=read();
rep(i,,n) h[i]=read(),d[i]=h[i];
sort(d+,d+n+);
rep(i,,n) h[i]=lower_bound(d+,d+n+,h[i])-d;
rep(i,,*n) fa[i]=i;
rep(i,,m)
{
a[i].x=read();
a[i].y=read();
a[i].z=read();
}
build();
solve();
return ;
}
【BZOJ3545&BZOJ3551】Peaks(kruskal重构树,主席树,dfs序)的更多相关文章
- BZOJ3545&3551[ONTAK2010]Peaks——kruskal重构树+主席树+dfs序+树上倍增
题目描述 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点v开始只 ...
- 【BZOJ-3545&3551】Peaks&加强版 Kruskal重构树 + 主席树 + DFS序 + 倍增
3545: [ONTAK2010]Peaks Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1202 Solved: 321[Submit][Sta ...
- 【BZOJ3545】Peaks(Kruskal重构树 主席树)
题目链接 大意 给出有\(N\)个点\(M\)条边的一张图,其中每个点都有一个High值,每条边都有一个Hard值. 再给出\(Q\)个询问:\(v\) \(x\) \(k\) 每次询问查询从点\(v ...
- luogu4197 Peaks (kruskal重构树+主席树)
按照边权排序建出kruskal重构树,每次就变成了先找一个权值<=x的最远的祖先,然后看这个子树的第k小.离散化一下,在dfs序上做主席树即可 而且只需要建叶节点的主席树 注意输出的是第k小点的 ...
- 洛谷P4197 Peaks(Kruskal重构树 主席树)
题意 题目链接 往后中文题就不翻译了qwq Sol 又是码农题..出题人这是强行把Kruskal重构树和主席树拼一块了啊.. 首先由于给出的限制条件是<=x,因此我们在最小生成树上走一定是最优的 ...
- 【BZOJ3551】【BZOJ3545】 【ONTAK2010】 Peaks (kruskal重构树+主席树)
Description 在\(Bytemountains\)有\(~n~\)座山峰,每座山峰有他的高度\(~h_i~\). 有些山峰之间有双向道路相连,共\(~m~\)条路径,每条路径有一个困难值 ...
- luoguP4197:Peaks(Kruskal重构树+主席树)或者(点分树+离线)
题意:有N座山,M条道路.山有山高,路有困难值(即点权和边权).现在Q次询问,每次给出(v,p),让求从v出发,只能结果边权<=p的边,问能够到达的山中,第K高的高度(从大到小排序). 思路:显 ...
- [BZOJ3551][ONTAK2010]Peaks(加强版)(Kruskal重构树,主席树)
3551: [ONTAK2010]Peaks加强版 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2438 Solved: 763[Submit][ ...
- [luogu P4197] Peaks 解题报告(在线:kruskal重构树+主席树 离线:主席树+线段树合并)
题目链接: https://www.luogu.org/problemnew/show/P4197 题目: 在Bytemountains有N座山峰,每座山峰有他的高度$h_i$.有些山峰之间有双向道路 ...
- LOJ.2865.[IOI2018]狼人(Kruskal重构树 主席树)
LOJ 洛谷 这题不就是Peaks(加强版)或者归程么..这算是\(IOI2018\)撞上\(NOI2018\)的题了? \(Kruskal\)重构树(具体是所有点按从小到大/从大到小的顺序,依次加入 ...
随机推荐
- P1004方格取数
这是提高组得一道动态规划题,也是学习y氏思考法的第一道题. 题意为给定一个矩阵,里面存有一些数,你从左上角开始走到右下角,另一个人从右下角开始走到左上角,使得两个人取数之和最大,当然一个数只可以取走一 ...
- win10 64支持承载网络
在intel官网找到对应型号的网卡驱动. 下载win7版本的,更新驱动.安装完毕之后还要在设备管理里面更新2019 7 30这个版本的驱动. 英特尔® PROSet/无线软件和面向 IT 管理员的驱动 ...
- GoAccess操作手册
名字 GoAccess - 可视化 Web 日志分析工具. 语法 goaccess [filename] [ options ... ] [-c][-M][-H][-q][-d][...] 描述 Go ...
- Java后端技术面试汇总(第五套)
1.Java相关 • 乐观悲观锁的设计,如何保证原子性,解决的问题:• char和double的字节,以及在内存的分布是怎样:• 对象内存布局,然后讲下对象的死亡过程?• 对象头,详细讲下:• syn ...
- spring boot 发布自动生成svn版本号
通过Jenkins构建发布spring boot项目时,常常有需求,需要把Svn的版本号更新到项目的版本上,通过有两种解决方案: 1. 通过shell命令对配置文件中的指定字符进行替换, 如: 配置文 ...
- spring boot JPA 数据库连接池释放
当JPA获取数据库数据连接时,如果连接数超过最大连接数的配置,系统就会报错: Unable to acquire JDBC Connection 和: Caused by: java.sql.SQLT ...
- Centos7:mysql5.6安装,配置及使用(RPM方式)
1.首先安装好jdk环境,本机所用环境为jdk1.8 2.卸载MariaDB(Centos7自带)与Mysql 2.1卸载:MariaDB #rpm -qa | grep -i mariadb //查 ...
- 设置VMware 以及指定 虚拟机 ,开机自启动
进入开机自启动目录 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp 重命名为 start.bat 编辑 这个文件,编辑之后Ct ...
- 学习.NET中的AppDomain
学习.NET中的AppDomain 什么是AppDomain?AppDomain是一组程序集的逻辑容器,AppDomain是为了提供隔离而设计的.它提供了保护.配置和终止其中每一个应用程序的隔离 Ap ...
- 2019 年百度之星·程序设计大赛 - 初赛一 C. HDU 6670 Mindis 离散化+dijkstra
题目链接 :http://acm.hdu.edu.cn/showproblem.php?pid=6670 Mindis Time Limit: 4000/2000 MS (Java/Others) M ...