启发式合并?!

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

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

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. JS dataTables

    原文地址: http://www.cnblogs.com/haogj/archive/2011/03/04/1971328.html   数据来源有四种: 1. 网页DOM对象 $(document) ...

  2. 180601-MySql性能监控工具MyTop

    文章链接:https://blog.hhui.top/hexblog/2018/06/01/180601-MySql性能监控工具MyTop/ mysql 性能监控小工具之 mytop 参考: How ...

  3. 创建并运行第一个Django项目

    首先, 添加Django模块: 在CMD命令行输入 python -m django --version 查看Django版本: 创建第一个Django项目: 整个工程的目录结构: mysite目录是 ...

  4. linux部署MantisBT(三)部署MantisBT

    三.部署MantisBT 1.下载MantisBT https://www.mantisbt.org/download.php 2.将MantisBT安装包放在/apache/htdocs下并重命名为 ...

  5. Python文件操作大全

    Python 编程文件操作大全   文件打开模式 打开模式 执行操作 'r' 以只读方式打开文件(默认) 'w' 以写入的方式打开文件,会覆盖已存在的文件 'x' 如果文件已经存在,使用此模式打开将引 ...

  6. TPO-16 C1 Reserve the room for a rehearsal

    TPO-16 C1 Reserve the room for a rehearsal 第 1 段 1.Listen to a conversation between a Student and a ...

  7. [Clr via C#读书笔记]Cp14字符字符串和文本处理

    Cp14字符字符串和文本处理 字符 System.Char结构,2个字节的Unicode,提供了大量的静态方法:可以直接强制转换成数值: 字符串 使用最频繁的类型:不可变:引用类型,在堆上分配,但是使 ...

  8. git revert 与 git reset

    Git版本回滚之 git revert 与 git reset 在使用 git 的时候,如果错误push之后,经常会回滚版本. git的回滚有两种方式: revert命令:这种方式,是用一种反向的 p ...

  9. [HNOI2018]寻宝游戏(题解转载自别处)

    题解(自别处转载): Luogu CSDN 这题关键是将运算符也替换成0,1 然后在运算符与原串混杂里找规律. 而且替换的方式也有所要求,考场上两种替换方式都要尝试. #include <bit ...

  10. springmvc项目,浏览器报404错误的问题

    问题描述: 建立了web工程,配置pom.xml,web.xml,编写controller类,在spring-mvc-servlet.xml文件中指定开启注解和扫描的包位置<mvc:annota ...