离线乱搞。。。

也就是一个线段树合并没什么

  1. #include<algorithm>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<cstdio>
  5. using namespace std;
  6. int n,m,q,tot,cnt,num,h[100001],a[100001],ans[500001],fa[100001],root[100001];
  7. struct edge{
  8. int u,v,cost;
  9. bool operator < (const edge &b) const{
  10. return cost<b.cost;
  11. }
  12. }e[500001];
  13. struct Que{
  14. int id,v,x,k;
  15. bool operator < (const Que &b) const{
  16. return x<b.x;
  17. }
  18. }que[500001];
  19. struct node{
  20. int lch,rch,siz;
  21. }tree[2000001];
  22. int find(int x){
  23. if(fa[x]==x)return x;
  24. return fa[x]=find(fa[x]);
  25. }
  26. void insert(int o,int l,int r,int x){
  27. tree[o].siz++;
  28. if(l==r)return;
  29. int mid=(l+r)>>1;
  30. if(x<=mid){
  31. if(!tree[o].lch)tree[o].lch=++num;
  32. insert(tree[o].lch,l,mid,x);
  33. }
  34. if(x>mid){
  35. if(!tree[o].rch)tree[o].rch=++num;
  36. insert(tree[o].rch,mid+1,r,x);
  37. }
  38. }
  39. int query(int o,int l,int r,int k){
  40. if(k<=0 or k>tree[o].siz)return -1;
  41. if(l==r)return l;
  42. int mid=(l+r)>>1;
  43. if(k<=tree[tree[o].lch].siz)return query(tree[o].lch,l,mid,k);
  44. return query(tree[o].rch,mid+1,r,k-tree[tree[o].lch].siz);
  45. }
  46. int merge(int x,int y){
  47. if(!x or !y)return x+y;
  48. tree[x].siz+=tree[y].siz;
  49. tree[x].lch=merge(tree[x].lch,tree[y].lch);tree[x].rch=merge(tree[x].rch,tree[y].rch);
  50. return x;
  51. }
  52. int main(){
  53. scanf("%d%d%d",&n,&m,&q);
  54. for(int i=1;i<=n;i++){
  55. scanf("%d",&h[i]);
  56. a[i]=h[i];fa[i]=i;
  57. }
  58. sort(a+1,a+n+1);
  59. for(int i=1;i<=n;i++)h[i]=lower_bound(a+1,a+n+1,h[i])-a;
  60. for(int i=1;i<=m;i++){
  61. scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].cost);
  62. }
  63. sort(e+1,e+m+1);
  64. for(int i=1;i<=q;i++){
  65. scanf("%d%d%d",&que[i].v,&que[i].x,&que[i].k);que[i].id=i;
  66. }
  67. for(int i=1;i<=n;i++){
  68. fa[i]=i;
  69. root[i]=++num;
  70. insert(root[i],1,n,h[i]);
  71. }
  72. sort(que+1,que+q+1);
  73. for(int i=1;i<=q;i++){
  74. while(cnt<m and e[cnt+1].cost<=que[i].x){
  75. int fx=find(e[++cnt].u);
  76. int fy=find(e[cnt].v);
  77. if(fx==fy)continue;
  78. fa[fx]=fy;
  79. root[fy]=merge(root[fx],root[fy]);
  80. }
  81. int rot=root[find(que[i].v)],ret=query(rot,1,n,tree[rot].siz-que[i].k+1);
  82. ans[que[i].id]=~ret?a[ret]:ret;
  83. }
  84. for(int i=1;i<=q;i++){
  85. printf("%d\n",ans[i]);
  86. }
  87. return 0;
  88. }

bzoj3545 Peaks 线段树合并的更多相关文章

  1. Peaks 线段树合并

    Peaks 线段树合并 \(n\)个带权值\(h_i\)山峰,有\(m\)条山峰间双向道路,\(q\)组询问,问从\(v_i\)开始只经过\(h_i\le x\)的路径所能到达的山峰中第\(k\)高的 ...

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

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

  3. BZOJ.3545.[ONTAK2010]Peaks(线段树合并)

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

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

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

  5. [BZOJ3545] [ONTAK2010]Peaks(线段树合并 + 离散化)

    传送门 由于困难值小于等于x这个很恶心,可以离线处理,将边权,和询问时的x排序. 每到一个询问的时候,将边权小于等于x的都合并起来再询问. .. 有重复元素的线段树合并的时间复杂度是nlog^2n # ...

  6. BZOJ3545 Peaks 离线处理+线段树合并

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

  7. 线段树合并&&启发式合并笔记

    这俩东西听起来很高端,实际上很好写,应用也很多~ 线段树合并 线段树合并,顾名思义,就是建立一棵新的线段树保存原有的两颗线段树的信息. 考虑如何合并,对于一个结点,如果两颗线段树都有此位置的结点,则直 ...

  8. [XJOI NOI2015模拟题13] C 白黑树 【线段树合并】

    题目链接:XJOI - NOI2015-13 - C 题目分析 使用神奇的线段树合并在 O(nlogn) 的时间复杂度内解决这道题目. 对树上的每个点都建立一棵线段树,key是时间(即第几次操作),动 ...

  9. [BZOJ 2212] [Poi2011] Tree Rotations 【线段树合并】

    题目链接:BZOJ - 2212 题目分析 子树 x 内的逆序对个数为 :x 左子树内的逆序对个数 + x 右子树内的逆序对个数 + 跨越 x 左子树与右子树的逆序对. 左右子树内部的逆序对与是否交换 ...

随机推荐

  1. SQL Server 编程入门

    一.T—SQL 的组成 1.DML(数据操作语言 Data Manipulation Language) 查询.插入.删除和修改数据库中的数据.SELECT.INSERT.UPDATE.DELETE ...

  2. iOS---小经验分享

    1.字符串在block中得赋值 定义一个全局变量,<字符串>当这个字符串用copy修饰的时候,然后再在block中赋值,当在block块之外访问时,不能得到字符创的值.此时字符串应该设置为 ...

  3. 【PostgreSQL-9.6.3】一般视图

    PG视图分为两种,一种是物化视图,一种是一般视图.本篇文章主要写一般视图哪些事儿.所谓一般视图,通俗点说,就是由查询语句定义的虚拟表.视图中的数据可能来自一张或多张表. 1. 视图创建语句 CREAT ...

  4. servlet 生命周期 与 初始化

    一. 生命周期 Servlet 通过调用 init () 方法进行初始化. Servlet 调用 service() 方法来处理客户端的请求. Servlet 通过调用 destroy() 方法终止( ...

  5. 程序员容易忽略的SQL Server错误集锦

    1.大小写 大写T-SQL 语言的所有关键字都使用大写,规范要求. 2.使用“;” 使用“;”作为 Transact-SQL 语句终止符.虽然分号不是必需的,但使用它是一种好的习惯,对于合并操作MER ...

  6. OpenFlow_tutorial_2_Install_Required_Software

    一.Required Software 我操作系统用的 ubuntu 18.04.vm image的OS是ubuntu14.04,这两个系统的GUI应该已经不兼容了,如果使用ubuntu18.04的主 ...

  7. Ubuntu16.04 python3.4.3升级到python3.7.1

    python有两个版本,一个2版本,使用的是python:另一个是3版本,使用的是python3. 简易安装python后得到的3版本的版本号是python3.4.3. 可以使用下面的命令查看py版本 ...

  8. Solaris 默认Shell 修改

    ssh登陆远程的solaris 10,backspace出现乱码. ssh登陆远程的solaris 10默认Shell不是bash 把solaris10的shell环境改为bash就行 dev13% ...

  9. Mysql读写分离与主从数据库设置方案

    Mysql读写分离与主从数据库设置方案 亿仁网 18-10-0711:31 Mysql无非四个功能:增,删,改,读.而将增删改和读分离操作.这样有利于提高系统性能.下面是非常直观的操作: 1.配置: ...

  10. 面试之JVM

    目录 Java虚拟机 类的加载方式 Java内存模型 程序计数器(PC) Java虚拟机栈(Stack) 本地方法栈 元空间(MetaSpace) Java堆(Heap) 内存分配策略 垃圾回收(GC ...