Peaks BZOJ 3545 / Peaks加强版 BZOJ 3551
Peaks
【问题描述】
在Bytemountains有N座山峰,每座山峰有他的高度h_i。有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点v开始只经过困难值小于等于x的路径所能到达的山峰中第k高的山峰,如果无解输出-1。
【输入格式】
第一行三个数N,M,Q。
第二行N个数,第i个数为h_i
接下来M行,每行3个数a b c,表示从a到b有一条困难值为c的双向路径。
接下来Q行,每行三个数v x k,表示一组询问。
【输出格式】
对于每组询问,输出一个整数表示答案。
【样例输入】
10 11 4
1 2 3 4 5 6 7 8 9 10
1 4 4
2 5 3
9 8 2
7 8 10
7 1 4
6 7 1
6 4 8
2 1 5
10 8 10
3 4 7
3 4 6
1 5 2
1 5 6
1 5 8
8 9 2
【样例输出】
6
1
-1
8
【数据范围】
N<=10^5, M,Q<=5*10^5, h_i,c,x<=10^9。
题解:
根据题意,只有最小生成树上的边是有用的
考虑Kruskal重构树
即对于每一次连边,我们新建一个节点p,将两点祖先的父亲设为p,并将边权附为p的点权
那么就有这个树上就有许多性质:
1.树是二叉树
2.点权是大根堆的结构
3.新树中两点路径点权的信息(最大值、最小值)和原树中两点路径边权的信息相等
那么根据2、3,原树中两点路径上最大的边权就是新树中两点的最近公共祖先的点权
那么处理出Dfs序,就可以用主席树维护区间第k大值(需要离散)
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int inf = ;
const int logp = ;
const int maxn = 1e5 + ;
const int maxm = 5e5 + ;
const int maxp = maxn << ;
const int maxe = maxp << ;
const int maxs = maxp * logp ;
int n, m, q, p;
int num, cnt, tot;
int d[maxn], h[maxn];
int fat[maxp], val[maxp];
int rt[maxp], lc[maxs], rc[maxs], sum[maxs];
int si[maxp], dep[maxp], dfn[maxp], pos[maxp];
int fir[maxp], nex[maxe], ver[maxe];
int fa[logp + ][maxp];
int pr[logp + ], lg[maxp];
struct edge
{
int x, y, z;
};
edge a[maxm];
inline bool rule(edge a, edge b)
{
return a.z < b.z;
}
inline void Scan(int &x)
{
char c;
bool o = false;
while(!isdigit(c = getchar())) o = (c != '-') ? o : true;
x = c - '';
while(isdigit(c = getchar())) x = x * + c - '';
if(o) x = -x;
}
inline void Disc()
{
sort(d + , d + + n);
for(int i = ; i <= n; ++i) h[i] = lower_bound(d + , d + + n, h[i]) - d;
}
inline int Find(int x)
{
return (fat[x] != x) ? fat[x] = Find(fat[x]) : x;
}
inline void Ins(int x, int y)
{
nex[++tot] = fir[x];
fir[x] = tot;
ver[tot] = y;
}
void Dfs(int u)
{
si[u] = ;
dfn[u] = ++num;
pos[num] = u;
for(int i = fir[u]; i; i = nex[i])
{
int v = ver[i];
fa[][v] = u;
dep[v] = dep[u] + ;
Dfs(v);
si[u] += si[v];
}
}
inline void Kruskal()
{
p = n;
sort(a + , a + + m, rule);
for(int i = ; i <= m; ++i)
{
int x = Find(a[i].x), y = Find(a[i].y);
if(x != y)
{
fat[++p] = p;
val[p] = a[i].z;
fat[x] = fat[y] = p;
Ins(p, x), Ins(p, y);
if(p == (n << ) - ) break;
}
}
}
inline void Erg()
{
num = ;
for(int i = ; i <= p; ++i)
if(!dfn[i])
Dfs(Find(i));
}
inline void Table()
{
pr[] = ;
for(int i = ; i <= logp; ++i)
{
pr[i] = pr[i - ] << ;
if(pr[i] > p) break;
lg[pr[i]] = ;
}
for(int i = ; i <= p; ++i) lg[i] += lg[i - ];
}
inline void Rmq()
{
for(int k = ; k <= lg[p]; ++k)
for(int i = ; i <= p; ++i)
{
if(dep[i] < pr[k]) continue;
fa[k][i] = fa[k - ][fa[k - ][i]];
}
}
int Add(int p, int l, int r, int x)
{
int k = ++cnt;
sum[k] = sum[p] + ;
if(l == r) return k;
int mi = l + r >> ;
if(x <= mi) lc[k] = Add(lc[p], l, mi, x), rc[k] = rc[p];
else rc[k] = Add(rc[p], mi + , r, x), lc[k] = lc[p];
return k;
}
inline void Build()
{
Kruskal();
Erg();
Table();
Rmq();
for(int i = ; i <= num; ++i)
{
int x = pos[i];
if(x > n) rt[i] = rt[i - ];
else rt[i] = Add(rt[i - ], , n, h[x]);
}
}
inline int Jump(int x, int v)
{
int len = lg[dep[x]];
for(int i = len; i >= ; --i)
if(val[fa[i][x]] <= v)
x = fa[i][x];
return x;
}
int Query(int a, int b, int l, int r, int k)
{
if(l == r) return l;
int amo = sum[rc[b]] - sum[rc[a]];
int mi = l + r >> ;
if(amo < k) return Query(lc[a], lc[b], l, mi, k - amo);
return Query(rc[a], rc[b], mi + , r, k);
}
int Ask(int x, int v, int k)
{
int anc = Jump(x, v);
int beg = rt[dfn[anc] - ];
int end = rt[dfn[anc] + si[anc] - ];
if(sum[end] - sum[beg] < k) return -;
int hi = Query(beg, end, , n, k);
return d[hi];
}
int main()
{
Scan(n), Scan(m), Scan(q);
val[] = inf;
for(int i = ; i <= n; ++i) Scan(h[i]), d[i] = h[i], fat[i] = i;
Disc();
for(int i = ; i <= m; ++i) Scan(a[i].x), Scan(a[i].y), Scan(a[i].z);
Build();
int ans = -;
while(q--)
{
int x, v, k;
Scan(x), Scan(v), Scan(k);
if(ans != -) x ^= ans, v ^= ans, k ^= ans;
ans = Ask(x, v, k);
printf("%d\n", ans);
}
}
Peaks BZOJ 3545 / Peaks加强版 BZOJ 3551的更多相关文章
- bzoj 3545&&3551: [ONTAK2010]Peaks &&加强版 平衡树&&并查集合并树&&主席树
3545: [ONTAK2010]Peaks Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 635 Solved: 177[Submit][Stat ...
- 【BZOJ 3545】【ONTAK 2010】Peaks & 【BZOJ 3551】【ONTAK 2010】Peaks加强版 Kruskal重构树
sunshine的A题我竟然调了一周!!! 把循环dfs改成一个dfs就可以,,,我也不知道为什么这样就不会RE,但它却是A了,,, 这周我一直在调这个题,总结一下智障错误: 1.倍增的范围设成了n而 ...
- bzoj 3545/3551: [ONTAK2010]Peaks -- 主席树,最小生成树,倍增
3545: [ONTAK2010]Peaks Time Limit: 10 Sec Memory Limit: 128 MB Description 在Bytemountains有N座山峰,每座山峰 ...
- 【Peaks加强版 BZOJ 3551】你被坑了吗?
这道在没加读入优化时间在20s左右的题终于在大米饼两天的死缠烂打.鬼混.乱整乱撞后艰难地AC了.但惋惜的是,大米饼一号代码其实更加简洁,但至今找不出BUG,我将它放在下面,也许有一天从远方来的另一个大 ...
- BZOJ 3545: [ONTAK2010]Peaks [Splay启发式合并]
3545: [ONTAK2010]Peaks 题意:带权图,多组询问与一个点通过边权\(\le x\)的边连通的点中点权k大值 又读错题了,输出点一直WA,问的是点权啊 本题加强版强制在线了,那这道题 ...
- BZOJ 3545: [ONTAK2010]Peaks( BST + 启发式合并 + 并查集 )
这道题很好想, 离线, 按询问的x排序从小到大, 然后用并查集维护连通性, 用平衡树维护连通块的山的权值, 合并就用启发式合并.时间复杂度的话, 排序是O(mlogm + qlogq), 启发式合并是 ...
- ●BZOJ 3545 [ONTAK2010]Peaks(离线)
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3545 http://www.lydsy.com/JudgeOnline/problem.ph ...
- BZOJ 3545 / 洛谷 P4197 Peaks 解题报告
P4197 Peaks 题目描述 在\(\text{Bytemountains}\)有\(N\)座山峰,每座山峰有他的高度\(h_i\).有些山峰之间有双向道路相连,共\(M\)条路径,每条路径有一个 ...
- bzoj 3545: [ONTAK2010]Peaks Kruskal重构树
题目: 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点v开始只经 ...
随机推荐
- lg、ln的表示方法
c语言中 函数 log(x) 表示是以e为底的自然对数,即 ln(x) 函数 log10(x) 以10为底的对数,即 lg(x) 以其它数为底的对数用换底公式来表示 log(a)/log(b) 函数 ...
- Html5怎么导出图片
其实很简单, 首先需要两个js文件 jquery.min.js html2canvas.js 直接上代码,几行就解决了 <a id="example1" onclick=&q ...
- CeontOS6.5安装php环境
港湾云主机重装操作系统之后xshell无法连接:重启ssh:# service sshd restart -bash: vim: command not found:输入 rpm -qa|grep v ...
- [BZOJ4899]:记忆的轮廓(概率DP)
题目传送门 题目描述: 通往贤者之塔的路上,有许多的危机. 我们可以把这个地形看做是一颗树,根节点编号为1,目标节点编号为n,其中1-n的简单路径上,编号依次递增, 在[1,n]中,一共有n个节点.我 ...
- word转HTML在layuiadmin中锚点调转问题
前言: 在以前我们讲过把word转成HTML移植入自己的web项目使用:Word转html并移植到web项目 正文: 发现如果在layuiadmin框架中,页面里锚点跳转时会不正常(会跳转到新页面): ...
- ios 登录功能学习研究
登录功能是我在湖畔做的第一个需求. 当时PD给我的草图和下图类似: (图片来自知乎iOS客户端登录界面) 不过需求中要求用户名或者密码错误时,输入框要抖动(类似Mac登录密码错误的抖动效果). 如果实 ...
- javascript设计模式(张容铭)学习笔记 - 照猫画虎-模板方法模式
模板方法模式(Template Method):父类中定义一组操作算法骨架,而降一些实现步骤延迟到子类中,使得子类可以不改变父类的算法结构的同时可重新定义算法中某些实现步骤. 项目经理体验了各个页面的 ...
- LuoguP1351 联合权值 (枚举)
题目链接 枚举每个点,遍历和他相邻的点,然后答案一边更新就可以了. 最大值的时候一定是两个最大值相乘,一边遍历一边记录就好了. 时间复杂度.\(O(n)\) #include <iostream ...
- 【贪心】bzoj1572: [Usaco2009 Open]工作安排Job
先是没怎么理解这个贪心……然后贪心又被细节弄挂…… Description Farmer John 有太多的工作要做啊!!!!!!!!为了让农场高效运转,他必须靠他的工作赚钱,每项工作花一个单位时间. ...
- MySQL 查询优化之 Index Condition Pushdown
MySQL 查询优化之 Index Condition Pushdown Index Condition Pushdown限制条件 Index Condition Pushdown工作原理 ICP的开 ...