P4197 Peaks

题目描述

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

输入输出格式

输入格式:

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

输出格式:

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

说明

数据范围

\(N \le 10^5\), \(0 \le M,Q \le 5\times 10^5\),\(h_i,c,x \le 10^9\) 。


恩,顺手学了一下重构树

觉得这篇洛谷日报讲的不错

说一下感受。

还是有点码量的,不太好调,写的时候认真一点,注意空间。


Code:

  1. #include <cstdio>
  2. #include <algorithm>
  3. const int N=1e5+10;
  4. const int M=5e5+10;
  5. int n,m,q,F[N<<1],dfn[N<<1],low[N<<1],dfs_clock,ha[N<<1],f[N<<1][19],poi[N<<1];
  6. int th[N],h[N];
  7. struct node
  8. {
  9. int u,v,w;
  10. bool friend operator <(node n1,node n2){return n1.w<n2.w;}
  11. }e[M];
  12. int Find(int x){return F[x]=F[x]==x?x:Find(F[x]);}
  13. int Next[N<<1],to[N<<1],head[N<<1],cnt;
  14. void add(int u,int v){to[++cnt]=v,Next[cnt]=head[u],head[u]=cnt;}
  15. void dfs(int now)
  16. {
  17. for(int i=1;f[now][i-1];i++) f[now][i]=f[f[now][i-1]][i-1];
  18. dfn[now]=++dfs_clock,ha[dfs_clock]=now;
  19. for(int i=head[now];i;i=Next[i])
  20. dfs(to[i]);
  21. low[now]=dfs_clock;
  22. }
  23. int sum[N*30],ch[N*30][2],root[N<<1],tot;
  24. #define ls ch[now][0]
  25. #define rs ch[now][1]
  26. #define ols ch[las][0]
  27. #define ors ch[las][1]
  28. int rebuild(int las,int l,int r,int pos)
  29. {
  30. int now=++tot,mid=l+r>>1;
  31. if(l==r) return sum[now]=sum[las]+1,now;
  32. if(pos<=mid)
  33. {
  34. ls=rebuild(ols,l,mid,pos);
  35. rs=ors;
  36. }
  37. else
  38. {
  39. ls=ols;
  40. rs=rebuild(ors,mid+1,r,pos);
  41. }
  42. return sum[now]=sum[ls]+sum[rs],now;
  43. }
  44. int query(int now,int las,int l,int r,int k)
  45. {
  46. if(k>sum[now]-sum[las]) return 0;
  47. if(l==r) return l;
  48. int mid=l+r>>1;
  49. if(sum[rs]-sum[ors]>=k)
  50. return query(rs,ors,mid+1,r,k);
  51. else
  52. return query(ls,ols,l,mid,k-sum[rs]+sum[ors]);
  53. }
  54. int find(int v,int x)//v不大于x的点
  55. {
  56. for(int i=18;~i;i--)
  57. if(poi[f[v][i]]<=x)
  58. v=f[v][i];
  59. return v;
  60. }
  61. int main()
  62. {
  63. scanf("%d%d%d",&n,&m,&q);
  64. int n_=n;
  65. for(int i=1;i<=n;i++) scanf("%d",h+i),th[i]=h[i];
  66. for(int i=1;i<=m;i++)
  67. scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
  68. std::sort(e+1,e+1+m);
  69. std::sort(th+1,th+1+n);
  70. int m_=std::unique(th+1,th+1+n)-th-1;
  71. for(int i=1;i<=n;i++) h[i]=std::lower_bound(th+1,th+1+m_,h[i])-th;
  72. th[0]=-1,poi[0]=0x7fffffff;
  73. for(int i=1;i<=n*2;i++) F[i]=i;
  74. for(int i=1;i<=m;i++)
  75. {
  76. int u=e[i].u,v=e[i].v,w=e[i].w;
  77. int rt1=Find(u),rt2=Find(v);
  78. if(rt1==rt2) continue;
  79. F[rt1]=F[rt2]=f[rt1][0]=f[rt2][0]=++n;
  80. add(n,rt1),add(n,rt2);
  81. poi[n]=w;
  82. }
  83. dfs(n);
  84. for(int i=1;i<=dfs_clock;i++)
  85. {
  86. if(ha[i]<=n_)
  87. root[i]=rebuild(root[i-1],1,m_,h[ha[i]]);
  88. else
  89. root[i]=root[i-1];
  90. }
  91. for(int anc,v,x,k,i=1;i<=q;i++)
  92. {
  93. scanf("%d%d%d",&v,&x,&k);
  94. anc=find(v,x);
  95. printf("%d\n",th[query(root[low[anc]],root[dfn[anc]-1],1,m_,k)]);
  96. }
  97. return 0;
  98. }

2018.10.16

BZOJ 3545 / 洛谷 P4197 Peaks 解题报告的更多相关文章

  1. 洛谷 P2058 海港 解题报告

    P2058 海港 题目描述 小K是一个海港的海关工作人员,每天都有许多船只到达海港,船上通常有很多来自不同国家的乘客. 小K对这些到达海港的船只非常感兴趣,他按照时间记录下了到达海港的每一艘船只情况: ...

  2. 洛谷 P3956 棋盘 解题报告

    P3956 棋盘 题目描述 有一个\(m×m\)的棋盘,棋盘上每一个格子可能是红色.黄色或没有任何颜色的.你现在要从棋盘的最左上角走到棋盘的最右下角. 任何一个时刻,你所站在的位置必须是有颜色的(不能 ...

  3. 洛谷 P1979 华容道 解题报告

    P1979 华容道 题目描述 小\(B\)最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面, 华容道是否根本就无法完成,如果能完成, 最少需要多少时 ...

  4. 虔诚的墓主人(BZOJ1227)(洛谷P2154)解题报告

    题目描述 小W是一片新造公墓的管理人.公墓可以看成一块N×M的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地. 当地的居民都是非常虔诚的基督徒,他们愿意提前为自己找一块合适墓地. ...

  5. 洛谷P4197 Peaks&&克鲁斯卡尔重构树学习笔记(克鲁斯卡尔重构树+主席树)

    传送门 据说离线做法是主席树上树+启发式合并(然而我并不会) 据说bzoj上有强制在线版本只能用克鲁斯卡尔重构树,那就好好讲一下好了 这里先感谢LadyLex大佬的博客->这里 克鲁斯卡尔重构树 ...

  6. [luogu P4197] Peaks 解题报告(在线:kruskal重构树+主席树 离线:主席树+线段树合并)

    题目链接: https://www.luogu.org/problemnew/show/P4197 题目: 在Bytemountains有N座山峰,每座山峰有他的高度$h_i$.有些山峰之间有双向道路 ...

  7. 洛谷 P2672 推销员 解题报告

    P2672 推销员 题目描述 阿明是一名推销员,他奉命到螺丝街推销他们公司的产品.螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户.螺丝街一共有N家住户,第i家住户到入口的距离为 ...

  8. 洛谷 P2679 子串 解题报告

    P2679 子串 题目描述 有两个仅包含小写英文字母的字符串\(A\)和\(B\). 现在要从字符串\(A\)中取出\(k\)个互不重叠的非空子串,然后把这\(k\)个子串按照其在字符串\(A\)中出 ...

  9. 洛谷 P1076 寻宝 解题报告

    P1076 寻宝 题目描述 传说很遥远的藏宝楼顶层藏着诱人的宝藏.小明历尽千辛万苦终于找到传说中的这个藏宝楼,藏宝楼的门口竖着一个木板,上面写有几个大字:寻宝说明书.说明书的内容如下: 藏宝楼共有\( ...

随机推荐

  1. Linux之redis主从复制

    redis集群中的数据库复制就是通过主从同步实现的 主节点Master把数据分发给节点Salve 主从同步的好处在高可用, redis节点有冗余设计 redis主从同步的原理 1. 从服务器向主服务器 ...

  2. JavaScript 转载

    JavaScript概述 ECMAScript和JavaScript的关系 1996年11月,JavaScript的创造者--Netscape公司,决定将JavaScript提交给国际标准化组织ECM ...

  3. centos7上部署新版 jumpserver 跳板机服务

    CentOS 7 建议在一个纯净的 centos7上进行下面的安装部署 关闭 selinux 和防火墙 [root@jumpserver ~]# setenforce 0 [root@jumpserv ...

  4. oracle 11g XE 学习版添加scott用户方法全步骤

    安装企业版的orcale是不是太费时费力了?若只是学习用途的话,不妨试试轻便版的XE版本,同样是官网下载的,但是这个安装起来比完整版简便多了. 首先,你得先安装好orcale 11g XE 版本:(这 ...

  5. 15 GIL 全局解释器锁 C语言解决 top ps

    1.GIL 全局解释器锁:保证同一时刻只有一个线程在运行. 什么是全局解释器锁GIL(Global Interpreter Lock) Python代码的执行由Python 虚拟机(也叫解释器主循环, ...

  6. linux mysql root 忘记密码了,完美解决-费元星站长

    修改MySQL的配置文件(默认为/etc/my.cnf),在[mysqld]下添加一行skip-grant-tables   保存配置文件后,重启MySQL服务 service mysqld rest ...

  7. javascript的优美与鸡肋

    --总结来自:<javascript语言精粹> 任何语言都有其优美的地方和其鸡肋的地方.避归一些语言的糟粕,能相应的降低bug出现的几率. 优美处: 函数是头等对象 基于原型继承的动态对象 ...

  8. 一次和别人争吵一个按钮,点击后显示导航;再点击不显示的效果,是否一定以及必须用js?

    事情经过是这样的,我们组一个说话很喜欢用一定,肯定的哥们,吃午饭的时候拿了自己做的一个UI库,头部有一个按钮 点击展开,再次点击收缩,他意思说一个按钮无法记录点击状态,必须使用js.然后我看了一眼,心 ...

  9. 孤荷凌寒自学python第七十天学习并实践beautifulsoup对象用法3

    孤荷凌寒自学python第七十天学习并实践beautifulsoup对象用法3 (完整学习过程屏幕记录视频地址在文末) 今天继续学习beautifulsoup对象的属性与方法等内容. 一.今天进一步了 ...

  10. Java实现网页截屏功能(基于phantomJs)

    公司最近有个需求:把用户第一次的测量身体信息和最近一次测量信息进行对比,并且需要把对比的数据截成图片可以发给用户(需要在不打开网页的情况下实时对网页进行截图然后保存到服务器上,返回图片地址),通过网上 ...