[ONTAK2010] Peaks加强版 (kruskal重构树+主席树+倍增)

Peaks

  • description
  • solution
  • code

description

在Bytemountains有N座山峰,每座山峰有他的高度h_i

有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走

现在有Q组询问,每组询问询问从点v开始只经过困难值小于等于x的路径所能到达的山峰中第k高的山峰,如果无解输出-1。

Input

第一行三个数N,M,Q

第二行N个数,第i个数为h_i

接下来M行,每行3个数a b c,表示从a到b有一条困难值为c的双向路径

接下来Q行,每行三个数v x k,表示一组询问

Output

对于每组询问,输出一个整数表示答案。

Sample Input

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

Sample Output

6
1
-1
8

Hint

N<=105,M,Q<=5∗105,hi,c,x<=109N<=10^5, M,Q<=5*10^5,h_i,c,x<=10^9N<=105,M,Q<=5105hi,c,x<=109

solution

困难值小于等于x,又是这种限制题,很容易联想到前几天才写的[NOI2018]归程

套路的,要对边权进行排序,(通常还会有一步离散化),然后建立主席树,每个iii版本的线段树表示边权≤xi\le x_ixi的所有边存在的树/图

本题思想是一致的,但是实现不同

使用kruskal重构树

重构后,对树dfn编序

叶子节点就表示该节点的高度,非叶子节点则表示该点子树内最大边权

每次查询的最大边限制x,就可以从v开始倍增地在dfs树上跳边,直到跳到某个祖先节点存的值是最大的小于等于x的边权,此时再往上跳边权就超过了x的限制

所以v能到达的点就是这个祖先节点管辖的区间内的所有点

kruskal重构树,深度越小的点代表的边权越大;实现是从小往上逐渐构造出一棵MST

利用dfn序列的性质,一个点子树内dfn序是一段连续区间,可以用线段树维护

直接线段树里面查即可

具体而言:对每个点都建立权值线段树,对每个点的线段树版本可持久化,查祖先管辖区间内的值就是其管辖区间右端点版本减去其管辖区间左端点的前一个版本

code

#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define maxn 500005
int n, m, Q, cnt;
vector < int > G[maxn];
struct edge { int u, v, w; } E[maxn];
struct node { int lson, rson, tot; } t[maxn * 30];
int St[maxn], Ed[maxn], fa[maxn], h[maxn], d[maxn], root[maxn], id[maxn], dfn[maxn];
int f[maxn][20];int find( int x ) { return x == fa[x] ? x : fa[x] = find( fa[x] ); }void dfs( int u, int p ) {dfn[St[u] = ++ cnt] = u, f[u][0] = p;for( int i = 1;i < 20;i ++ )f[u][i] = f[f[u][i - 1]][i - 1];for( auto v : G[u] ) dfs( v, u );Ed[u] = cnt;
}void modify( int &now, int lst, int l, int r, int pos ) {t[now = ++ cnt] = t[lst];t[now].tot ++; if( l == r ) return;int mid = ( l + r ) >> 1;if( pos <= mid ) modify( t[now].lson, t[lst].lson, l, mid, pos );else modify( t[now].rson, t[lst].rson, mid + 1, r, pos );
}int query( int L, int R, int l, int r, int k ) {if( l == r ) return l;int x = t[t[R].lson].tot - t[t[L].lson].tot;int mid = ( l + r ) >> 1;if( k <= x ) return query( t[L].lson, t[R].lson, l, mid, k );else return query( t[L].rson, t[R].rson, mid + 1, r, k - x );
}int main() {scanf( "%d %d %d", &n, &m, &Q );for( int i = 1;i <= n;i ++ )scanf( "%d", &h[i] ), d[i] = h[i];sort( d + 1, d + n + 1 );int tot = unique( d + 1, d + n + 1 ) - d - 1;for( int i = 1;i <= n;i ++ )h[i] = lower_bound( d + 1, d + tot + 1, h[i] ) - d;for( int i = 1;i <= m;i ++ )scanf( "%d %d %d", &E[i].u, &E[i].v, &E[i].w );sort( E + 1, E + m + 1, []( edge x, edge y ) { return x.w < y.w; } );for( int i = 1;i <= n;i ++ ) id[i] = fa[i] = i;int N = n;for( int i = 1;i <= m;i ++ ) {int u = find( E[i].u ), v = find( E[i].v ), w = E[i].w;if( u ^ v ) {h[++ N] = w;G[N].push_back( id[u] );G[N].push_back( id[v] );id[fa[v] = u] = N;}}dfs( N, N );for( int i = 1;i <= N;i ++ )if( dfn[i] <= n ) modify( root[i], root[i - 1], 1, tot, h[dfn[i]] );else root[i] = root[i - 1];int lastans = -1, v, x, k;while( Q -- ) {scanf( "%d %d %d", &v, &x, &k );if( ~ lastans ) v ^= lastans, x ^= lastans, k ^= lastans;for( int i = 19;~ i;i -- )if( h[f[v][i]] <= x ) v = f[v][i];x = t[root[Ed[v]]].tot - t[root[St[v] - 1]].tot;if( x < k )x = -1;elsex = query( root[St[v] - 1], root[Ed[v]], 1, tot, x - k + 1 );printf( "%d\n", lastans = ( ~ x ) ? d[x] : -1 );}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317078.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

洛谷P2754:[CTSC1999]家园 / 星际转移问题(网络流)

解析 容易想到对每个时间的空间站都建一个点。 然后发现循环问题很难搞。 然后我就一直想从 lcm 下文章&#xff0c;结果 lcm 可以到3e5&#xff0c;于是就寄了… qwq 注意到本题的数据范围极小&#xff01; 那个3e5云云是不可能跑出来的&#xff0c;事实上&#xff0c;答案不…

Saving Beans HDU - 3037(卢卡斯定理)

Saving Beans HDU - 3037&#xff08;卢卡斯定理&#xff09; 题意&#xff1a; 他们想知道有多少种方法可以在n树中保存不超过m个bean&#xff08;它们是相同的&#xff09;。 现在他们求助于你&#xff0c;你应该给他们答案。 结果可能非常巨大; 你应该输出模p的结果&…

我们为什么要搞长沙.NET技术社区(三)

我们为什么要搞长沙.NET技术社区&#xff08;三&#xff09; 小饭局搞事情先从饭局开始是中华民族的优良传统。昨天晚餐时间&#xff0c;长沙 .net 技术社区的主要发起人员进行了一番小聚&#xff0c;同时也作为一个非正式会议&#xff0c;对社区发展进行了探讨。从介绍自己对于…

BZOJ4504. K个串(主席树+优先队列)

4504. K个串descriptionsolutioncodedescription 兔子们在玩k个串的游戏。首先&#xff0c;它们拿出了一个长度为n的数字序列&#xff0c;选出其中的一 个连续子串&#xff0c;然后统计其子串中所有数字之和&#xff08;注意这里重复出现的数字只被统计一次&#xff09;。 兔…

【招聘(北京)】北森测评招聘 .NET 架构师、高级工程师

工作职责公司核心产品的迭代需求分析设计开发。公司核心产品的线上维护和性能调优。对初中级技术人员培养和质量把关。编写软件设计和技术文档。任职资格为人正直、诚信、责任心强&#xff0c;能承受较大工作压力。强烈的目标导向意识&#xff0c;逻辑思维清晰&#xff0c;执行…

网络流模型与技巧总结

文章目录前言常见基本模型最大匹配、最小点覆盖和最大独立集构造最小点覆盖最大点权匹配最小路径覆盖不可重覆盖可重覆盖最大权闭合子图建图技巧利用拆点进行限流利用断边表示决策利用虚点表示组合关系链状模型用链表示时间轴用链表示偏序关系形式的选取限制通过拆点描述先后顺…

卢卡斯定理 Lucas

参考文章 详细定义内容看这个参考文章 结论&#xff1a; 模板&#xff1a; Lucas函数&#xff1a; long long Lucas(long long n,long long m){if(m0) return 1;return Lucas(n/p,m/p)*C(n%p,m%p)%p; }组合数函数&#xff1a; 此处求逆元的用的bp-2 long long C(long long…

BZOJ #2874. 训练士兵(差分+离散化+主席树)

BZOJ #2874. 训练士兵descriptionsolutioncodedescription Ryz正在着手于训练一批精锐士兵 Ryz手下有n*m个士兵&#xff0c;排成一个n行m列的方阵。在一天中&#xff0c;ryz会对士兵下达一些命令&#xff0c;每个命令作用于一个小方阵的所有士兵&#xff0c;并且会增加他们的…

VS 2019 要来了,是时候了解一下 C# 8.0 新功能

近日&#xff0c;微软发布了 Visual Studio 2019 的发布日期&#xff0c;2019 年 4 月 2 日 Visual Studio 2019 将正式和大家见面&#xff0c;同时微软还将提供发布现场实时直播。除了 Visual Studio 2019 自身之外&#xff0c;VS 2019 的发布还牵动着很多 C# 开发者的心。虽然…

[蓝桥杯2020国赛]游园安排

题目&#xff1a; 题解&#xff1a; 本质就是求最长上升子序列&#xff0c;只不过这里是字符串版本的&#xff0c;我们都知道有n^2的LIS&#xff0c;但其实还有O(nlogn)版本的&#xff0c;详细看这里&#xff0c;套上就行 另外我发现这里竟然有蓝桥杯全套的编程题离谱&#xf…

洛谷P2761:软件补丁问题(状压、分层图最短路)

当遇到瓶颈时&#xff0c;想想自己是否做了可以优化的无用功。 解析 不难想到状压最短路的做法。 但是直接加边的话边数会是 O(m2n)O(m2^n)O(m2n) 级别&#xff0c;只有 909090 分&#xff0c;难以通过。 注意到&#xff0c;由于补丁很少&#xff0c;真正能达到的状态是很有限…

[2020-09-11 CQBZ/HSZX多校联测 T3] 万猪拱塔(线段树+巧妙转化)

万猪拱塔descriptionsolutioncodedescription 题目描述 小七养了很多头猪&#xff0c;它们分布在 n 行 m 列中&#xff0c;其中第 i 行第 j 列的猪圈养的是第 wi,jw_{i,j}wi,j​ 种猪。 小七有时会选择一个子矩形范围内的猪圈进行巡视&#xff0c;如果该子矩形包含 i 行 j 列 …

重新解读DDD领域驱动设计(一)

回顾十年前&#xff0c;还未踏入某校时&#xff0c;便听闻某学长一毕业就入职北京某公司&#xff0c;月薪过万。对于一个名不见经传的小学院&#xff0c;一毕业能拿到这个薪水还是非常厉害的。听闻他学生期间参与开发了一款股票软件&#xff0c;股票那时正迎来一波疯涨。时也运…

Tickets HDU - 1260

Tickets HDU - 1260 题意&#xff1a; 著名的宫崎骏动画片《千与千寻》在中传1500报重映&#xff0c;中传学子有幸成为全国第一批观众。动画学院学生会负责给大家发票&#xff0c;所有的中传同学只要把中传首映《千与千寻》的推送信息发到朋友圈并集够10个赞&#xff0c;就可…

洛谷P3357:最长k可重线段集问题(网络流)

解析 本题的建模方法有很多&#xff0c;我的做法是补集思想转化成志愿者招募然后按照那道题的做法直接做&#xff0c;看题解更多是采用的对于不冲突的线段首尾加边的做法。 在前一道最长k可重区间问题中这两种做法谈不上孰优孰劣&#xff0c;但本题中题解的做法在处理垂直线段…

程序员修神之路--高并发优雅的做限流(有福利)

点击上方蓝色字体&#xff0c;关注我们菜菜哥&#xff0c;有时间吗&#xff1f;YY妹&#xff0c;什么事&#xff1f;我最近的任务是做个小的秒杀活动&#xff0c;我怕把后端接口压垮&#xff0c;X总说这可关系到公司的存亡简单呀&#xff0c;你就做个限流呗这个没做过呀&#x…

BZOj #4771. 七彩树(主席树+dfn序+lca)

BZOj #4771. 七彩树descriptionsolutioncodedescription 给定一棵n个点的有根树&#xff0c;编号依次为1到n&#xff0c;其中1号点是根节点。每个节点都被染上了某一种颜色&#xff0c;其中第i个节点的颜色为c[i]。如果c[i]c[j]&#xff0c;那么我们认为点i和点j拥有相同的颜色…

免费馅饼 HDU - 1176

免费馅饼 HDU - 1176 题意&#xff1a; 都说天上不会掉馅饼&#xff0c;但有一天gameboy正走在回家的小径上&#xff0c;忽然天上掉下大把大把的馅饼。说来gameboy的人品实在是太好了&#xff0c;这馅饼别处都不掉&#xff0c;就掉落在他身旁的10米范围内。馅饼如果掉在了地上…

CF1631F:Flipping Range(dp)

解析 设 x,y∈B,x<yx,y\in B,x<yx,y∈B,x<y&#xff0c;那么也有 x−y∈Bx-y\in Bx−y∈B。 递归下去&#xff0c;根据辗转相减求 gcd⁡\gcdgcd 的方法可知&#xff0c;最终会得到 gcd⁡(x,y)\gcd(x,y)gcd(x,y)。 那么对于整个集合 BBB &#xff0c;它也就等价于所有…

微软 HoloLens 2 正式登场!让你看看什么叫真正的黑科技

北京时间 2 月 25 日凌晨消息&#xff0c;微软在 MWC19 举行新品发布会&#xff0c;正式发布了万众期待的 HoloLens 2 等产品。▲ 认识全新的 Microsoft HoloLens 2微软 HoloLens 全息眼镜是微软推出的一款头戴式混合现实装置&#xff0c;可以完全独立使用&#xff0c;无需线缆…