题目链接

bzoj3545: [ONTAK2010]Peaks

题解

套路重构树上主席树

代码

#include<cstdio>
#include<algorithm>
#define gc getchar
#define pc putchar
inline int read() {
int x = 0,f = 1;
char c = getchar();
while(c < '0' || c > '9') { if(c == '-')f = -1; c = gc(); }
while(c <= '9' && c >= '0') x = x * 10 + c - '0',c = gc();
return x * f;
}
void print(int x) {
if(x < 0) {
pc('-');
x = -x;
}
if(x >= 10) print(x / 10);
pc(x % 10 + '0');
}
int n,m,q;
const int maxn = 500007;
int h[maxn];
struct node {
int u,v,w,next;
} e[maxn],edge[maxn];
int num = 0,head[maxn];
inline void add_edge(int u,int v) {
edge[++ num].v = v; edge[num].next = head[u],head[u] = num;
}
inline bool cmp(node a,node b) {
return a.w < b.w;
}
int fa[maxn];
int dad[maxn][23],mn[maxn];
int tot = 0;
int L[maxn],R[maxn];
int rt[maxn];
int lin[maxn],cnt = 0;
void dfs(int x) {
L[x] = 0x3f3f3f3f;
R[x] = 0;
if(!head[x]) {
lin[++ cnt] = x;
L[x] = R[x] = cnt;
return;
}
for(int i = head[x];i ;i = edge[i].next) {
int v = edge[i].v;
dfs(v);
L[x] = std::min(L[v],L[x]);
R[x] = std::max(R[v],R[x]);
}
} int b[maxn];
int sum = 0;
struct Cmt {
int ls[100000 * 20],rs[100000 * 20],siz[100000 * 20];
void insert(int px,int &x,int l,int r,int k) {
x = ++ sum;
siz[x] = siz[px] + 1;
if(l == r) return;
ls[x] = ls[px], rs[x] = rs[px];
int mid = l + r >> 1;
if(k <= mid) insert(ls[px],ls[x],l,mid,k);
else insert(rs[px],rs[x],mid + 1,r,k);
}
int query(int lx,int rx,int l,int r,int k) {
if(l == r) return l;
int mid = l + r >> 1, tmp = siz[rs[rx]] - siz[rs[lx]];
if(tmp >= k) return query(rs[lx],rs[rx],mid + 1,r,k);
else return query(ls[lx],ls[rx],l,mid,k - tmp);
}
} t;
int get(int x,int val) {
for(int i = 20;i >= 0;-- i)
if(mn[dad[x][i]] <= val)
x = dad[x][i];
return x;
}
int find(int x) {
if(fa[x] != x) fa[x] = find(fa[x]);
return fa[x];
}
int main() {
mn[0] = 0x3f3f3f3f;
n = read(); m = read(); q = read();
for(int i = 1;i <= n;++ i) b[i] = h[i] = read();
std::sort(b + 1,b + n + 1);
int len = std::unique(b + 1,b + n + 1) - b - 1; for(int i = 1;i <= n;++ i) h[i] = std::lower_bound(b + 1,b + len + 1,h[i]) - b; for(int i = 1;i <= m;++ i)
e[i].u = read(),e[i].v = read(),e[i].w = read();
tot = n;
for(int i = 1;i <= n;++ i) fa[i] = i;
std::sort(e + 1,e + m + 1,cmp);
int nnn = 0;
for(int i = 1;i <= m;++ i) {
int u = e[i].u,v = e[i].v;
int fu = find(u),fv = find(v);
if(fu != fv) {
++ tot;
dad[fu][0] = tot;
dad[fv][0] = tot;
add_edge(tot,fu);
add_edge(tot,fv);
fa[fu] = tot;
fa[fv] = tot;
fa[tot] = tot;
mn[tot] = e[i].w;
nnn ++;
}
if(nnn == n - 1) break;
}
for(int i = 1;i <= 20;++ i)
for(int j = 1;j <= tot; ++ j)
dad[j][i] = dad[dad[j][i - 1]][i - 1];
//print(dad[15][0]);
dfs(tot);
for(int i = 1;i <= cnt;++ i)
t.insert(rt[i - 1],rt[i],1,len,h[lin[i]]);
for(int i = 1;i <= q;++ i) {
int v = read(),x = read(),k = read();
int p = v;
v = get(v,x);
if(R[v] - L[v] + 1 < k) puts("-1");
else print(b[t.query(rt[L[v] - 1],rt[R[v]],1,len,k)]),pc('\n');
}
return 0;
}
/* */

bzoj3545: [ONTAK2010]Peaks 重构树 主席树的更多相关文章

  1. luoguP4197:Peaks(Kruskal重构树+主席树)或者(点分树+离线)

    题意:有N座山,M条道路.山有山高,路有困难值(即点权和边权).现在Q次询问,每次给出(v,p),让求从v出发,只能结果边权<=p的边,问能够到达的山中,第K高的高度(从大到小排序). 思路:显 ...

  2. BZOJ3545&3551[ONTAK2010]Peaks——kruskal重构树+主席树+dfs序+树上倍增

    题目描述 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点v开始只 ...

  3. 【BZOJ3551】【BZOJ3545】 【ONTAK2010】 Peaks (kruskal重构树+主席树)

    Description ​ 在\(Bytemountains\)有\(~n~\)座山峰,每座山峰有他的高度\(~h_i~\). 有些山峰之间有双向道路相连,共\(~m~\)条路径,每条路径有一个困难值 ...

  4. 【BZOJ-3545&3551】Peaks&加强版 Kruskal重构树 + 主席树 + DFS序 + 倍增

    3545: [ONTAK2010]Peaks Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1202  Solved: 321[Submit][Sta ...

  5. [BZOJ3551][ONTAK2010]Peaks(加强版)(Kruskal重构树,主席树)

    3551: [ONTAK2010]Peaks加强版 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2438  Solved: 763[Submit][ ...

  6. 【BZOJ3545】Peaks(Kruskal重构树 主席树)

    题目链接 大意 给出有\(N\)个点\(M\)条边的一张图,其中每个点都有一个High值,每条边都有一个Hard值. 再给出\(Q\)个询问:\(v\) \(x\) \(k\) 每次询问查询从点\(v ...

  7. BZOJ.3551.[ONTAK2010]Peaks加强版(Kruskal重构树 主席树)

    题目链接 \(Description\) 有n个座山,其高度为hi.有m条带权双向边连接某些山.多次询问,每次询问从v出发 只经过边权<=x的边 所能到达的山中,第K高的是多少. 强制在线. \ ...

  8. luogu4197 Peaks (kruskal重构树+主席树)

    按照边权排序建出kruskal重构树,每次就变成了先找一个权值<=x的最远的祖先,然后看这个子树的第k小.离散化一下,在dfs序上做主席树即可 而且只需要建叶节点的主席树 注意输出的是第k小点的 ...

  9. 洛谷P4197 Peaks&&克鲁斯卡尔重构树学习笔记(克鲁斯卡尔重构树+主席树)

    传送门 据说离线做法是主席树上树+启发式合并(然而我并不会) 据说bzoj上有强制在线版本只能用克鲁斯卡尔重构树,那就好好讲一下好了 这里先感谢LadyLex大佬的博客->这里 克鲁斯卡尔重构树 ...

随机推荐

  1. 调用链系列一、Zipkin架构介绍、Springboot集承(springmvc,HttpClient)调用链跟踪、Zipkin UI详解

    1.Zipkin是什么 Zipkin分布式跟踪系统:它可以帮助收集时间数据,解决在microservice架构下的延迟问题:它管理这些数据的收集和查找:Zipkin的设计是基于谷歌的Google Da ...

  2. oracle ip 改为 机器名

    1 hosts文件 添加                   ip  机器名   这一行 2 修改listner.ora 和tnsora.ora ip改为机器名 3 重启服务

  3. 006_ssl监测及评分

    https://testssl.sh/ 一. https://www.ssllabs.com/ssltest/analyze.html?d=jyall.com 监测下jyll.com,不忍直视啊! 二 ...

  4. [转]CentOS7 下安装svn

    1. 安装 centos(我这里使用的是CentOS7)下yum命令即可方便的完成安装 $ sudo yum install subversion 测试安装是否成功: $ svnserve --ver ...

  5. scanf的一个问题(暂未解决)

    如下代码,没有按照预想的那样运行: int a; char b; printf("input a integer\n"); scanf("%d", &a ...

  6. 《LINQ技术详解C#》-5.非延迟操作符

    1.转换操作符 1.ToArray 从一个类型为T的输入序列创建一个类型为T的数组. 2.ToList 从一个类型为T的序列创建一个类型为T的列表. 3.ToDictionary 从类型为T的序列创建 ...

  7. Android strings.xml中定义字符串显示空格

    <string name="str">字 符 串</string> 其中   就表示空格.如果直接在里面键入空格,无论多少空格都只会显示一个. 用的XML转 ...

  8. Spring之对象依赖关系(依赖注入Dependency Injection)

    承接上篇: Spring中,如何给对象的属性赋值: 1:通过构造函数,如下所示: <!-- 1:构造函数赋初始值 --><bean id="user1" clas ...

  9. Rookey.Frame v1.0快速开发平台-整体介绍

    Rookey.Frame v1.0是一套基于.NET MVC的极速开发框架,支持简单逻辑模块零代码编程.支持二次开发,具有高扩展性.高复用性.高伸缩性. 框架特点 (1)简单逻辑模块实现零代码编程,通 ...

  10. C# 收发和处理自定义的WINDOWS消息

    C# 发送.接收和处理自定义的WINDOWS消息 转载地址:http://blog.chinaunix.net/uid-24427209-id-2608350.html 为了程序启动后自动执行主函数, ...