bzoj 3282: Tree LCT第三题

这题一度想精神AC。。
但想了下,人生的第三题LCT就精神AC好像不太好。。
于是很玄学地弄了很久

这题就是LCT的裸题。。
没什么好说的

下面都是废话

然而我TLE了很多发。。
smg。。
完全看不出来好不好。。
最后改用了一下wohenshuai大佬的splay,27s卡过去了
等等,为什么是卡过去。。
我仔细看了下代码。。
几乎是一样好不因为我一开始就是用他的模板
然而时间差了十倍,他是2s,我是27s
QAQ被虐哭了好不
然后我就开始找不同。。
发现我用了读入优化。。
去掉试试TLE了。。
不玩了,这题说白了就是不想我过

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<stack>
using namespace std;
const int N=300005;
struct qq
{
    int son[2],fa;
    bool rev;
    int c;//和
    int d;
    void bt (int x)
    {
        son[0]=son[1]=fa=rev=0;
        d=c=x;
    };
}s[N];
int n,m;
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
void Push_down (int x)
{
    if (s[x].rev)
    {
        s[x].rev=false;
        s[s[x].son[0]].rev^=1;s[s[x].son[1]].rev^=1;
        swap(s[x].son[0],s[x].son[1]);
    }
}
bool Is_root(int x)
{
  if((s[s[x].fa].son[0]!=x)&&(s[s[x].fa].son[1]!=x)) return true;
  return false;
}
void update (int x)
{
    int s1=s[x].son[0],s2=s[x].son[1];
    s[x].c=s[s1].c^s[s2].c^s[x].d;
}
void Rotate(int x)
{
  int y=s[x].fa; int z=s[y].fa;
  int a=s[y].son[1]==x; int b=s[z].son[1]==y;
  int g=s[x].son[a^1];
  if(!Is_root(y)) s[z].son[b]=x; s[x].fa=z;
  s[x].son[a^1]=y; s[y].fa=x;
  s[y].son[a]=g; if(g) s[g].fa=y;
  update(y);
}
stack<int>S;
void Preserve(int x)
{
  while(!Is_root(x)) S.push(x),x=s[x].fa;
  S.push(x);
  while(!S.empty()) Push_down(S.top()),S.pop();
}
void Splay(int x)
{
  Preserve(x);
  while(!Is_root(x))
  {
    int y=s[x].fa; int z=s[y].fa;
    int a=s[y].son[1]==x; int b=s[z].son[1]==y;
    if(Is_root(y)) Rotate(x);
    else
    {
      if(a==b) Rotate(y);
      else Rotate(x);
      Rotate(x);
    }
  }update(x);
}
void Access (int x)
{
    int last=0;
    while (x!=0)
    {
        Splay(x);
        s[x].son[1]=last;
        update(x);
        last=x;
        x=s[x].fa;
    }
}
void Make_root (int x)
{
    Access(x);
    Splay(x);
    s[x].rev^=1;
}
void Split (int x,int y)
{
    Make_root(x);
    Access(y);
    Splay(y);
}
int find_root(int x)
{
    Access(x);
    Splay(x);
    while (s[x].son[0]!=0)  x=s[x].son[0];
    return x;
}
void Link (int x,int y)
{
    Make_root(y);
    s[y].fa=x;
}
void Cut (int x,int y)
{
    Split(x,y);
    if (s[y].son[0]==x)
    {
        s[x].fa=0;
        s[y].son[0]=0;
        update(y);
    }
}
int main()
{
    n=read();m=read();
    for (int u=1;u<=n;u++)   s[u].bt(read());
    while (m--)
    {
        int c=read();
        if (c==0)
        {
            int x=read(),y=read();
            Split(x,y);printf("%d\n",s[y].c);
        }
        else if (c==1)
        {
            int x=read(),y=read();
            if (find_root(x)==find_root(y))
                continue;
            Link (x,y);
        }
        else if (c==2)
        {
            int x=read(),y=read();
            if(find_root(x)!=find_root(y)) continue;
            Split(x,y);
            s[y].son[0]=s[s[y].son[0]].fa=0; update(y);
        }
        else
        {
            int x=read(),y=read();
            Access(x);Splay(x);s[x].d=y;update(x);
        }
    }
    return 0;
}
内容概要:本文详细介绍了施耐德M580系列PLC的存储结构、系统硬件架构、上电写入程序及CPU冗余特性。在存储结构方面,涵盖拓扑寻址、Device DDT远程寻址以及寄存器寻址三种方式,详细解释了不同类型的寻址方法及其应用场景。系统硬件架构部分,阐述了最小系统的构建要素,包括CPU、机架和模块的选择与配置,并介绍了常见的系统拓扑结构,如简单的机架间拓扑和远程子站以太网菊花链等。上电写入程序环节,说明了通过USB和以太网两种接口进行程序下载的具体步骤,特别是针对初次下载时IP地址的设置方法。最后,CPU冗余部分重点描述了热备功能的实现机制,包括IP通讯地址配置和热备拓扑结构。 适合人群:从事工业自动化领域工作的技术人员,特别是对PLC编程及系统集成有一定了解的工程师。 使用场景及目标:①帮助工程师理解施耐德M580系列PLC的寻址机制,以便更好地进行模块配置和编程;②指导工程师完成最小系统的搭建,优化系统拓扑结构的设计;③提供详细的上电写入程序指南,确保程序下载顺利进行;④解释CPU冗余的实现方式,提高系统的稳定性和可靠性。 其他说明:文中还涉及一些特殊模块的功能介绍,如定时器事件和Modbus串口通讯模块,这些内容有助于用户深入了解M580系列PLC的高级应用。此外,附录部分提供了远程子站和热备冗余系统的实物图片,便于用户直观理解相关概念。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值