1、题目大意:就是一个动态维护森林联通性的题

2、分析:lct模板题

  1. #include <stack>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cstring>
  5. #include <algorithm>
  6. using namespace std;
  7. #define LL long long
  8. #define eps 1e-7
  9. int n, m;
  10. namespace LinkCutTree{
  11. struct Node{
  12. Node *ch[2], *fa;
  13. bool rev;
  14. Node(){
  15. ch[0] = ch[1] = NULL;
  16. fa = NULL;
  17. rev = false;
  18. }
  19.  
  20. inline int which(){
  21. if(fa == NULL || (fa -> ch[0] != this && fa -> ch[1] != this)) return -1;
  22. return fa -> ch[1] == this;
  23. }
  24.  
  25. inline bool reverse(){
  26. if(this) rev ^= 1;
  27. }
  28.  
  29. inline void pd(){
  30. if(rev){
  31. swap(ch[0], ch[1]);
  32. if(ch[0] != NULL) ch[0] -> reverse();
  33. if(ch[1] != NULL) ch[1] -> reverse();
  34. rev = false;
  35. }
  36. }
  37. } ft[10010], *pos[10010];
  38.  
  39. inline void rotate(Node *o){
  40. Node *p = o -> fa;
  41. int l = o -> which(), r = l ^ 1;
  42. o -> fa = p -> fa;
  43. if(p -> which() != -1) p -> fa -> ch[p -> which()] = o;
  44. p -> ch[l] = o -> ch[r];
  45. if(o -> ch[r]) o -> ch[r] -> fa = p;
  46. o -> ch[r] = p; p -> fa = o;
  47. }
  48.  
  49. inline void splay(Node* o){
  50. static stack<Node*> st;
  51. if(!o) return;
  52. Node* p = o;
  53. while(1){
  54. st.push(p);
  55. if(p -> which() == -1) break;
  56. p = p -> fa;
  57. }
  58. while(!st.empty()){
  59. st.top() -> pd(); st.pop();
  60. }
  61.  
  62. while(o -> which() != -1){
  63. p = o -> fa;
  64. if(p -> which() != -1){
  65. if(p -> which() ^ o -> which()) rotate(o);
  66. else rotate(p);
  67. }
  68. rotate(o);
  69. }
  70. }
  71.  
  72. inline void Access(Node* o){
  73. Node* p = NULL;
  74. while(o != NULL){
  75. splay(o);
  76. o -> ch[1] = p;
  77. p = o; o = o -> fa;
  78. }
  79. }
  80.  
  81. inline void MovetoRoot(Node* o){
  82. Access(o);
  83. splay(o);
  84. o -> reverse();
  85. }
  86.  
  87. inline Node* FindRoot(Node* o){
  88. while(o -> fa != NULL){
  89. o = o -> fa;
  90. }
  91. return o;
  92. }
  93.  
  94. inline void Link(Node* x, Node* y){
  95. MovetoRoot(x);
  96. x -> fa = y;
  97. }
  98.  
  99. inline void Cut(Node* x, Node* y){
  100. MovetoRoot(x);
  101. Access(y);
  102. splay(y);
  103. x -> fa = NULL;
  104. y -> ch[0] = NULL;
  105. }
  106.  
  107. inline void init(){
  108. for(int i = 1; i <= n; i ++) pos[i] = &ft[i];
  109. }
  110.  
  111. inline void Connect(int u, int v){
  112. Link(pos[u], pos[v]);
  113. }
  114.  
  115. inline void Destroy(int u, int v){
  116. Cut(pos[u], pos[v]);
  117. }
  118.  
  119. inline bool Query(int u, int v){
  120. return FindRoot(pos[u]) == FindRoot(pos[v]);
  121. }
  122. }
  123.  
  124. int main(){
  125. char op[10];
  126. int u, v;
  127. scanf("%d%d", &n, &m);
  128. LinkCutTree::init();
  129. for(int i = 1; i <= m; i ++){
  130. scanf("%s", op);
  131. scanf("%d%d", &u, &v);
  132. if(op[0] == 'C') LinkCutTree::Connect(u, v);
  133. else if(op[0] == 'D') LinkCutTree::Destroy(u, v);
  134. else puts(LinkCutTree::Query(u, v) ? "Yes" : "No");
  135. }
  136. return 0;
  137. }

BZOJ2049——[Sdoi2008]Cave 洞穴勘测的更多相关文章

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

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

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

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

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

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

  4. [bzoj2049][Sdoi2008]Cave 洞穴勘测_LCT

    Cave 洞穴勘测 bzoj-2049 Sdoi-2008 题目大意:维护一个数据结构,支持森林中加边,删边,求两点连通性.n个点,m个操作. 注释:$1\le n\le 10^4$,$1\le m\ ...

  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 洞穴勘测

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

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

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

  9. bzoj2049: [Sdoi2008]Cave 洞穴勘测 lct裸题

    题意:三种操作一种摧毁一条边,一种链接一条边,一种查询两个点是否联通 题解:lct的link和cut即可 /********************************************** ...

随机推荐

  1. spring--基本介绍

    1.1.1  Spring是什么 Spring是一个开源的轻量级Java SE(Java 标准版本)/Java EE(Java 企业版本)开发应用框架,其目的是用于简化企业级应用程序开发.应用程序是由 ...

  2. SQL Server编程(04)基本语法【转载】

    一.定义变量 --简单赋值 declare @a int set @a=5 print @a   --使用select语句赋值 declare @user1 nvarchar(50) select @ ...

  3. WinForm------如何将GridControl数据导出到Excel

    转载: http://www.cnblogs.com/xiaofengfeng/archive/2011/11/22/2258906.html 代码: SaveFileDialog saveFileD ...

  4. MySQL------Navicat激活方法

    转载: http://www.jianshu.com/p/b1f9194e1e31

  5. 入门:PHP:hello world!

    <?php echo 'hello'."\n"." world!"."good night!";//2016.09.18 22:57? ...

  6. Echarts 页面多图自适应的解决办法 (转)

    项目中用到了echarts的多图表的 问题,如果设置了 window.onresize  = option.chart.resize() 只能控制 某个图表的 自适应,如果要是页面上的图表都要自适应. ...

  7. 谈谈我对PhoneGap的看法——(摘自唐巧的技术博客)

    源地址:http://blog.devtang.com/blog/2012/03/24/talk-about-uiwebview-and-phonegap/ 主题部分 我认为PhoneGap有以下3大 ...

  8. AutoMapper不用任何配置就可以从dynamic(动态)对象映射或映射到dynamic对象。

    http://www.cnblogs.com/farb/p/4934476.html#pz

  9. apache 的工作模式

    总结:访问量大的时候使用 worker模式:  每个进程,启动多个线程来处理请求,每个线程处理一次请求,对内存要求比较高. prefoek模式 : 每个子进程只有一个线程,一次请求一个进程. 什么是a ...

  10. svn branch and merge(svn切换分支和合并)详解

    下文的实践主要是参考了TortoiseSVN的帮助文档和Subversion的在线文档,Subversion的在线文档:http://svnbook.red-bean.com/en/1.5/svn-b ...