BZOJ 2843 极地旅行社

题目链接

https://www.lydsy.com/JudgeOnline/problem.php?id=2843

题解

裸的不能再裸的LCT。

代码

#include <cstdio>
#include <algorithm>

int read()
{
  int x=0,f=1;
  char ch=getchar();
  while((ch<'0')||(ch>'9'))
    {
      if(ch=='-')
        {
          f=-f;
        }
      ch=getchar();
    }
  while((ch>='0')&&(ch<='9'))
    {
      x=x*10+ch-'0';
      ch=getchar();
    }
  return x*f;
}

const int maxn=30000;

struct node
{
  node *son[2],*fa;
  int sum,val,rev;
};

int n,m,cnt;
char s[10];
node tnode[maxn+10];

node* newnode(int val)
{
  node *x=&tnode[++cnt];
  x->fa=x->son[0]=x->son[1]=NULL;
  x->sum=x->val=val;
  x->rev=0;
  return x;
}

namespace lct
{
  int pushdown(node *x)
  {
    if(x->rev)
      {
        std::swap(x->son[0],x->son[1]);
        if(x->son[0]!=NULL)
          {
            x->son[0]->rev^=1;
          }
        if(x->son[1]!=NULL)
          {
            x->son[1]->rev^=1;
          }
        x->rev=0;
      }
    return 0;
  }

  int updata(node *x)
  {
    x->sum=x->val;
    if(x->son[0]!=NULL)
      {
        x->sum+=x->son[0]->sum;
      }
    if(x->son[1]!=NULL)
      {
        x->sum+=x->son[1]->sum;
      }
    return 0;
  }

  int t(node *x)
  {
    return x==x->fa->son[1];
  }

  int isroot(node *x)
  {
    if(x->fa==NULL)
      {
        return 1;
      }
    if((x->fa->son[0]!=x)&&(x->fa->son[1]!=x))
      {
        return 1;
      }
    return 0;
  }

  int rotate(node *x)
  {
    node *f=x->fa;
    pushdown(f);
    pushdown(x);
    int k=t(x);
    x->fa=f->fa;
    if(!isroot(f))
      {
        f->fa->son[t(f)]=x;
      }
    f->son[k]=x->son[!k];
    if(x->son[!k]!=NULL)
      {
        x->son[!k]->fa=f;
      }
    f->fa=x;
    x->son[!k]=f;
    updata(f);
    updata(x);
    return 0;
  }

  int splayroot(node *x)
  {
    while(!isroot(x))
      {
        node *f=x->fa;
        if(isroot(f))
          {
            rotate(x);
          }
        else if(t(f)==t(x))
          {
            rotate(f);
            rotate(x);
          }
        else
          {
            rotate(x);
            rotate(x);
          }
      }
    return 0;
  }

  int access(node *x)
  {
    node *last=NULL;
    while(x!=NULL)
      {
        splayroot(x);
        pushdown(x);
        x->son[1]=last;
        updata(x);
        last=x;
        x=x->fa;
      }
    return 0;
  }

  int makeroot(node *x)
  {
    access(x);
    splayroot(x);
    x->rev^=1;
    return 0;
  }

  int link(node *x,node *y)
  {
    makeroot(x);
    node *f=y;
    while(f->fa!=NULL)
      {
        f=f->fa;
      }
    if(f==x)
      {
        return -1;
      }
    makeroot(y);
    y->fa=x;
    return 0;
  }

  int getsum(node *x,node *y)
  {
    makeroot(x);
    node *f=y;
    while(f->fa!=NULL)
      {
        f=f->fa;
      }
    if(f!=x)
      {
        return -1;
      }
    access(y);
    splayroot(y);
    return y->sum;
  }

  int modify(node *x,int v)
  {
    splayroot(x);
    x->val=v;
    updata(x);
    return 0;
  }
}

int main()
{
  n=read();
  for(int i=1; i<=n; ++i)
    {
      int v=read();
      newnode(v);
    }
  m=read();
  while(m--)
    {
      scanf("%s",s);
      int a=read(),b=read();
      if(s[0]=='b')
        {
          puts(lct::link(&tnode[a],&tnode[b])?"no":"yes");
        }
      else if(s[0]=='p')
        {
          lct::modify(&tnode[a],b);
        }
      else
        {
          int ans=lct::getsum(&tnode[a],&tnode[b]);
          if(ans==-1)
            {
              puts("impossible");
            }
          else
            {
              printf("%d\n",ans);
            }
        }
    }
  return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值