用并查集维护联通块。

用线段树的合并来合并联通块。

自己YY了一个写法。

#include <map>
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define ll long long
#define mp make_pair
#define maxn 150005 int ls[maxn<<5],rs[maxn<<5],rt[maxn];
int fa[maxn],n,m,tot,sum[maxn<<5],q; char opt[11]; void modify(int o1,int &o2,int l,int r,int x,int f)
{
o2=++tot;sum[o2]=sum[o1]+f;if(l==r)return;int mid=l+r>>1;
if (x<=mid) rs[o2]=rs[o1],modify(ls[o1],ls[o2],l,mid,x,f);
else ls[o2]=ls[o1],modify(rs[o1],rs[o2],mid+1,r,x,f);
} int gf(int k)
{
if (fa[k]==k) return k;
else return fa[k]=gf(fa[k]);
} int merge(int o1,int o2,int l,int r)
{
if (!(o1*o2)) return o1+o2;
int mid=l+r>>1;sum[o1]+=sum[o2];
ls[o1]=merge(ls[o1],ls[o2],l,mid);
rs[o1]=merge(rs[o1],rs[o2],mid+1,r);
return o1;
} int query(int o,int l,int r,int x)
{
if (sum[o]<x) return -1;
if (l==r) return l;
int mid=l+r>>1;
if (x<=sum[ls[o]]) return query(ls[o],l,mid,x);
else return query(rs[o],mid+1,r,x-sum[ls[o]]);
} void Debug(int o,int l,int r)
{
if (!o) return ;
printf(" %d %d == %d\n",l,r,sum[o]);
if (l==r) return ;
Debug(ls[o],l,l+r>>1);
Debug(rs[o],(l+r>>1)+1,r);
} int list[maxn]; int main()
{
scanf("%d%d",&n,&m);
F(i,1,n) fa[i]=i,rt[i]=0;
F(i,1,n)
{
int x;
scanf("%d",&x);
modify(rt[i],rt[i],1,n,x,1);
list[x]=i;
}
F(i,1,m)
{
int x,y,fx,fy; scanf("%d%d",&x,&y);
fx=gf(x);fy=gf(y);
if (fx==fy) continue;
else
fa[fy]=fx,rt[fx]=merge(rt[fx],rt[fy],1,n);
}
scanf("%d",&q);
F(i,1,q)
{
int x,y,fx,fy,tmp;
scanf("%s%d%d",opt,&x,&y);
switch(opt[0])
{
case 'Q':
fx=gf(x);
tmp=query(rt[fx],1,n,y);
printf("%d\n",tmp==-1?-1:list[query(rt[fx],1,n,y)]);
break;
case 'B':
fx=gf(x);fy=gf(y);
if (fx!=fy)
{
fa[fy]=fx;
rt[fx]=merge(rt[fx],rt[fy],1,n);
}
break;
}
}
}

  

BZOJ 2733 [HNOI2012]永无乡 ——线段树 并查集的更多相关文章

  1. bzoj 2733: [HNOI2012]永无乡 -- 线段树

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MB Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自 ...

  2. Bzoj 2733: [HNOI2012]永无乡(线段树+启发式合并)

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec Memory Limit: 128 MB Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己 ...

  3. bzoj 2733 : [HNOI2012]永无乡 (线段树合并)

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

  4. 2733: [HNOI2012]永无乡 线段树合并

    题目: https://www.lydsy.com/JudgeOnline/problem.php?id=2733 题解: 建n棵动态开点的权值线段树,然后边用并查集维护连通性,边合并线段树维护第k重 ...

  5. bzoj 2733: [HNOI2012]永无乡 离线+主席树

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1167  Solved: 607[Submit][Status ...

  6. BZOJ 2733: [HNOI2012]永无乡 [splay启发式合并]

    2733: [HNOI2012]永无乡 题意:加边,询问一个连通块中k小值 终于写了一下splay启发式合并 本题直接splay上一个节点对应图上一个点就可以了 并查集维护连通性 合并的时候,把siz ...

  7. BZOJ 2733: [HNOI2012]永无乡 启发式合并treap

    2733: [HNOI2012]永无乡 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...

  8. BZOJ 2733: [HNOI2012]永无乡(treap + 启发式合并 + 并查集)

    不难...treap + 启发式合并 + 并查集 搞搞就行了 --------------------------------------------------------------------- ...

  9. Bzoj 2733: [HNOI2012]永无乡 数组Splay+启发式合并

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

随机推荐

  1. Update主循环的实现原理

    从写一段程序,到写一个app,写一个游戏,到底其中有什么不同呢?一段程序的执行时间很短,一个应用的执行时间很长,仅此而已.游戏中存在一个帧的概念. 这个概念大家都知道,类比的话,它就是电影胶卷的格.一 ...

  2. OpenGL小试牛刀第二季(粒子模拟)

    效果截图:粒子模拟代码展示:#include "Particle.h" /** 构造函数 */CParticle::CParticle(){ data = NULL; numpar ...

  3. 将数据表中的数据添加到ComboBox控件中

    实现效果: 知识运用: ComboBox控件的DataSource 属性 //获取或设置ComboBox的数据源 public Object DataResouce{get;set;} //属性值:任 ...

  4. Web前端 优化方案

    1.减少Http请求  在一个页面中图片,CSS,JS可能N个,如果每个资源都去请求一次服务器的话,那么服务器就会为每个资源开一个线程来完成,这样的话对服务器的压力就很大了.所以解决的方法就是合并资源 ...

  5. cocostudio的bug(1)

    今天有个女同事问我一个问题,两个cocostudio的ui同时addChild到一个layer上面,高层级的ui设置visible为false,低层级的ui设置的visible设置为true,然后低层 ...

  6. AutoLayout处理UITableView动态高度

    我们经常会遇到UITableViewCell的高度要跟随内容而调整,在未引入AutoLayout之前,我们使用以下方法计算Label高度,然后heightForRowAtIndexPath中返回计算的 ...

  7. textContent和innerText属性的区别

    原文摘自 textContent和innerText属性的区别 <!DOCTYPE html> <html> <head> <meta charset=&qu ...

  8. python2和python3中filter函数

    在python2和python3中filter是不同的,其中在python2中filter返回的是一个list,可以直接使用 >>> a = [1,2,3,4,5,6,7] > ...

  9. Voyager的Roles和Pemissions

    以Page为例讲解: 取消admin的roles下Pages的Browse Pages权限: 打开web.php文件,添加: Route::get('pages', function(){ retur ...

  10. 14Shell脚本—判断语句

    判断语句 Shell脚本中的条件测试语法可以判断表达式是否成立,若条件成立则返回数字0,否则便返回其他随机数值. 条件测试语法的执行格式为 [ 条件表达式 ],切记,条件表达式两边均应有一个空格. 条 ...