Cave 洞穴勘测 bzoj-2049 Sdoi-2008

题目大意:维护一个数据结构,支持森林中加边,删边,求两点连通性。n个点,m个操作。

注释:$1\le n\le 10^4$,$1\le m\le 2\cdot 10^5$。

想法:刚学了一发LCT,写一道照学长抄一道板子题。话说什么是LCT?

就是一个贼nb的数据结构,支持加边删边后的什么路径和子树信息啥的,这就是LCT。

艾欧欸软可以的blog

这道题,我们只需要其中的link,cut和find即可。

最后,附上代码.. ...

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #define N 10050
  6. #define ls ch[p][0]
  7. #define rs ch[p][1]
  8. #define get(x) (ch[f[x]][1]==x)
  9. using namespace std;
  10. int root[N],ch[N][2],n,m,rev[N],f[N];
  11. char opt[10];
  12. inline bool isroot(int p)
  13. {
  14. return ch[f[p]][0]!=p&&ch[f[p]][1]!=p;
  15. }
  16. inline void pushdown(int p)
  17. {
  18. if(!rev[p])
  19. swap(ch[ls][0],ch[ls][1]);
  20. swap(ch[rs][0],ch[rs][1]);
  21. rev[ls]^=1;
  22. rev[rs]^=1;
  23. rev[p]=0;
  24. }
  25. void update(int p)
  26. {
  27. if(!isroot(p)) update(f[p]);
  28. pushdown(p);
  29. }
  30. void rotate(int x)
  31. {
  32. int y=f[x],z=f[y],k=get(x);
  33. if(!isroot(y)) ch[z][ch[z][1]==y]=x;
  34. ch[y][k]=ch[x][!k]; f[ch[y][k]]=y;
  35. ch[x][!k]=y; f[y]=x; f[x]=z;
  36. }
  37. void splay(int x)
  38. {
  39. update(x);
  40. for(int fa;fa=f[x],!isroot(x);rotate(x))
  41. {
  42. if(!isroot(fa))
  43. {
  44. rotate(get(fa)==get(x)?fa:x);
  45. }
  46. }
  47. }
  48. void access(int p)
  49. {
  50. int t=0;
  51. while(p) splay(p),rs=t,t=p,p=f[p];
  52. }
  53. void makeroot(int p)
  54. {
  55. access(p); splay(p);
  56. swap(ls,rs); rev[p]^=1;
  57. }
  58. void link(int x,int p)
  59. {
  60. makeroot(x); f[x]=p;
  61. }
  62. void cut(int x,int p)
  63. {
  64. makeroot(x); access(p); splay(p); ls=f[x]=0;
  65. }
  66. int find(int p)
  67. {
  68. access(p); splay(p);
  69. while(ls) pushdown(p),p=ls;
  70. return p;
  71. }
  72. int main()
  73. {
  74. scanf("%d%d",&n,&m);
  75. int x,y;
  76. for(int i=1;i<=m;i++)
  77. {
  78. scanf("%s%d%d",opt,&x,&y);
  79. if(opt[0]=='C') link(x,y);
  80. else if(opt[0]=='D') cut(x,y);
  81. else
  82. {
  83. int t=find(x),b=find(y);
  84. puts(t==b?"Yes":"No");
  85. }
  86. }
  87. }

小结:都说LCT出来就是板子题,但是得会敲才行啊???!!

[bzoj2049][Sdoi2008]Cave 洞穴勘测_LCT的更多相关文章

  1. BZOJ_2049_[Sdoi2008]Cave 洞穴勘测_LCT

    BZOJ_2049_[Sdoi2008]Cave 洞穴勘测_LCT Description 辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由 ...

  2. BZOJ2049 SDOI2008 Cave 洞穴勘测 【LCT】

    BZOJ2049 SDOI2008 Cave 洞穴勘测 Description 辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分 ...

  3. 【LCT】BZOJ2049 [SDOI2008]Cave 洞穴勘测

    2049: [Sdoi2008]Cave 洞穴勘测 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 10059  Solved: 4863[Submit ...

  4. [BZOJ2049][Sdoi2008]Cave 洞穴勘测 LCT模板

    2049: [Sdoi2008]Cave 洞穴勘测 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 9705  Solved: 4674[Submit] ...

  5. [BZOJ2049] [SDOI2008] Cave 洞穴勘测 (LCT)

    Description 辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好 ...

  6. BZOJ2049: [Sdoi2008]Cave 洞穴勘测 Link-Cut-Tree 模板题

    传送门 搞了这么长时间Splay终于可以搞LCT了,等等,什么是LCT? $LCT$就是$Link-Cut-Tree$,是维护动态树的一个很高效的数据结构,每次修改和查询的均摊复杂度为$O(logN) ...

  7. BZOJ2049——[Sdoi2008]Cave 洞穴勘测

    1.题目大意:就是一个动态维护森林联通性的题 2.分析:lct模板题 #include <stack> #include <cstdio> #include <cstdl ...

  8. bzoj2049: [Sdoi2008]Cave 洞穴勘测

    lct入门题? 得换根了吧TAT 这大概不是很成熟的版本.. #include<iostream> #include<cstring> #include<cstdlib& ...

  9. bzoj2049 [Sdoi2008]Cave 洞穴勘测 link cut tree入门

    link cut tree入门题 首先说明本人只会写自底向上的数组版(都说了不写指针.不写自顶向下QAQ……) 突然发现link cut tree不难写... 说一下各个函数作用: bool isro ...

随机推荐

  1. Android定时任务

    前言 我们在平常的开发中可能会遇到一些需求,比如说,每日定时提醒,定时更新数据等等,反正就是周期性任务,碰到这类需求,我们就可以叫做定时任务.以前我们可以通过使用线程Handler来实现,现在既然是在 ...

  2. B1922 [Sdoi2010]大陆争霸 最短路

    我一直都不会dij的堆优化,今天搞了一下...就是先弄一个优先队列,存每个点的数据,然后这个题就加了一点不一样的东西,每次的最短路算两次,一次是自己的最短路,另一次是机关的最短路,两者取最大值才是该点 ...

  3. C++ this指针 全部

    在每一个成员函数中都包含一个特殊的指针,这个指针的名字是固定的.叫做this.它是指向本类对象的指针,它的值是当前被调用的成员函数所在的对象的起      始地址.例如:当调用成员函数a.volume ...

  4. curl强制下载文件

    <?phpfunction download_remote_file_with_curl($file_url, $save_to) { $ch = curl_init(); curl_setop ...

  5. weui&flexible布局

    1.weui 一开始以为只能用于小程序中,原来分两种:weui-wxss-master和weui-master.真的是强大的不得了,把设计好的样式和功能封装.然后分类,有明确的层级和逻辑,感动!!值得 ...

  6. HDU 1166 线段树模板&树状数组模板

    HDU1166 上好的线段树模板&&树状数组模板 自己写的第一棵线段树&第一棵树状数组 莫名的兴奋 线段树: #include <cstdio> using nam ...

  7. 关于EasyUI datagrid editor combogrid搜索框的实现

    首先需要datagrid editor对combogrid的扩展,这个是别人实现的: $.extend($.fn.datagrid.defaults.editors, { combogrid: { i ...

  8. KVO的使用及底层实现

    1.概念 KVO(Key-Value-Observer)也就是观察者模式,是苹果提供的一套事件通知机制.允许对象监听另一个对象特定属性的改变,并在改变时接收到事件,一般继承自NSObject的对象都默 ...

  9. Eclipse代码自动提示(内容辅助content assist)

    Eclipse中默认是输入"."后出现自动提示,用于类成员的自动提示,可是有时候我们希望它能在我们输入类的首字母后就出现自动提示,可以节省大量的输入时间(虽然按alt + /会出现 ...

  10. Oracle数据库的导入和导出

    Oracle数据库的导入和导出,是一项重要的的技术活,不但解决了数据库的导入导出,更方便快捷的获得数据. 使用imp和exp导入导出数据 使用exp导出数据 存放目录为\ORACLE_HOME\BIN ...