题目描述:

bzoj3545luogu

bzoj3551

题解:

重构树+线段树合并。

可以算是板子了吧。

代码(非强制在线):

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. const int N = ;
  6. const int M = *N;
  7. template<typename T>
  8. inline void read(T&x)
  9. {
  10. T f = ,c = ;char ch=getchar();
  11. while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
  12. while(ch>=''&&ch<=''){c=c*+ch-'';ch=getchar();}
  13. x = f*c;
  14. }
  15. int n,m,q,to[N],h[N];
  16. struct Pair
  17. {
  18. int x,y;
  19. }p[N];
  20. bool cmp(Pair a,Pair b){return a.x<b.x;}
  21. struct Edge
  22. {
  23. int x,y,w;
  24. void rd(){read(x),read(y),read(w);}
  25. }d[M];
  26. bool emp(Edge a,Edge b){return a.w<b.w;}
  27. int ff[N<<],fa[N<<][],wg[N<<],ch[N<<][];
  28. int findff(int u){return u==ff[u]?u:ff[u]=findff(ff[u]);}
  29. void kru()
  30. {
  31. wg[] = 0x3f3f3f3f;
  32. for(int i=;i<=(n<<);i++)ff[i] = i;
  33. int tot = n,sum = ;
  34. for(int i=;i<=m&&sum<n-;i++)
  35. {
  36. int x = findff(d[i].x),y = findff(d[i].y);
  37. if(x!=y)
  38. {
  39. ff[x]=ff[y]=fa[x][]=fa[y][]=++tot;
  40. wg[tot]=d[i].w;
  41. sum++;
  42. ch[tot][]=x,ch[tot][]=y;
  43. }
  44. }
  45. }
  46. void init()
  47. {
  48. for(int k=;(<<k)<=(n<<);k++)
  49. for(int i=;i<(n<<);i++)
  50. fa[i][k]=fa[fa[i][k-]][k-];
  51. }
  52. int rt[N<<];
  53. struct segtree
  54. {
  55. int siz[*N],ls[*N],rs[*N],tot;
  56. void insert(int l,int r,int&u,int qx)
  57. {
  58. if(!u)u=++tot;siz[u]++;
  59. if(l==r)return ;
  60. int mid = (l+r)>>;
  61. if(qx<=mid)insert(l,mid,ls[u],qx);
  62. else insert(mid+,r,rs[u],qx);
  63. }
  64. int merge(int x,int y)
  65. {
  66. if(!(x*y))return x+y;
  67. int z = ++tot;
  68. siz[z] = siz[x]+siz[y];
  69. ls[z] = merge(ls[x],ls[y]);
  70. rs[z] = merge(rs[x],rs[y]);
  71. return z;
  72. }
  73. int query(int l,int r,int u,int qk)
  74. {
  75. if(l==r)return l;
  76. int tmp = siz[rs[u]],mid = (l+r)>>;
  77. if(qk<=tmp)return query(mid+,r,rs[u],qk);
  78. else return query(l,mid,ls[u],qk-tmp);
  79. }
  80. }tr;
  81. int main()
  82. {
  83. // freopen("tt.in","r",stdin);
  84. read(n),read(m),read(q);
  85. for(int i=;i<=n;i++)read(p[i].x),p[i].y=i;
  86. sort(p+,p++n,cmp);
  87. for(int las=0x3f3f3f3f,k=,i=;i<=n;i++)
  88. {
  89. if(las!=p[i].x)
  90. {
  91. las = p[i].x;
  92. to[++k] = las;
  93. }
  94. h[p[i].y] = k;
  95. }
  96. for(int i=;i<=m;i++)d[i].rd();
  97. sort(d+,d++m,emp);
  98. kru();init();
  99. for(int i=;i<=n;i++)tr.insert(,n,rt[i],h[i]);
  100. for(int i=n+;i<(n<<);i++)rt[i]=tr.merge(rt[ch[i][]],rt[ch[i][]]);
  101. for(int u,w,k,i=;i<=q;i++)
  102. {
  103. read(u),read(w),read(k);
  104. for(int j=;j>=;j--)if(wg[fa[u][j]]<=w)u=fa[u][j];
  105. if(tr.siz[rt[u]]<k)puts("-1");
  106. else printf("%d\n",to[tr.query(,n,rt[u],k)]);
  107. }
  108. return ;
  109. }

bzoj3545 [ONTAK2010]Peaks、bzoj3551 [ONTAK2010]Peaks加强版的更多相关文章

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

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

  2. 【BZOJ3551】Peaks加强版(Kruskal重构树,主席树)

    [BZOJ3551]Peaks加强版(Kruskal重构树,主席树) 题面 BZOJ Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相 ...

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

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

  4. BZOJ3551 [ONTAK2010]Peaks加强版 kruskal 并查集 主席树 dfs序

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

  5. BZOJ3551: [ONTAK2010]Peaks加强版【Kruskal重构树】【主席树】

    重要的事情说三遍 不保证图联通 不保证图联通 不保证图联通 那些和我一样认为重构树是点数的童鞋是要GG Description [题目描述]同3545 Input 第一行三个数N,M,Q. 第二行N个 ...

  6. BZOJ3551 : [ONTAK2010]Peaks加强版

    首先强制在线的话,肯定是不能再离线排序+平衡树启发式合并了. 这回要用的是线段树合并,每次把两棵线段树合并,总复杂度为$O(n\log n)$ 预处理: 把边按权值从小到大排序,依次加边, 对于边(x ...

  7. 【BZOJ3545&BZOJ3551】Peaks(kruskal重构树,主席树,dfs序)

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

  8. Peaks BZOJ 3545 / Peaks加强版 BZOJ 3551

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

  9. 【BZOJ3551】 [ONTAK2010]Peaks加强版

    BZOJ3551 [ONTAK2010]Peaks加强版 Solution Kruscal重构树后发现可以对于小于的离散化然后倍增+主席树找到上一个的可行解. 然后就可以了. 如果数组开的不好,容易在 ...

随机推荐

  1. perl 安装LOG4perl 模块

    环境信息 ubuntu 12.04 64位 桌面版 Log-Log4perl 的介绍网址:http://search.cpan.org/~mschilli/Log-Log4perl-1.49/lib/ ...

  2. css定位-position

    前言 定位的目的就是把元素摆放到指定的位置. 定位上下文:定位元素的大小,位置都是相对于定位上下文的. position属性值有5个值 static:所有有元素定位默认的初始值都是static.就是不 ...

  3. ZK的选举算法

    一.前言 前面学习了Zookeeper服务端的相关细节,其中对于集群启动而言,很重要的一部分就是Leader选举,接着就开始深入学习Leader选举. 二.Leader选举 2.1 Leader选举概 ...

  4. flask_之URL

    URL篇 在分析路由匹配过程之前,我们先来看看 flask 中,构建这个路由规则的两种方法: 通过 @app.route() decorator 通过 app.add_url_rule,这个方法的签名 ...

  5. CentOS7下使用Docker容器化.net Core 2.2

    一.使用 yum 安装(CentOS 7下) Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker . 通过 una ...

  6. py3.5 telnet的实例(在远程机器上批量创建用户)

    import sysimport telnetlibimport time HOST = ["172.18.217.12","172.18.217.13"]#往 ...

  7. leetcode287 Find the Duplicate Number

    思路: 转换成链表之后使用floyed判环法.转换之后重复的那个数字是唯一一个有多个前驱和一个后继的节点,因此是环的起始节点. 实现: class Solution { public: int fin ...

  8. iOS之创建CocoaPods公有库教程

    简介 在开发过程中,经常会使用到第三框架,我们通过一个pod install命令,很方便的就将第三方框架加到我们自己的项目中. 如果我们也想将自己写的组件或库开源出去,让别人也可以通过pod inst ...

  9. uvm_scoreboard——得分

    scoreboard 是验证平台很重要的一部分,因为,验证就是给激励,然后,检查结果.而scoreboard 就是肩负这检查结果的重任.测试用例能不能过,全由scoreboard说了算. A scor ...

  10. LR中订单流程脚本

    Action(){ /* 主流程:登录->下订单->支付订单->获取订单列表 定义事物 1)登录 2)下订单 3)支付订单 4)获取订单列表 接口为:application/json ...