BZOJ.3545.[ONTAK2010]Peaks(线段树合并)】的更多相关文章

题目链接 \(Description\) 有n个座山,其高度为hi.有m条带权双向边连接某些山.多次询问,每次询问从v出发 只经过边权<=x的边 所能到达的山中,第K高的是多少. \(Solution\) x的限制将图分成了若干连通块,如果x单调递增的话,只需要合并连通块就可以了. 离线,并查集维护所属连通块,线段树合并状态.查询K大.(强制在线的话可以主席树?BZOJ3551 不想写了还是写了,还好) 强制在线的Kruskal+主席树做法:BZOJ3551. //39360kb 5248ms…
[bzoj3545][ONTAK2010]Peaks 2014年8月26日3,1512 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有一条困难…
这道题很好想, 离线, 按询问的x排序从小到大, 然后用并查集维护连通性, 用平衡树维护连通块的山的权值, 合并就用启发式合并.时间复杂度的话, 排序是O(mlogm + qlogq), 启发式合并是O(nlog²n), 询问是O(qlogn). ------------------------------------------------------------------- #include<bits/stdc++.h>   #define rep(i, n) for(int i = 0…
3545: [ONTAK2010]Peaks 题意:带权图,多组询问与一个点通过边权\(\le x\)的边连通的点中点权k大值 又读错题了,输出点一直WA,问的是点权啊 本题加强版强制在线了,那这道题肯定离线啊,边权从小到大加边不就是煞笔提吗 奇怪的是合并的时候先序遍历才行...中序和后序都T了 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> usin…
Peaks 线段树合并 \(n\)个带权值\(h_i\)山峰,有\(m\)条山峰间双向道路,\(q\)组询问,问从\(v_i\)开始只经过\(h_i\le x\)的路径所能到达的山峰中第\(k\)高的山峰,如果无解输出\(-1\) 线段树合并好题.吊打主席树.Kruskal重构树的典范 首先发现可以离线,我们将所有询问按\(x\)排序,随着询问再去加边,这样可以去掉路径上\(h_i\le x\)这一条件使问题极大简化. 然后从\(v_i\)开始能经过的所有山峰可以看做联通块,于是我们愉快地用并查…
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3545 http://www.lydsy.com/JudgeOnline/problem.php?id=3551(同题,强制在线,题解) 题解: 最小生成树 Kruskal,线段树(合并),离线 首先把询问和边放在一起,按权值大小从小到大排序.然后对每个点建一棵权值线段树,维护当前联通块里的海拔权值区间内的山的个数然后按照 Kruskal 算法合并联通块,并且合并两个联通块对应的线段树(Me…
4631: 踩气球 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 265  Solved: 136[Submit][Status][Discuss] Description 六一儿童节到了, SHUXK 被迫陪着M个熊孩子玩一个无聊的游戏:有N个盒子从左到右排成一排,第i个盒子里装着Ai个气球. SHUXK 要进行Q次操作,每次从某一个盒子里拿出一个没被踩爆的气球,然后熊孩子们就会立刻把它踩爆. 这M个熊孩子每个人都指定了一个盒子区间[Li, R…
5457: 城市 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 18  Solved: 12[Submit][Status][Discuss] Description 有n座城市,m个民族.这些城市之间由n-1条道路连接形成了以城市1为根的有根树.每个城市都是某一民族的聚居 地,Master知道第i个城市的民族是A_i,人数是B_i.为了维护稳定,Master需要知道某个区域内人数最多的民族 .他向你提出n个询问,其中第i个询问是:求以i为根的子…
离线乱搞... 也就是一个线段树合并没什么 #include<algorithm> #include<iostream> #include<cstring> #include<cstdio> using namespace std; int n,m,q,tot,cnt,num,h[100001],a[100001],ans[500001],fa[100001],root[100001]; struct edge{ int u,v,cost; bool ope…
Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1124  Solved: 304[Submit][Status][Discuss] Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点v开始只经过困难值小于等于x的路径所能到达的山峰中第k高的山峰,如果无解输出-1. Input 第一行三个数N,…