Description

在Bytemountains有N座山峰,每座山峰有他的高度h_i。有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点v开始只经过困难值小于等于x的路径所能到达的山峰中第k高的山峰,如果无解输出-1。

Input

第一行三个数N,M,Q。
第二行N个数,第i个数为h_i
接下来M行,每行3个数a b c,表示从a到b有一条困难值为c的双向路径。
接下来Q行,每行三个数v x k,表示一组询问。

Output

对于每组询问,输出一个整数表示答案。

考虑离线,将边和询问按边权排序,从小到大加入边,平衡树启发式合并维护连通块内点权

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstdlib>
  4. const int M=;
  5. char buf[M+],*ptr=buf-;
  6. inline int _int(){
  7. int x=,c=*++ptr,f=;
  8. while(c>||c<){if(c=='-')f=-;c=*++ptr;}
  9. while(c>&&c<)x=x*+c-,c=*++ptr;
  10. return x;
  11. }
  12. struct edge{
  13. int s,t,l;
  14. }e[];
  15. bool operator<(const edge&a,const edge&b){
  16. return a.l<b.l;
  17. }
  18. struct Q{
  19. int w,mx,k,id;
  20. }qs[];
  21. bool operator<(const Q&a,const Q&b){
  22. return a.mx<b.mx;
  23. }
  24. const int N=;
  25. int n,m,q;
  26. int h[N],ans[];
  27. int ch[N][],sz[N],col[N],rt[N],rnd[N];
  28. int stk[N],stp;
  29. void dfs(int w){
  30. if(!w)return;
  31. dfs(ch[w][]);
  32. stk[stp++]=w;
  33. dfs(ch[w][]);
  34. }
  35. inline void up(int w){
  36. sz[w]=+sz[ch[w][]]+sz[ch[w][]];
  37. }
  38. inline void rot(int&w,int d){
  39. int u=ch[w][d];
  40. ch[w][d]=ch[u][d^];
  41. ch[u][d^]=w;
  42. up(w);
  43. up(w=u);
  44. }
  45. void ins(int&w,int x){
  46. if(!w){
  47. w=x;
  48. return;
  49. }
  50. ++sz[w];
  51. int d=(h[w]<h[x]);
  52. ins(ch[w][d],x);
  53. if(rnd[ch[w][d]]>rnd[w])rot(w,d);
  54. }
  55. int kmax(int w,int k){
  56. if(sz[w]<k||k<=)return -;
  57. --k;
  58. while(){
  59. int s=sz[ch[w][]];
  60. if(s==k)return h[w];
  61. if(s<k){
  62. k-=s+;
  63. w=ch[w][];
  64. }else{
  65. w=ch[w][];
  66. }
  67. }
  68. }
  69. void merge(int x,int y){
  70. x=col[x];y=col[y];
  71. if(x==y)return;
  72. if(sz[rt[x]]<sz[rt[y]]){int z=x;x=y;y=z;}
  73. stp=;
  74. dfs(rt[y]);
  75. for(int i=;i<stp;i++){
  76. int w=stk[i];
  77. col[w]=x;
  78. sz[w]=;
  79. ch[w][]=ch[w][]=;
  80. ins(rt[x],w);
  81. }
  82. }
  83. int main(){
  84. fread(buf,,M,stdin);
  85. srand();
  86. n=_int();m=_int();q=_int();
  87. for(int i=;i<=n;i++){
  88. h[i]=_int();
  89. sz[rt[i]=col[i]=i]=;
  90. rnd[i]=rand();
  91. }
  92. for(int i=;i<m;i++){
  93. e[i].s=_int();
  94. e[i].t=_int();
  95. e[i].l=_int();
  96. }
  97. std::sort(e,e+m);
  98. e[m].l=;
  99. for(int i=;i<q;i++){
  100. qs[i].w=_int();
  101. qs[i].mx=_int();
  102. qs[i].k=_int();
  103. qs[i].id=i;
  104. }
  105. std::sort(qs,qs+q);
  106. for(int i=,p=;i<q;i++){
  107. int mx=qs[i].mx;
  108. while(e[p].l<=mx){
  109. merge(e[p].s,e[p].t);
  110. ++p;
  111. }
  112. ans[qs[i].id]=kmax(rt[col[qs[i].w]],qs[i].k);
  113. }
  114. for(int i=;i<q;i++)printf("%d\n",ans[i]);
  115. return ;
  116. }

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

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

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

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

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

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

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

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

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

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

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

  6. 【BZOJ3545】 [ONTAK2010]Peaks

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

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

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

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

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

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

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

随机推荐

  1. java 中获取文件路径

    方案一: 文件目录如下: 配置文件:firehosetos3sample.properties在src目录下面第一层,与包是一层的 在Getpath_ClassLoader.java类中: Syste ...

  2. java 的复用工具 - jar包

    前言 Java提供了jar包的机制,使得已经开发好了的类能够顺利的被将来的工程所复用. 本章主要讲解如何使用这种工具. 包的作用 包能够将不同功用的类组织起来,从而确保类名的唯一性. 为了保证包名的唯 ...

  3. ion torrent ion proton

    https://www.youtube.com/watch?v=6Is3W7JkFp8 NGS 的视频 说的不错 一个做癌症的教授讲的 Ion Torrent™ next-generation seq ...

  4. Highcharts ajax获取json对象动态生成报表生成 .

    http://blog.csdn.net/wsk7860/article/details/8751061 最近做个项目,项目经理想做一个统计报表,在网上查看些资料就选用Highchars 这里和大家分 ...

  5. sql server中NULL导入decimal字段时报错

    sql server中NULL导入decimal字段时报错 在导入CSV文件时,如果decimal字段为null值,导致文本文件入库时失败. 错误现象 构造例子 新建一张表,包含decimal字段. ...

  6. IIS 7.0 下 httpMoudle 失效的问题

    在web.config里配置了: <system.web> <httpModules>  <add type="DevExpress.Web.ASPxClass ...

  7. PHP新手入门1——表单

    注:本身是Android,Android之前是java.但公司后台PHP特别多.就好奇php后台是怎么通过一个url给我数据的(完全不懂php).于是就学呗.学习系列随笔第一人称是一个Android小 ...

  8. Java字段初始化的规律

    class InitializeBookClass { { field=200; } public int field=100; public InitializeBookClass(int valu ...

  9. Redis是什么?Redis数据库全解?

    Redis是什么 这个问题的结果影响了我们怎么用Redis.如果你认为Redis是一个key value store, 那可能会用它来代替MySQL;如果认为它是一个可以持久化的cache, 可能只是 ...

  10. hadoop常用管理员命令

    hadoop job -list 列出正在运行的job hadoop job -kill kill掉job hadoop fsck 检查HDFS坏快 hadoop dfsadmin -report检查 ...