并不敢说完全会了线段树合并,只是至少知道原理写法了。。。还是太菜了,每天被大佬吊锤qwq

我看到的几道线段树合并都是权值线段树的合并。这个算法适用范围应该只是01线段树的。

这两道算入门题了吧。。。

发现粘题面没人看(自己都懒得看),以后粘链接加题意吧。

永无乡

给$n$个没有连边的带权点,动态加边,询问$u$所在连通块权值第$k$大的点是什么。$n \leq 1e5 , q\leq 3e5$

离线永无乡??

给定森林,点有点权有重复!,边有边权。询问$u$所在连通块,只能走边权小于$w$的边,可达的权值第$k$大的点编号!是什么。$n \leq 1e5 , m,q \leq 5e5$ 被坑的巨惨qwq

后面的离线一下,按边权从小到大加进去就和永无乡一样了。

并查集维护连通性,并将两个连通块的权值线段树合并。询问就是在所在连通块线段树二分找。$(O(nlogn))$

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N=;
  4. inline int read(){
  5. int r=,c=getchar();
  6. while(!isdigit(c))c=getchar();
  7. while(isdigit(c))
  8. r=r*+c-'',c=getchar();
  9. return r;
  10. }
  11. int fa[N],rt[N],n,m;
  12. int find(int x){
  13. return x==fa[x]?x:fa[x]=find(fa[x]);
  14. }
  15. struct Node{
  16. int L,R,sum;
  17. }T[N*];
  18. int sz;
  19. #define ls T[o].L
  20. #define rs T[o].R
  21. void pullup(int o){
  22. T[o].sum=T[ls].sum+T[rs].sum;
  23. }
  24. void ins(int &o,int l,int r,int v){
  25. if(!o)o=++sz;
  26. if(l==r){
  27. T[o].sum=;return;
  28. }
  29. int mid=l+r>>;
  30. if(v<=mid)ins(ls,l,mid,v);
  31. else ins(rs,mid+,r,v);
  32. pullup(o);
  33. }
  34. int merge(int x,int y){
  35. if(!x)return y;
  36. if(!y)return x;
  37. T[x].L=merge(T[x].L,T[y].L);
  38. T[x].R=merge(T[x].R,T[y].R);
  39. pullup(x);
  40. return x;
  41. }
  42. int query(int o,int l,int r,int rk){
  43. if(l==r)return l;
  44. int mid=l+r>>;
  45. if(rk<=T[ls].sum)return query(ls,l,mid,rk);
  46. else return query(rs,mid+,r,rk-T[ls].sum);
  47. }
  48. void Link(int x,int y){
  49. int u=find(x),v=find(y);
  50. fa[u]=v;rt[v]=merge(rt[u],rt[v]);
  51. }
  52. int a[N],id[N];
  53. void init(){
  54. n=read(),m=read();
  55. for(int i=;i<=n;i++)
  56. a[i]=read(),id[a[i]]=fa[i]=i;
  57. while(m--){
  58. int u=read(),v=read();
  59. fa[find(u)]=find(v);
  60. }
  61. for(int i=;i<=n;i++)
  62. ins(rt[find(i)],,n,a[i]);
  63. }
  64. void solve(){
  65. m=read();
  66. char s[];
  67. while(m--){
  68. scanf("%s",s);
  69. if(s[]=='B'){
  70. int u=read(),v=read();
  71. Link(u,v);
  72. }
  73. else{
  74. int u=find(read()),rk=read();
  75. if(T[rt[u]].sum<rk)puts("-1");
  76. else printf("%d\n",id[query(rt[u],,n,rk)]);
  77. }
  78. }
  79. }
  80. int main(){
  81. init();
  82. solve();
  83. }

2733

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N=;
  4. const int M=;
  5. inline int read(){
  6. int r=,c=getchar();
  7. while(!isdigit(c))c=getchar();
  8. while(isdigit(c))
  9. r=r*+c-'',c=getchar();
  10. return r;
  11. }
  12. int n,m,q;
  13. struct Edge{
  14. int u,v,w;
  15. friend bool operator < (Edge p,Edge q){
  16. return p.w<q.w;
  17. }
  18. }e[M];
  19. struct ask{
  20. int u,w,k,ans,id;
  21. }a[M];
  22. bool cmpw(ask p,ask q){
  23. return p.w<q.w;
  24. }
  25. bool cmpid(ask p,ask q){
  26. return p.id<q.id;
  27. }
  28. int fa[N],h[N],t[N],id[N];
  29. inline int find(int x){
  30. return x==fa[x]?x:fa[x]=find(fa[x]);
  31. }
  32. int rt[N],sz;
  33. struct Node{
  34. int L,R,sum;
  35. }T[N*];
  36. #define ls T[o].L
  37. #define rs T[o].R
  38. #define mid (l+r>>1)
  39. inline void pullup(int o){
  40. T[o].sum=T[ls].sum+T[rs].sum;
  41. }
  42. void ins(int &o,int l,int r,int val){
  43. if(!o)o=++sz;
  44. if(l==r){
  45. T[o].sum=;return;
  46. }
  47. if(val<=mid)ins(ls,l,mid,val);
  48. else ins(rs,mid+,r,val);
  49. pullup(o);
  50. }
  51. int query(int o,int l,int r,int rk){
  52. if(l==r){
  53. return t[l];
  54. }
  55. if(rk<=T[ls].sum)return query(ls,l,mid,rk);
  56. else return query(rs,mid+,r,rk-T[ls].sum);
  57. }
  58. int merge(int x,int y){
  59. if(!x)return y;
  60. if(!y)return x;
  61. if(!T[x].L&&!T[x].R){
  62. T[x].sum+=T[y].sum;
  63. return x;
  64. }
  65. T[x].L=merge(T[x].L,T[y].L);
  66. T[x].R=merge(T[x].R,T[y].R);
  67. pullup(x);return x;
  68. }
  69. inline void Link(int x,int y){
  70. x=find(x),y=find(y);
  71. if(x==y)return;
  72. fa[y]=x;
  73. rt[x]=merge(rt[x],rt[y]);
  74. }
  75. void init(){
  76. n=read(),m=read(),q=read();
  77. for(int i=;i<=n;i++)
  78. h[i]=t[i]=read(),fa[i]=i;
  79. sort(t+,t+n+);
  80. for(int i=;i<=n;i++){
  81. h[i]=lower_bound(t+,t+n+,h[i])-t;
  82. ins(rt[i],,n,h[i]);
  83. }
  84. for(int i=;i<=m;i++)
  85. e[i].u=read(),e[i].v=read(),e[i].w=read();
  86. sort(e+,e+m+);
  87. for(int i=;i<=q;i++)
  88. a[i].u=read(),a[i].w=read(),a[i].k=read(),a[i].id=i;
  89. sort(a+,a+q+,cmpw);
  90. }
  91. void solve(){
  92. int now=;
  93. for(int i=;i<=q;i++){
  94. int lim=a[i].w,rk=a[i].k;
  95. while(e[now].w<=lim&&now<=m){
  96. Link(e[now].u,e[now].v);now++;
  97. }
  98. int u=find(a[i].u),siz=T[rt[u]].sum;
  99. if(siz<rk){
  100. a[i].ans=-;continue;
  101. }
  102. else rk=siz-rk+;
  103. a[i].ans=query(rt[u],,n,rk);
  104. }
  105. sort(a+,a+q+,cmpid);
  106. for(int i=;i<=q;i++)
  107. printf("%d\n",a[i].ans);
  108. }
  109. int main(){
  110. init();
  111. solve();
  112. }

3545

[bzoj2733]永无乡&&[bzoj3545]Peaks的更多相关文章

  1. BZOJ2733 永无乡【splay启发式合并】

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  2. BZOJ2733 永无乡 【splay启发式合并】

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 4190  Solved: 2226 [Submit][Sta ...

  3. [BZOJ2733]永无乡

    Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以 ...

  4. bzoj2733永无乡

    永无乡 HYSBZ - 2733 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接, ...

  5. bzoj2733 永无乡 splay树的启发式合并

    https://vjudge.net/problem/HYSBZ-2733 给一些带权点,有些点是互相连通的, 然后给出2种操作,在两点间加一条边,或者询问一个点所在的连通块内的第k小值的编号 并查集 ...

  6. 【BZOJ2733】永无乡(线段树,并查集)

    [BZOJ2733]永无乡(线段树,并查集) 题面 BZOJ 题解 线段树合并 线段树合并是一个很有趣的姿势 前置技能:动态开点线段树 具体实现:每次合并两棵线段树的时候,假设叫做\(t1,t2\), ...

  7. [bzoj2733][HNOI2012]永无乡_权值线段树_线段树合并

    永无乡 bzoj-2733 HNOI-2012 题目大意:题目链接. 注释:略. 想法: 它的查询操作非常友善,就是一个联通块内的$k$小值. 故此我们可以考虑每个联通块建一棵权值线段树. 这样的话每 ...

  8. 【题解】永无乡 [HNOI2012] [BZOJ2733] [P3224]

    [题解]永无乡 [HNOI2012] [BZOJ2733] [P3224] [题目描述] 永无乡包含 \(n\) 座岛,编号从 \(1\) 到 \(n\) ,每座岛都有自己的独一无二的重要度,按照重要 ...

  9. 【BZOJ-2733】永无乡 Splay+启发式合并

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2048  Solved: 1078[Submit][Statu ...

随机推荐

  1. Extjs4如何构造store基类

    目标:重写一个BaseStore的基类,它继承自Ext.data.Store基类. autoLoad:true/false 是否自动加载,true时创建store即自动加载,一般适合get方式:fal ...

  2. SQL varchar转float实现数字比较

    select * from table where cast('经纬度' as float ) < 90

  3. redis笔记(四)

    本篇内容主要是简单介绍redis在python中的使用from time import sleep在python代码中使用redis需要导入redis packageimport redis简单的连接 ...

  4. 前端怎样学习react

    这是一个很长的话题.....慢慢写

  5. jmter安装配置

    一 JMeter 简介 JMeter 它是Apache组织的开放源代码项目,它是现在比较流行的功能和性能测试的工具.JMeter requires a fully compliant JVM 7 or ...

  6. 228. Summary Ranges (everyday promlems) broken problems

    Given a sorted integer array without duplicates, return the summary of its ranges. Example 1: Input: ...

  7. IOS 公司标示和方向域名

    1. 公司标示使用反向域名========================================正向域名 www.baidu.com 用来标示一台网络主机反向域名 cn.itcast.Myd ...

  8. 制作URL以GET方式提交的简单加密程序

    首先我们用到的是 DESCryptoServiceProvider 类 对此微软给出的解释是 定义访问数据加密标准 (DES) 算法的加密服务提供程序 (CSP) 版本的包装对象.无法继承此类. 接下 ...

  9. 2017.10.26 JavaWeb----第五章 JavaBean技术

    JavaWeb----第五章 JavaBean技术 (1)JavaBean技术 JavaBean技术是javaweb程序的重要组成部分,是一个可重复使用的软件组件,是用Java语言编写的.遵循一定的标 ...

  10. json 序列化和反序列化的3个方法

    https://www.cnblogs.com/caofangsheng/p/5687994.html