csu 1949 小明的烦恼 并查集+权值线段树
来源:互联网 发布:淘宝联盟赚钱是真的吗 编辑:程序博客网 时间:2024/06/06 02:30
题目链接
思路:
首先,对于每个员工之间的合并,可以采用并查集来解决这件事.那么主要的问题就是如何求这个集合中第k大的数.这里采用权值线段树来合并,大体的权值线段树,就是我们当时用来求逆序数的用法。
题目中是2e5的数据范围,那么我们初始对每个员工建立一个树,然后记录下他的根节点和他的左右子节点,合并时,将两个团队所在树的根节点的合并就好,
#include<bits/stdc++.h>#define inf 0x3f3f3f3fusing namespace std;const int maxn=1e5+10;const int maxm=1e7+10;struct node{int ls,rs,sum;int l,r;}q[maxm];int a[maxn],father[maxn],root[maxn],s[maxn];int n,m;int k;int build(int l,int r,int d)//建树{k++;int t=k;q[t].l=l,q[t].r=r;if(r<d||l>d){q[t].ls=0,q[t].rs=0,q[t].sum=0;return t;}else{q[t].sum=1;if(l==r){q[t].ls=0,q[t].rs=0; return t;}int mid=(l+r)>>1;q[t].ls=build(l,mid,d);q[t].rs=build(mid+1,r,d);return t;}} int find(int x){return x==father[x]?x:father[x]=find(father[x]); } int get(int roots,int ss)//找第k大的数{if(q[roots].l==q[roots].r)return q[roots].l;int ls=q[roots].ls,rs=q[roots].rs;if(q[ls].sum<ss)return get(rs,ss-q[ls].sum);elsereturn get(ls,ss);}int merge(int x,int y)//合并{if(q[x].ls==0)q[x].ls=q[y].ls;else{if(q[y].ls>0){q[x].ls=merge(q[x].ls,q[y].ls);}}if(q[x].rs==0)q[x].rs=q[y].rs;else{if(q[y].rs>0){q[x].rs=merge(q[x].rs,q[y].rs);}}q[x].sum+=q[y].sum;return x;}int main(){while(scanf("%d %d",&n,&m)!=EOF){int maxl=inf,maxr=0;for(int i=1;i<=n;i++){ scanf("%d",&a[i]); maxl=min(maxl,a[i]); maxr=max(maxr,a[i]);}k=0;for(int i=1;i<=n;i++){father[i]=i;s[i]=1;root[i]=build(maxl,maxr,a[i]);}while(m--){int x,y;int cnd;scanf("%d",&cnd);if(cnd==2){scanf("%d %d",&x,&y);int fx=find(x),fy=find(y);s[fx]+=s[fy];father[fy]=fx;root[fx]=merge(root[fx],root[fy]);}else{scanf("%d",&x);int fx=find(x);printf("%d\n",get(root[fx],(s[fx]+1)>>1));}}}return 0;}
阅读全文
0 0
- csu 1949 小明的烦恼 并查集+权值线段树
- 国王的烦恼 并查集
- 并查集-国王的烦恼
- 反向并查集-国王的烦恼
- 国王的烦恼蓝桥杯 并查集
- CSU 1601(并查集)
- 蓝桥杯--- 历届试题 国王的烦恼 (并查集)
- 蓝桥杯 国王的烦恼 反向并查集
- (蓝桥杯)历届试题 国王的烦恼 (并查集)
- 蓝桥杯 国王的烦恼(并查集)
- 历届试题 国王的烦恼 (并查集)
- 蓝桥杯 国王的烦恼(排序+并查集)
- 蓝桥杯 历届试题 国王的烦恼(并查集)
- 蓝桥杯 国王的烦恼 逆向并查集建树
- nyoj_925国王的烦恼(并查集最大生成树)
- CSU 1045: 并查集(带权并查集)
- csu 1601 War(并查集)
- CSU 1601 War (并查集)
- 采药(NOIP2005)
- Access denied for user 'root解决办法以及wampserver修改端口号
- linux下安装mysql的两种方法
- 3种方法轻松处理php开发中emoji表情的问题
- SVN详解
- csu 1949 小明的烦恼 并查集+权值线段树
- 已解决:Gradle DSL method not found: 'compile()'
- HTML5+js+css3开心消消乐手机pc端通用源码|H5小游戏
- Linux常用命令(三)——系统管理命令(未拓展)
- 【Struts2】Struts2学习(5)类型转换和输入校验
- linux cpu相关信息
- return a==b?a:b;//谈谈你对这段代码的看法 百度面试题引来支付宝员工和阿里巴巴员工围观热议
- Git简介
- 在编译OpenCV时如何开启OpenNI