浅谈线段树合并:https://www.cnblogs.com/AKMer/p/10251001.html

题目传送门:https://lydsy.com/JudgeOnline/problem.php?id=3545

离线,按照权值排序之后就跟[HNOI2012]永无乡一样了。

时间复杂度:\(O(nlogn)\)

空间复杂度:\(O(nlogn)\)

代码如下:

  1. #include <cstdio>
  2. #include <iostream>
  3. #include <algorithm>
  4. using namespace std;
  5. const int maxn=1e5+5,maxm=5e5+5;
  6. int n,m,Q,cnt;
  7. int tmp[maxn],h[maxn];
  8. int fa[maxn],rt[maxn],ans[maxm];
  9. int read() {
  10. int x=0,f=1;char ch=getchar();
  11. for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
  12. for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
  13. return x*f;
  14. }
  15. struct edge {
  16. int a,b,v;
  17. bool operator<(const edge &a)const {
  18. return v<a.v;
  19. }
  20. }e[maxm];
  21. struct Query {
  22. int u,rk,limit,id;
  23. bool operator<(const Query &a)const {
  24. return limit<a.limit;
  25. }
  26. }q[maxm];
  27. int find(int x) {
  28. if(fa[x]==x)return x;
  29. return fa[x]=find(fa[x]);
  30. }
  31. struct segment_tree {
  32. int tot;
  33. int sum[maxn*20],ls[maxn*20],rs[maxn*20];
  34. void change(int &p,int l,int r,int pos) {
  35. p=++tot,sum[p]=1;
  36. if(l==r)return;
  37. int mid=(l+r)>>1;
  38. if(pos<=mid)change(ls[p],l,mid,pos);
  39. else change(rs[p],mid+1,r,pos);
  40. }
  41. int merge(int a,int b) {
  42. if(!a||!b)return a+b;
  43. if(!ls[a]&&!rs[a]&&!ls[b]&&!rs[b]) {
  44. sum[a]+=sum[b];return a;
  45. }
  46. ls[a]=merge(ls[a],ls[b]);
  47. rs[a]=merge(rs[a],rs[b]);
  48. sum[a]=sum[ls[a]]+sum[rs[a]];
  49. return a;
  50. }
  51. int query(int p,int l,int r,int rk) {
  52. if(l==r)return l;
  53. int mid=(l+r)>>1;
  54. if(sum[rs[p]]>=rk)return query(rs[p],mid+1,r,rk);
  55. else return query(ls[p],l,mid,rk-sum[rs[p]]);
  56. }
  57. }T;
  58. int main() {
  59. n=read(),m=read(),Q=read();
  60. for(int i=1;i<=n;i++)
  61. tmp[i]=h[i]=read();
  62. sort(tmp+1,tmp+n+1);
  63. cnt=unique(tmp+1,tmp+n+1)-tmp-1;
  64. for(int i=1;i<=n;i++)
  65. h[i]=lower_bound(tmp+1,tmp+cnt+1,h[i])-tmp;
  66. for(int i=1;i<=m;i++)
  67. e[i].a=read(),e[i].b=read(),e[i].v=read();
  68. for(int i=1;i<=Q;i++)
  69. q[i].u=read(),q[i].limit=read(),q[i].rk=read(),q[i].id=i;
  70. sort(e+1,e+m+1),sort(q+1,q+Q+1);
  71. for(int i=1;i<=n;i++)
  72. fa[i]=i,T.change(rt[i],1,cnt,h[i]);
  73. int st=1;
  74. for(int i=1;i<=Q;i++) {
  75. while(st<=m&&e[st].v<=q[i].limit) {
  76. int a=find(e[st].a),b=find(e[st].b);
  77. if(a!=b)fa[a]=b,rt[b]=T.merge(rt[b],rt[a]);st++;
  78. }
  79. int u=find(q[i].u);
  80. if(T.sum[rt[u]]<q[i].rk)ans[q[i].id]=-1;
  81. else ans[q[i].id]=tmp[T.query(rt[u],1,cnt,q[i].rk)];
  82. }
  83. for(int i=1;i<=Q;i++)
  84. printf("%d\n",ans[i]);
  85. return 0;
  86. }

BZOJ3545:[ONTAK2010]Peaks的更多相关文章

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

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

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

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

  3. 【BZOJ3545】 [ONTAK2010]Peaks

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

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

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

  5. 【BZOJ3551】[ONTAK2010]Peaks加强版 最小生成树+DFS序+主席树

    [BZOJ3545][ONTAK2010]Peaks Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困 ...

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

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

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

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

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

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

  9. [ONTAK2010]Peaks kruskal重构树,主席树

    [ONTAK2010]Peaks kruskal重构树练手题. LG传送门竟然不强制在线?看到离线水过很不爽:B站强制在线版传送门 看到"询问从点\(v\)开始只经过困难值小于等于\(x\) ...

随机推荐

  1. [原创]将本地代码共享到github的操作步骤

    将本地代码共享到github的操作步骤 本地代码目录执行如下命令,初始化为git仓库. git init 到github上新建一个仓库,假设为https://github.com/sky0014/sk ...

  2. 自动更新GeoIP数据库

    #!/bin/bash if [ ! -d /usr/local/share/GeoIP ];then mkdir /usr/local/share/GeoIP fi if [ ! -d /usr/l ...

  3. 【python】-- Socket粘包问题 ,解决粘包的几种方法、socket文件下载,md5值检验

    上一篇随笔:“socket 接收大数据”,在win系统上能够运行,并且解决了大数据量的数据传输出现的问题,但是运行在linux系统上就会出现如下图所示的情况: 就是服务端两次发送给客户端的数据(第一次 ...

  4. 【python】-- 队列(Queue)、生产者消费者模型

    队列(Queue) 在多个线程之间安全的交换数据信息,队列在多线程编程中特别有用 队列的好处: 提高双方的效率,你只需要把数据放到队列中,中间去干别的事情. 完成了程序的解耦性,两者关系依赖性没有不大 ...

  5. Python菜鸟之路:前端HTML基础

    前面的章节中,Python的基本知识已经差不多介绍完了.本节介绍HTML相关的知识.需要着重声明的是,前端知识是非常非常重要的知识,以我实际项目经验来看,一个项目的瓶颈在设计和前端.设计就先不说了,前 ...

  6. QT设置TextEdit颜色

    //设置textEdit颜色 QPalette palette= ui->receiveTextEdit->palette(); palette.setColor(QPalette::Ba ...

  7. linux mount一个硬盘

    我们在使用linux的情况下,难免有时会需要增加一块硬盘,在windows下增加硬盘很简单,所有的操作都是有画面.linux下增加一块硬盘,并且让这块硬盘可以正常的使用,所有的操作都在字符命令行的方式 ...

  8. 33_为应用添加多个Activity与参数传递

    1\ 2\ 3\ 4\ 2 3

  9. 【leetcode刷题笔记】Binary Tree Preorder Traversal

    Given a binary tree, return the preorder traversal of its nodes' values. For example:Given binary tr ...

  10. bigdecimal类型除法问题

    坑:bigdecimal类型做除法运算时,结果为整数或有限小数时候不存在问题,若结果无法整除,为无限小数时报错 错误代码: Bigdecimal  b = a.divide(c).setScale(5 ...