线段树合并+离线+启发式合并

半年前这道题t成狗。。。

离线的做法比较好想,按照边的权值排序,询问的权值排序,然后枚举询问不断加边,加到上限后查找第k大值,这里平衡树,权值线段树都可以实现。

那么我们用权值线段树就行了, 并查集维护两点连通性,不连通的话就合并,并查集连接。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N = ;
  4. struct Query {
  5. int v, x, k, id;
  6. bool friend operator < (Query A, Query B)
  7. {
  8. return A.x < B.x;
  9. }
  10. } q[N];
  11. struct edge {
  12. int u, v, w;
  13. bool friend operator < (edge A, edge B)
  14. {
  15. return A.w < B.w;
  16. }
  17. } e[N];
  18. int n, m, Q;
  19. int root[N], h[N], ans[N];
  20. vector<int> vt;
  21. map<int, int> mp;
  22. inline int read()
  23. {
  24. int x = , f = ; char c = getchar();
  25. while(c < '' || c > '') { if(c == '-') f = -; c = getchar(); }
  26. while(c >= '' && c <= '') { x = x * + c - ''; c = getchar(); }
  27. return x * f;
  28. }
  29. namespace seg
  30. {
  31. int cnt;
  32. int lc[N << ], rc[N << ], size[N << ];
  33. void update(int l, int r, int &x, int pos)
  34. {
  35. x = ++cnt;
  36. ++size[x];
  37. if(l == r) return;
  38. int mid = (l + r) >> ;
  39. if(pos <= mid) update(l, mid, lc[x], pos);
  40. else update(mid + , r, rc[x], pos);
  41. }
  42. int merge(int x, int y)
  43. {
  44. if(!x) return y;
  45. if(!y) return x;
  46. size[x] += size[y];
  47. lc[x] = merge(lc[x], lc[y]);
  48. rc[x] = merge(rc[x], rc[y]);
  49. return x;
  50. }
  51. int query(int l, int r, int x, int rank)
  52. {
  53. if(l == r) return l;
  54. int mid = (l + r) >> ;
  55. if(size[rc[x]] >= rank) return query(mid + , r, rc[x], rank);
  56. else return query(l, mid, lc[x], rank - size[rc[x]]);
  57. }
  58. } using namespace seg;
  59. int main()
  60. {
  61. n = read();
  62. m = read();
  63. Q = read();
  64. for(int i = ; i <= n; ++i)
  65. {
  66. h[i] = read();
  67. vt.push_back(h[i]);
  68. }
  69. sort(vt.begin(), vt.end());
  70. vt.erase(unique(vt.begin(), vt.end()), vt.end());
  71. for(int i = ; i <= n; ++i)
  72. {
  73. h[i] = lower_bound(vt.begin(), vt.end(), h[i]) - vt.begin() + ;
  74. update(, n, root[i], h[i]);
  75. }
  76. for(int i = ; i <= m; ++i)
  77. {
  78. e[i].u = read();
  79. e[i].v = read();
  80. e[i].w = read();
  81. }
  82. sort(e + , e + m + );
  83. for(int i = ; i <= Q; ++i)
  84. {
  85. q[i].v = read();
  86. q[i].x = read();
  87. q[i].k = read();
  88. q[i].id = i;
  89. }
  90. sort(q + , q + Q + );
  91. int j = ;
  92. for(int i = ; i <= Q; ++i)
  93. {
  94. while(e[j].w <= q[i].x && j <= m)
  95. {
  96. if(root[e[j].u] != root[e[j].v]) root[e[j].u] = root[e[j].v] = merge(root[e[j].u], root[e[j].v]);
  97. ++j;
  98. }
  99. if(size[root[q[i].v]] < q[i].k) ans[q[i].id] = -;
  100. else ans[q[i].id] = query(, n, root[q[i].v], q[i].k);
  101. }
  102. for(int i = ; i <= Q; ++i) printf("%d\n", ans[i]);
  103. return ;
  104. }

bzoj3545的更多相关文章

  1. [您有新的未分配科技点][BZOJ3545&BZOJ3551]克鲁斯卡尔重构树

    这次我们来搞一个很新奇的知识点:克鲁斯卡尔重构树.它也是一种图,是克鲁斯卡尔算法求最小生成树的升级版首先看下面一个问题:BZOJ3545 Peaks. 在Bytemountains有N座山峰,每座山峰 ...

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

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

  3. BZOJ3545 [ONTAK2010]Peaks kruskal 并查集 主席树 dfs序

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3545 题意概括 Description 在Bytemountains有N座山峰,每座山峰有他的高度 ...

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

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

  5. 【BZOJ3545】 [ONTAK2010]Peaks

    BZOJ3545 [ONTAK2010]Peaks Solution 既然会加强版,直接把强制在线的操作去掉就好了. 代码实现 #include<stdio.h> #include< ...

  6. 【bzoj3545/bzoj3551】[ONTAK2010]Peaks/加强版 Kruskal+树上倍增+Dfs序+主席树

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

  7. bzoj3545 [ONTAK2010]Peaks、bzoj3551 [ONTAK2010]Peaks加强版

    题目描述: bzoj3545,luogu bzoj3551 题解: 重构树+线段树合并. 可以算是板子了吧. 代码(非强制在线): #include<cstdio> #include< ...

  8. 【bzoj3545】[ONTAK2010]Peaks 线段树合并

    [bzoj3545][ONTAK2010]Peaks 2014年8月26日3,1512 Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路 ...

  9. 「BZOJ3545」「ONTAK2010」Peaks

    「BZOJ3545」「ONTAK2010」Peaks 题目传送门 题目大意: 给定一个 \(n\) 个点,\(m\) 条边的带点权边权无向图,有 \(q\) 次询问,每次询问从 \(v\) 点出发,经 ...

  10. bzoj3545/bzoj3551 [ONTAK2010]Peaks/Peaks加强版

    bzoj3545/bzoj3551 [ONTAK2010]Peaks/Peaks加强版 传送门:bzoj  bzoj wdnmd为什么加强版不是权限题原题却是啊 3545: [ONTAK2010]Pe ...

随机推荐

  1. ORACLE索引介绍和使用

    1.什么是索引 索引是建立在表的一列或多个列上的辅助对象,目的是加快访问表中的数据: Oracle存储索引的数据结构是B*树,位图索引也是如此,只不过是叶子节点不同B*数索引: 索引由根节点.分支节点 ...

  2. linux shell学习笔记二---自定义函数(定义、返回值、变量作用域)介绍

    linux shell 可以用户定义函数,然后在shell脚本中可以随便调用.下面说说它的定义方法,以及调用需要注意那些事项. 一.定义shell函数(define function) 语法: [ f ...

  3. Javascript 原型链与constructor

    Javascript中的constructor与prototype 在学习javascript面向对象编程的过程中, constructor和prototype一直让我觉得理解不透,慢慢的学习过程中记 ...

  4. 移动端开发需要加的meta

    移动端开发需要加的meta和常用的css3媒体查询样式,移动开发中头部要加的一些常用meta. <meta name="viewport" content="ini ...

  5. 手写redis的docker文件,通过docker-compose配置redis

    在前面一遍随笔,配置的是mysql主从的docker-compose配置.今天我们来学习配置编排容器redis. 准备环境: docker 18.06.1-ce docker-compose 1.23 ...

  6. ubuntu jdk和tomcat配置

    先查看linux的版通过file /sbin/init命令,下载对应版本的jdk. 我的ubuntu是64位的(桌面系统),所以下载的是jdk-7u71-linux-x64.tar.gz 在home的 ...

  7. loadrunner12 + ie11 无internet, 代码中文乱码

    第一次用lr    录制的时候显示无internet, 在网上找了好久答案, 无非是ie路径设置,还有证书......   都试过了不好用,自己研究一下午 , 最后发现是协议没对应上,http协议  ...

  8. CodeForcesGym 100753K Upside down primes

    Upside down primes Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeForc ...

  9. 【MongoDB】2、安装MongoDB 2.6.1 on Unbuntu 14.04(学习流水账)

    http://blog.csdn.net/stationxp/article/details/26077439 计划: 装一个虚机,ubuntu吧,14.04 Trusty Tahr. 安装Mongo ...

  10. 【BZOJ3238】差异(后缀数组,单调栈)

    题意: 思路:显然len(t[i])+len(t[j])这部分的和是一定的 那么问题就在于如何快速求出两两之间lcp之和 考虑将它们排名后用SA可以很方便的求出lcp,且对答案没有影响,因为形式都是数 ...