启发式合并?!

似乎当时写并查集的时候就有看到过类似于把小并查集并到大并查集上的说法,原来这就是启发式……

具体做法就是把小树里面的一个个拿出来,然后加到大树里面去(裸的不敢相信)

const

  maxn=;

  number=;

var

  left,right,size,value,hash,key,fa,num,root:array[..maxn]of longint;

  tot:longint;

procedure swap(var x,y:longint);

var

  i:longint;

begin

  i:=x;

  x:=y;

  y:=i;

end;

procedure lt(var x:longint);

var

  k:longint;

begin

  k:=right[x];

  right[x]:=left[k];

  left[k]:=x;

  size[k]:=size[x];

  size[x]:=size[left[x]]+size[right[x]]+;

  x:=k;

end;

procedure rt(var x:longint);

var

  k:longint;

begin

  k:=left[x];

  left[x]:=right[k];

  right[k]:=x;

  size[k]:=size[x];

  size[x]:=size[left[x]]+size[right[x]]+;

  x:=k;

end;

procedure insert(var x:longint;y:longint);

begin

  if x= then begin

    inc(tot);

    x:=tot;

    value[x]:=num[y];

    hash[x]:=y;

    key[x]:=random(number);

    left[x]:=;

    right[x]:=;

    size[x]:=;

    exit;

  end;

  inc(size[x]);

  if value[x]<num[y] then begin

    insert(right[x],y);

    if key[right[x]]<key[x] then lt(x);

  end

  else begin

    insert(left[x],y);

    if key[left[x]]<key[x] then rt(x);

  end;

end;

procedure dfs(var x:longint;y:longint);

begin

  if y= then exit;

  insert(x,hash[y]);

  dfs(x,left[y]);

  dfs(x,right[y]);

end;

function getfa(x:longint):longint;

begin

  if fa[x]=x then exit(x);

  fa[x]:=getfa(fa[x]);

  exit(fa[x]);

end;

procedure link(x,y:longint);

begin

  x:=getfa(x);

  y:=getfa(y);

  if x=y then exit;

  if size[root[x]]<size[root[y]] then swap(x,y);

  dfs(root[x],root[y]);

  fa[y]:=x;

end;

function find(x,y:longint):longint;

begin

  if x= then exit(-);

  if size[left[x]]=y- then exit(hash[x]);

  if size[left[x]]>y- then exit(find(left[x],y))

    else exit(find(right[x],y-size[left[x]]-));

end;

procedure into;

var

  i,x,y,n,m:longint;

begin

  readln(n,m);

  randomize;

  for i:= to n do begin

    read(num[i]);

    fa[i]:=i;

    insert(root[i],i);

  end;

  for i:= to m do begin

    readln(x,y);

    link(x,y);

  end;

end;

procedure work;

var

  n,x,y,i:longint;

  ch:char;

begin

  readln(n);

  for i:= to n do begin

    readln(ch,x,y);

    case ch of

      'B':link(x,y);

      'Q':writeln(find(root[getfa(x)],y));

    end;

  end;

end;

begin

  into;

  work;

end.

【以前的空间】BZOJ2733[HNOI2012]永无乡的更多相关文章

  1. bzoj2733: [HNOI2012]永无乡 启发式合并

    地址:http://www.lydsy.com/JudgeOnline/problem.php?id=2733 题目: 2733: [HNOI2012]永无乡 Time Limit: 10 Sec   ...

  2. bzoj2733: [HNOI2012]永无乡(splay)

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3778  Solved: 2020 Description 永 ...

  3. [Bzoj2733][Hnoi2012] 永无乡(BST)(Pb_ds tree)

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

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

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

  5. BZOJ2733 [HNOI2012]永无乡 【线段树合并】

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

  6. [BZOJ2733] [HNOI2012] 永无乡 (splay启发式合并)

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

  7. BZOJ2733[HNOI2012]永无乡——线段树合并+并查集+启发式合并

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

  8. bzoj2733: [HNOI2012]永无乡 线段树合并

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

  9. BZOJ2733: [HNOI2012]永无乡(线段树合并)

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

随机推荐

  1. Git学习系列 (二)

    #克隆目录并重命名为newname,默认目录名是使用.git前的grit git clone git://github.com/schacon/grit.git newname #将所有已经跟踪过的文 ...

  2. HashMap在并发场景下踩过的坑

    本文来自网易云社区 作者:张伟 关于HashMap在并发场景下的问题有很多人,很多公司遇到过!也很多人总结过,我们很多时候都认为这样都坑距离自己很远,自己一定不会掉入这样都坑.可是我们随时都有就遇到了 ...

  3. lintcode407 加一

    加一 给定一个非负数,表示一个数字数组,在该数的基础上+1,返回一个新的数组. 该数字按照大小进行排列,最大的数在列表的最前面. 您在真实的面试中是否遇到过这个题? Yes 样例 给定 [1,2,3] ...

  4. Centos7添加静态路由

    本文摘取自 Centos7系统配置上的变化(二)网络管理基础 一.ip route显示和设定路由 1.显示路由表 [root@centos7 ~]# ip route show default via ...

  5. 【转载】2015Android 面试题 01

    1.如何避免ANR? 答:ANR:Application Not Responding,五秒在Android中,活动管理器和窗口管理器这两个系统服务负责监视应用程序的响应. 当出现下列情况时,Andr ...

  6. android课程第一节(TextView控件使用)

    TextView控件使用 一.TextView基本使用(创建方式) 1.在程序中创建TextView对象 如下代码: @Override protected void onCreate(Bundle ...

  7. nginx虚拟目录实现两个后台使用

    购买了阿里云机器,准备搭建一套备份的后台,由于资源有限所以将两个后台搭建到一组SLB下的两台WEB上. 使用软件:NGINX+PHP root@xx conf.d]# yum install php- ...

  8. Tarball——以源代码的方式安装软件

    一.Tarball文件 形成:将软件的所有源码文件先以tar打包,然后再以压缩技术(如gzip)来压缩.因为源码文件很大. 描述:一个软件包,解压缩后得到源代码文件.检测程序文件.软件的简易说明与安装 ...

  9. 软件工程第六周psp

    1.psp表格 类别 任务 开始时间 结束时间 中断时间 delta时间 立会 讲技术文档,分配任务 10月20日16:17 10月20日16:50 0 33分钟 准备工作 根据任务查资料 10月20 ...

  10. iOS- Swift实现UITableView的常见操作

    1.前言   Swift在这就不多介绍了,想必大家都已皆知. 离Swift面世也过了有一个多月的时间. 在闲暇时间我用Swift实现了UITableView的一些常见操作. 基本都是可以用上的,今天在 ...