题意

三种操作:

(1)Link

(2)Cut

(3)询问连通性

分析

分析1:Trick

clj的方法...

随机构造的树很容易Trick过掉。

我们考虑直接使用并查集,不使用路径压缩。

再使用换根操作。

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#define rep(i,n) for(int i=0;i<n;i++)
#define pb push_back
using namespace std;
const int maxn=10000+10;
int F[maxn],n,m;
void Clear_List()
{
    rep(i,n)F[i]=i;
}
int Find_Root(int u)
{
    while(u!=F[u])u=F[u];
    return u;
}
bool Query(int u,int v)
{
    return Find_Root(u)==Find_Root(v);
}
void Mark_Root(int u)
{
    int v=F[u],t;F[u]=u;
    while(u!=v)
    {
        t=F[v];F[v]=u;
        u=v;v=t;
    }
}
void Connect(int u,int v)
{
    Mark_Root(u);
    Mark_Root(v);
    F[v]=u;
}
void Destroy(int u,int v)
{
    Mark_Root(u);
    F[v]=v;
}
char c[100];
int main()
{
    //freopen("in","r",stdin);
    scanf("%d%d",&n,&m);int u,v;
    Clear_List();
    rep(i,m)
    {
        scanf(" ");scanf("%s%d%d",c,&u,&v);
        u--;v--;
        switch(c[0])
        {
            case 'Q':Query(u,v)?puts("Yes"):puts("No");break;
            case 'C':Connect(u,v);break;
            case 'D':Destroy(u,v);break;
        }
    }
}

分析2:LCT

LCT裸题。

#include <cstdio>
#include <cstring>
#include <cctype>
#include <algorithm>
using namespace std;

#define rep(i,a,b) for (int i=(a);i<=(b);i++)
#define per(i,a,b) for (int i=(a);i>=(b);i--)

const int N=16384;
const int L=16;

int n,m;
char s[L];

int c[N][2]; int fa[N];
int rev[N];
int st[N],top;

int rd(void) {
    int x=0,f=1; char c=getchar();
    for (;!isdigit(c);c=getchar()) if (c=='-') f=-1;
    for (;isdigit(c);c=getchar()) x=x*10+c-'0';
    return x*f;
}

int IsRoot(int x) {
    int pre=fa[x];
    return c[pre][0]!=x&&c[pre][1]!=x;
}

void Clear(int x) {
    if (rev[x]) {
        rev[x]^=1;
        rev[c[x][0]]^=1;
        rev[c[x][1]]^=1;
        swap(c[x][0],c[x][1]);
    }
}

void Rotate(int x) {
    int y=fa[x],z=fa[y],l,r;
    if (c[y][0]==x) l=0; else l=1; r=l^1;
    if (!IsRoot(y)) {
        if (c[z][0]==y)
            c[z][0]=x;
        else c[z][1]=x;
    }
    fa[x]=z,fa[y]=x;
    if (c[x][r]>0) fa[c[x][r]]=y;
    c[y][l]=c[x][r];
    c[x][r]=y;
}

void Splay(int x) {
    top=0;
    st[++top]=x;
    for (int i=x;!IsRoot(i);i=fa[i])
        st[++top]=fa[i];
//  rep(i,1,top) Clear(st[i]);
    per(i,top,1) Clear(st[i]);

    while (!IsRoot(x)) {
        int y=fa[x],z=fa[y];
        if (!IsRoot(y)) {
            if ((c[y][0]==x)^(c[z][0]==y))
                Rotate(x);
            else Rotate(y);
        }
        Rotate(x);
    }
}

void Access(int x) {
    int t=0;
    while (x>0) {
        Splay(x);
        c[x][1]=t;
        fa[t]=x;
        t=x;
        x=fa[x];
    }
}

void Evert(int x) {
    Access(x);
    Splay(x);
    rev[x]^=1;
}

void Link(int x,int y) {
    Evert(x);
    fa[x]=y;
    Splay(x);
}

void Cut(int x,int y) {
    Evert(x);
    Access(y);
    Splay(y);
    c[y][0]=fa[x]=0;
}

int Find(int x) {
    Access(x);
    Splay(x);
    int t=x;
    while (c[t][0]>0)
        t=c[t][0];
    Splay(t);
    return t;
}

int Judge(int x,int y) {
    int fx=Find(x),fy=Find(y);
    return fx==fy;
}

int main(void) {
    #ifndef ONLINE_JUDGE
    freopen("sdchr.in","r",stdin);
    freopen("sdchr.out","w",stdout);
    #endif

    n=rd(),m=rd();
    rep(i,1,m) {
        scanf("%s",s+1); int x=rd(),y=rd();
        switch (s[1]) {
            case 'C':
                Link(x,y);
                break;
            case 'D':
                Cut(x,y);
                break;
            case 'Q':
                int t=Judge(x,y);
                if (t) printf("Yes\n"); else printf("No\n");
                break;
        }
    }

    return 0;
}

小结

树的问题:

(1)Trick

(2)DFN序

(3)树剖

(4)树上倍增

(5)树分块

(6)树上莫队

(7)点分治

(8)LCT

【bzoj2049】洞穴勘测的更多相关文章

  1. 算法复习——LCT(bzoj2049洞穴勘测)

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

  2. BZOJ 2049: [Sdoi2008]Cave 洞穴勘测 (动态树入门)

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

  3. 【BZOJ2049】洞穴勘测(Link-Cut Tree)

    [BZOJ2049]洞穴勘测(Link-Cut Tree) 题面 题目描述 辉辉热衷于洞穴勘测. 某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别 ...

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

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

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

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

  6. 【BZOJ2049】 [Sdoi2008]Cave 洞穴勘测 LCT/并查集

    两种方法: 1.LCT 第一次LCT,只有link-cut和询问,无限T,到COGS上找了数据,发现splay里的父亲特判出错了(MD纸张),A了,好奇的删了反转T了.... #include < ...

  7. 【bzoj2049】[Sdoi2008]Cave 洞穴勘测 link-cut-tree

    2016-05-30  11:04:51 学习了link-cut-tree 二中神犇封禹的讲义感觉讲的超级清晰易懂啊(没有的可以q窝 算是模板吧 #include<bits/stdc++.h&g ...

  8. BZOJ-2049 Cave洞穴勘测 动态树Link-Cut-Tree (并查集骗分TAT)

    2049: [Sdoi2008]Cave 洞穴勘测 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 5833 Solved: 2666 [Submit] ...

  9. 【BZOJ2049】 [Sdoi2008]Cave 洞穴勘测

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

  10. 【BZOJ2049】【LCT】Cave 洞穴勘测

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

随机推荐

  1. Unit03 - 对象内存管理 、 继承的意义(上)

    Unit03 - 对象内存管理 . 继承的意义(上) 1.内存管理:由JVM来管理的  1)堆:    1.1)存储所有new出来的对象(包含成员变量)    1.2)没有任何引用所指向的对象就是垃圾 ...

  2. alibaba的FastJson(高性能JSON开发包),fastjson 使用demo

    这是关于FastJson的一个使用Demo,在Java环境下验证的 class User{ private int id; private String name; public int getId( ...

  3. 设计模式之 -- 状态模式(State)

     状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类.当控制一个对象的状态转换条件分支语句(if...else或switch...case)过于复杂时,可以此模式将状态的判断逻辑 ...

  4. ZeroClipboard 插件实现文本复制到剪贴板

    ZeroClipboard 的官网 点这里,github地址 点这里. 事例如下: 在引入 ZeroClipboard.js 之后, <button id="clip_button&q ...

  5. MS CRM商机产品等Mapping

    商机明细:报价明细  SELECT  EntityMapId  FROM    EntityMapBase  WHERE   TargetEntityName='quotedetail' AND So ...

  6. Objective-C语言内存管理

    • Objective-C为每个对象提供一个内部计数器,这个计数器跟踪对象的引用次数.所有类都继承自 NSObject 的对象retain和release方法. 如果使用了new.alloc或copy ...

  7. SelectMany等LINQ运算符的使用

    public class Racer : IComparable<Racer>, IFormattable { public string FirstName { get; set; } ...

  8. Web的Ajax应用开发模式(三)——Ajax的开发

    Ajax是XMLHttpRequest对象和JavaScript.CSS.HTML.DOM等多种技术的结合. 此处重点强调XMLHttpRequest的以下特点,所以测试人员在测试到WEB的Ajax应 ...

  9. IPV6

    (一) iOS 9.0.OS X 10.11 以上的系统 在IPv6的环境下 是支持IP地址访问网络的.所以大家测试机如果是 iOS9.0以上的系统,可以直接通过IP访问.这是因为iOS 9.0之后  ...

  10. 富文本常用封装(NSAttributedString浅析)

    最近经常遇到关于富文本的一些需求,特此封装了几个最常用的API分享给大家,但授之以鱼不如授之以渔,接下来会顺便谈谈NSAttributedString,确保你读了本篇文章能够自己封装关于富文本的API ...