洞穴探测

题目描述:

辉辉热衷于洞穴勘测。某天,他按照地图来到了一片被标记为JSZX的洞穴群地区。经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好两个洞穴。假如两个洞穴可以通过一条或者多条通道按一定顺序连接起来,那么这两个洞穴就是连通的,按顺序连接在一起的这些通道则被称之为这两个洞穴之间的一条路径。洞穴都十分坚固无法破坏,然而通道不太稳定,时常因为外界影响而发生改变,比如,根据有关仪器的监测结果,123号洞穴和127号洞穴之间有时会出现一条通道,有时这条通道又会因为某种稀奇古怪的原因被毁。辉辉有一台监测仪器可以实时将通道的每一次改变状况在辉辉手边的终端机上显示:如果监测到洞穴u和洞穴v之间出现了一条通道,终端机上会显示一条指令 Connect u v 如果监测到洞穴u和洞穴v之间的通道被毁,终端机上会显示一条指令 Destroy u v 经过长期的艰苦卓绝的手工推算,辉辉发现一个奇怪的现象:无论通道怎么改变,任意时刻任意两个洞穴之间至多只有一条路径。因而,辉辉坚信这是由于某种本质规律的支配导致的。因而,辉辉更加夜以继日地坚守在终端机之前,试图通过通道的改变情况来研究这条本质规律。然而,终于有一天,辉辉在堆积成山的演算纸中崩溃了……他把终端机往地面一砸(终端机也足够坚固无法破坏),转而求助于你,说道:“你老兄把这程序写写吧”。辉辉希望能随时通过终端机发出指令 Query u v,向监测仪询问此时洞穴u和洞穴v是否连通。现在你要为他编写程序回答每一次询问。已知在第一条指令显示之前,JSZX洞穴群中没有任何通道存在。

其中,n<=10000,m<=200000

动态树题目。用linkcut做。基本操作有link,cut,query,beroot等操作。link操作必须将其中一个点u变成根,然后,将它接在另一个点v下方。如果没有变成根,则连的边实际上是u的根到v的边。另外,在旋转rot中,只需要对当前节点pushdown即可。旋转完成后,将原来父亲的统计信息复制给当前节点,并接原父亲的统计信息更新即可;也可以对父亲节点pushdown,再对当前节点pushdown,旋转完成后不再需要更新需下传的信息。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define MAXN 20005
using namespace std;
int fa[MAXN],ch[MAXN][2];
bool tp[MAXN],rev[MAXN];
char opt[10];
int n,m,a,b;
void getint(int &num)
{
   char c;
   num=0;
   int flg=1;
   while((c=getchar())&&!isdigit(c))if(c==‘-‘)flg=-1;
   while(isdigit(c)){num=num*10+c-48;c=getchar();}
}
void pushdown(int r)
{
    if(rev[r]==0)return;
    rev[r]=0;
    swap(ch[r][0],ch[r][1]);
    if(ch[r][0])rev[ch[r][0]]^=1;
    if(ch[r][1])rev[ch[r][1]]^=1;
}
void rot(int x)
{
    if(x==0||tp[x])return;
    int y=fa[x],z=fa[y];
    pushdown(x);
    bool flg=(ch[y][1]==x);
    ch[y][flg]=ch[x][!flg];
    if(ch[y][flg])fa[ch[y][flg]]=y;
    fa[y]=x;
    ch[x][!flg]=y;
    fa[x]=z;
    if(tp[y]==0)ch[z][ch[z][1]==y]=x;
    tp[x]=tp[y];
    tp[y]=0;
    rev[x]=rev[y];
    rev[y]=0;
}
void splay(int x)
{
   pushdown(x);
   if(tp[x]==1)return;
   for(;tp[x]==0;rot(x))
   {
       int y=fa[x];
       if(y&&tp[y]==0)
       {
           int z=fa[y];
           bool flg=((ch[z][0]==y)==(ch[y][0]==x));
           if(flg==1)rot(y);
           else rot(x);
       }
   }
   pushdown(x);
}
int access(int x)
{
    int last=0;
    while(x)
    {
        splay(x);
        if(ch[x][1])tp[ch[x][1]]=1;
        ch[x][1]=last;
        if(last)tp[last]=0;
        last=x;
        x=fa[x];
    }
    return last;
}
void beroot(int x)
{
  access(x);splay(x);
  rev[x]^=1;
  pushdown(x);
}
int lca(int u,int v)
{
   access(u);
   return access(v);
}
void link(int u,int v)
{
    beroot(u);
    pushdown(u);
    access(v);
    fa[u]=v;
    tp[u]=1;
}
void cut(int u,int v)
{
    beroot(u);
    splay(v);
    if(fa[v]==u)
        fa[v]=0;
    else
    {fa[u]=0;
    ch[v][0]=0;
    tp[u]=1;
    }
}
int findroot(int u)
{
    access(u);
    splay(u);
    while(ch[u][0])
    {
        pushdown(u);
        u=ch[u][0];
    }
    return u;
}
bool linked(int u,int v)
{
    int x1=findroot(u);
    int x2=findroot(v);
    return x1==x2;
}
void init()
{
    for(int i=0;i<=n;i++)
     tp[i]=1;

}
int main()
{
    getint(n),getint(m);
    init();
    for(int i=0;i<m;i++)
    {
    scanf("%s",opt);
    getint(a),getint(b);
    if(opt[0]==‘C‘)link(a,b);
    else if(opt[0]==‘Q‘)
    {
    bool flag=linked(a,b);
    if(flag==1)printf("Yes\n");
    else printf("No\n");
    }
    else if(opt[0]==‘D‘)
        cut(a,b);
    }
    return 0;
}

  

时间: 2024-10-12 03:18:16

洞穴探测的相关文章

脑洞大开加偏执人格——可持久化treap版的Link Cut Tree

一直没有点动态树这个科技树,因为听说只能用Splay,用Treap的话多一个log.有一天脑洞大开,想到也许Treap也能从底向上Split.仔细思考了一下,发现翻转标记不好写,再仔细思考了一下,发现还是可以写的,只需要实时交换答案二元组里的两棵树,最后在吧提出来的访问节点放回去就行了.本着只学一种平衡树的想法,脑洞大开加偏执人格的开始写可持久化Treap版的Link Cut Tree... 写了才发现,常数硕大啊!!!代码超长啊!!!因为merge是从上到下,split从下到上,pushdow

新概念英语第三册41-50课(转)

Lesson 41  Illusions of Pastoral peace 宁静田园生活的遐想 1.宁静的乡村生活The quiet life of the country 还从来没有吸引过我.has never appealed to me. 宁静的乡村生活还从来没有吸引过我.The quiet life of the country has never appealed to me. 宁静的乡村生活还从来没有吸引过我. 2.城市出生 City born 和and城市长大 city bred

动态树 LCT

bzoj2049 洞穴探测 题目大意:lct(link,cut,判联通). #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #define maxnode 10005 using namespace std; struct lct{ int fa[maxnode],ch[maxnode][2],rev[maxnode],zh[maxnode]; void in

Web安全--XSS现代WAF规则探测及绕过技术

XSS现代WAF规则探测及绕过技术初始测试 1.使用无害的payload,类似<b>,<i>,<u>观察响应,判断应用程序是否被HTML编码,是否标签被过滤,是否过滤<>等等: 2.如果过滤闭合标签,尝试无闭合标签的payload(<b,<i,<marquee)观察响应: 3.尝试以下的payload 1 <script>alert(1);</script> 2 <script>prompt(1);<

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

Description 辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好两个洞穴.假如两个洞穴可以通过一条或者多条通道按一定顺序连接起来,那么这两个洞穴就是连通的,按顺序连接在一起的这些通道则被称之为这两个洞穴之间的一条路径.洞穴都十分坚固无法破坏,然而通道不太稳定,时常因为外界影响而发生改变,比如,根据有关仪器的监测结果,123号洞穴和127号洞穴之间有时会出现一条通

3381: [Usaco2004 Open]Cave Cows 2 洞穴里的牛之二

3381: [Usaco2004 Open]Cave Cows 2 洞穴里的牛之二 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 21  Solved: 18[Submit][Status][Discuss] Description 洞窟里有一道长长的通道.它由N(1≤N≤25000)段道尾相连构成,编号分别为1到N.每个通道有一个阈值,其范围在[1,10^9]依次通过i..j的通道,那奶牛的体重指数就不能超过i..j通道中阈值的最小值.贝茜有Q

TCP的定时器系列 — 零窗口探测定时器

主要内容:零窗口探测定时器的实现. 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd 出现以下情况时,TCP接收方的接收缓冲区将被塞满数据: 发送方的发送速度大于接收方的接收速度. 接收方的应用程序未能及时从接收缓冲区中读取数据. 当接收方的接收缓冲区满了以后,会把响应报文中的通告窗口字段置为0,从而阻止发送方的继续发送, 这就是TCP的流控制.当接收方的应用程序读取了接收缓冲区中的数据以后,接收方会发送一个ACK,通过 通告窗口字段告诉发送方自己又可

Spring:探测访问网站的设备类型

[该教程翻译自Spring官方,并进行适当删减.] 你将搭建的 创建一个Spring MVC项目,来探测访问网站的设备类型(手机.电脑.平板),并动态切换呈现的视图. 工具 一个文本编辑器,JDK1.6及以上,Maven 3.0+或者Gradle 1.11+.(本文将使用Maven) pom.xml清单: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven

[SDOI2008]Cave 洞穴勘测

Description 辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好两个洞穴.假如两个洞穴可以通过一条或者多条通道按一定顺序连接起来,那么这两个洞穴就是连通的,按顺序连接在一起的这些通道则被称之为这两个洞穴之间的一条路径.洞穴都十分坚固无法破坏,然而通道不太稳定,时常因为外界影响而发生改变,比如,根据有关仪器的监测结果,123号洞穴和127号洞穴之间有时会出现一条通