给定一个无向图,点有点权边有边权

Q次询问,每次询问从点v开始只经过边权<=x的边能到达所有点中点权第k大值,无解输出-1

N<=1e5,M,Q<=5e5

建立大根kruskal重构树,每次在重构树上倍增跳父亲,跳到最浅的边权<=x的父亲

将kruskal所有叶子节点按照dfn的顺序建立一个序列,然后每次查询相当于序列区间第k大,显然可以用主席树维护

代码里为了方便只给叶子节点赋了dfn,kruskal重构树每个节点记录dfn表示他所有儿子中dfn的最小的那个,记录sz表示叶子数量

然后代码写得乱七八糟凑合着看吧

注意kruskal重构树倍增范围是所有的节点(2*n-1)不是n!!!

#include <bits/stdc++.h>
using namespace std; struct edge
{
int u, v, w;
} a[500010]; int n, m, q;
int h[200010], dfn[200010], dfntot;
int fa[200010][19], ds[200010], lch[200010], rch[200010], sz[200010], tmp[200010];
int val[100010];
int disc[100010]; int sb;
int root[100010]; int tree[8000010], l[8000010], r[8000010], tot; int build_tree(int cl, int cr)
{
tree[++tot] = 0;
if (cl < cr)
{
int mid = (cl + cr) / 2;
l[tot] = build_tree(cl, mid);
r[tot] = build_tree(mid + 1, cr);
}
return tot;
} int newtree(int oldtree, int cl, int cr, int key)
{
int p = ++tot;
l[p] = l[oldtree];
r[p] = r[oldtree];
tree[p] = tree[oldtree] + 1;
if (cl < cr)
{
if (key > (cl + cr) / 2)
r[p] = newtree(r[oldtree], (cl + cr) / 2 + 1, cr, key);
else
l[p] = newtree(l[oldtree], cl, (cl + cr) / 2, key);
}
return p;
} int query(int tree2, int tree1, int cl, int cr, int key)
{
if (cl >= cr)
return cl;
int sz = tree[l[tree2]] - tree[l[tree1]];
if (sz >= key)
return query(l[tree2], l[tree1], cl, (cl + cr) / 2, key);
else
return query(r[tree2], r[tree1], (cl + cr) / 2 + 1, cr, key - sz);
} void jianshu()
{
root[0] = build_tree(1, sb);
for (int i = 1; i <= n; i++)
root[i] = newtree(root[i - 1], 1, sb, val[i]);
} int kth(int l, int r, int k)
{
return query(root[r], root[l - 1], 1, sb, r - l + 2 - k);
return 233;
} int getf(int x)
{
return ds[x] == x ? x : ds[x] = getf(ds[x]);
} void dfs(int x)
{
if (x <= n)
{
dfn[x] = ++dfntot;
sz[x] = 1;
val[dfn[x]] = h[x];
return;
}
dfs(lch[x]);
dfs(rch[x]);
dfn[x] = dfn[lch[x]];
sz[x] = sz[lch[x]] + sz[rch[x]];
} int main()
{
scanf("%d%d%d", &n, &m, &q);
for (int i = 1; i <= n; i++)
scanf("%d", &h[i]);
for (int i = 1; i <= m; i++)
scanf("%d%d%d", &a[i].u, &a[i].v, &a[i].w);
sort(a + 1, a + 1 + m, [](const edge &a, const edge &b) {return a.w < b.w;});
for (int i = 1; i <= n; i++)
ds[i] = i;
int tot = n;
for (int i = 1; i <= m; i++)
{
if (getf(a[i].u) != getf(a[i].v))
{
int p = ++tot, p1 = getf(a[i].u), p2 = getf(a[i].v);
tmp[p] = a[i].w;
ds[p1] = ds[p2] = ds[p] = p;
fa[p1][0] = fa[p2][0] = p;
lch[p] = p1;
rch[p] = p2;
}
}
dfs(tot);
for (int j = 1; j <= 18; j++)
for (int i = 1; i <= tot; i++)
fa[i][j] = fa[fa[i][j - 1]][j - 1];
// for (int i = 1; i <= n; i++)
// printf("%d%c", val[i], i == n ? '\n' : ' ');
tmp[0] = 0x3f3f3f3f;
for (int i = 1; i <= n; i++)
disc[i] = val[i];
sort(disc + 1, disc + 1 + n);
sb = unique(disc + 1, disc + 1 + n) - disc - 1;
for (int i = 1; i <= n; i++)
val[i] = lower_bound(disc + 1, disc + 1 + sb, val[i]) - disc;
// for (int i = 1; i <= n; i++)
// printf("%d%c", val[i], i == n ? '\n' : ' ');
jianshu();
for(int i = 1; i <= q; i++)
{
int v, x, k;
scanf("%d%d%d", &v, &x, &k);
for (int j = 18; j >= 0; j--)
if (tmp[fa[v][j]] <= x)
v = fa[v][j];
if (sz[v] < k)
puts("-1");
else
printf("%d\n", disc[kth(dfn[v], dfn[v] + sz[v] - 1, k)]);
}
return 0;
}

peaks的更多相关文章

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

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

  2. *[codility]Peaks

    https://codility.com/demo/take-sample-test/peaks http://blog.csdn.net/caopengcs/article/details/1749 ...

  3. Clustering by density peaks and distance

    这次介绍的是Alex和Alessandro于2014年发表在的Science上的一篇关于聚类的文章[13],该文章的基本思想很简单,但是其聚类效果却兼具了谱聚类(Spectral Clustering ...

  4. Science论文"Clustering by fast search and find of density peaks"学习笔记

    "Clustering by fast search and find of density peaks"是今年6月份在<Science>期刊上发表的的一篇论文,论文中 ...

  5. bzoj 3545&&3551: [ONTAK2010]Peaks &&加强版 平衡树&&并查集合并树&&主席树

    3545: [ONTAK2010]Peaks Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 635  Solved: 177[Submit][Stat ...

  6. BZOJ 3545: [ONTAK2010]Peaks( BST + 启发式合并 + 并查集 )

    这道题很好想, 离线, 按询问的x排序从小到大, 然后用并查集维护连通性, 用平衡树维护连通块的山的权值, 合并就用启发式合并.时间复杂度的话, 排序是O(mlogm + qlogq), 启发式合并是 ...

  7. bzoj 3551: [ONTAK2010]Peaks加强版

    Description [题目描述]同3545 Input 第一行三个数N,M,Q. 第二行N个数,第i个数为h_i 接下来M行,每行3个数a b c,表示从a到b有一条困难值为c的双向路径. 接下来 ...

  8. BZOJ 3551: [ONTAK2010]Peaks加强版 [Kruskal重构树 dfs序 主席树]

    3551: [ONTAK2010]Peaks加强版 题意:带权图,多组询问与一个点通过边权\(\le lim\)的边连通的点中点权k大值,强制在线 PoPoQQQ大爷题解传送门 说一下感受: 容易发现 ...

  9. BZOJ 3545: [ONTAK2010]Peaks [Splay启发式合并]

    3545: [ONTAK2010]Peaks 题意:带权图,多组询问与一个点通过边权\(\le x\)的边连通的点中点权k大值 又读错题了,输出点一直WA,问的是点权啊 本题加强版强制在线了,那这道题 ...

  10. bzoj3545: [ONTAK2010]Peaks 重构树 主席树

    题目链接 bzoj3545: [ONTAK2010]Peaks 题解 套路重构树上主席树 代码 #include<cstdio> #include<algorithm> #de ...

随机推荐

  1. javascript——对象的概念——函数 1 (函数对象的属性和方法)

    一.创建函数 函数是一种对象:Function类 是对象,可以通过 Function 实例化一个函数,不过最多的还是利用 function 来创建函数. 方式一:利用 Function类 来实例化函数 ...

  2. Ok6410裸机驱动学习(三)C语言内嵌汇编

    1.C语言内嵌汇编使用方法 C内嵌汇编以关键字”_asm_或asm开始,下辖4个部分,各部分之间用“:”分开,第一部分是必须写的,后面3个部分可以省略,但是分号:不能省略 优化后的代码 2.汇编程序框 ...

  3. Android常用开源库集合【持续更新】

    1.FastJson  阿里巴巴工程师做的一个方便的JSON转换库 2.ButterKnife 只要作用能代替代码中大量的findviewbyid语句的使用,使用@injectview注入方式 3.v ...

  4. day70-oracle 12-Java调用存储过程和存储函数

    我们现在调用的是存储过程和存储函数.用CallableSatement调用存储函数和存储过程. RDBMS:关系数据库.使用标准方式调用存储过程.也就是说:在mysql中调用和在oracle中调用的写 ...

  5. SSM项目连接远程Linux服务器的mysql 启动tomcat卡在了 Initializing Spring root WebApplicationContext

    网上查了原因, linux下mysql访问速度缓慢并且ssh连接缓慢的原因 解决办法: 1.linux ssh连接慢 最近发现ssh连接的时候却很慢,ping的速度非常好,让人误以为是ssh连接不上. ...

  6. Spring集成MyBatis01 【推荐使用】、springMVC中文乱码和json转换问题

    1 导包 1.1 spring-webmvc : spring框架包(当然里面也包含springmvc) 1.2 mybatis : mybatis框架包 1.3 mybatis-spring : s ...

  7. revit导出模型数据到sqlserver数据库

    revit软件可以导出模型数据到sqlserver数据库,有时候,为了对模型做数据分析,需要导出模型的数据,下面总结一下导出过程: 首先在sqlserver中建立一个数据库,如:revit_wujin ...

  8. GCC 版本与C11标准

    1. GCC版本是否支持C11 C89=C90:gcc选项是:-ansi, -std=c90 or -std=iso9899:; 带了GNU扩展的:-std=gnu90 C94=C95:gcc选项:- ...

  9. java中方法的控制修饰符也分为:可访问控制符和非访问控制符两类。

    3 .方法的控制修饰符也分为:可访问控制符和非访问控制符两类. 可访问控制符有 4 种:公共访问控制符: public :私有访问控制符: private :保护访问控制符: protected :私 ...

  10. TinkerPop中的遍历:图的遍历策略

    遍历策略 一个TraversalStrategy分析一个遍历,如果遍历符合它的标准,可以相应地改变它.遍历策略在编译时被执行,并构成Gremlin遍历机的编译器的基础.有五类策略分列如下: decor ...