• BZOJ3282


    Portal to BZOJ3282Portal to 洛谷P3690

    Description

    给定(n(nleq3 imes10^5))个点以及每个点的权值,要你处理接下来的(m(mleq3 imes10^5))个操作。操作有4种:

    • 询问从(u)(v)的路径上的点的权值的xor和。保证(u)(v)是联通的。
    • 连接边((u,v)),若(u)(v)已经联通则无需连接。
    • 删除边((u,v)),不保证边((u,v))存在。
    • 将点(u)上的权值变成(x)

    Solution

    也是一道lct裸题。
    进行删除操作时,存在边((p,q))的条件是(p,q)联通,path(p,q)ch[q][0]==p&&ch[p][1]==0。这代表着路径((p,q))上不存在深度处于(p,q)之间的点,也就是(p,q)直接相连。

    Code

    //Tree
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    inline char gc()
    {
        static char now[1<<16],*S,*T;
        if(S==T) {T=(S=now)+fread(now,1,1<<16,stdin); if(S==T) return EOF;}
        return *S++;
    }
    inline int read()
    {
        int x=0; char ch=gc();
        while(ch<'0'||'9'<ch) ch=gc();
        while('0'<=ch&&ch<='9') x=x*10+ch-'0',ch=gc();
        return x;
    }
    int const N=3e5+10;
    int n,m;
    int fa[N],ch[N][2],val[N],sum[N]; bool rev[N];
    int wh(int p) {return p==ch[fa[p]][1];}
    bool notRt(int p) {return p==ch[fa[p]][wh(p)];}
    void rever(int p) {rev[p]^=1; swap(ch[p][0],ch[p][1]);}
    void update(int p) {sum[p]=val[p]^sum[ch[p][0]]^sum[ch[p][1]];}
    void pushdw(int p) {if(rev[p]) rever(ch[p][0]),rever(ch[p][1]),rev[p]=false;}
    void pushdwRt(int p) {if(notRt(p)) pushdwRt(fa[p]); pushdw(p);}
    void rotate(int p)
    {
        int q=fa[p],r=fa[q],w=wh(p);
        fa[p]=r; if(notRt(q)) ch[r][wh(q)]=p;
        fa[ch[q][w]=ch[p][w^1]]=q;
        fa[ch[p][w^1]=q]=p;
        update(q),update(p);
    }
    void splay(int p)
    {
        pushdwRt(p);
        for(int q=fa[p];notRt(p);rotate(p),q=fa[p]) if(notRt(q)) rotate(wh(p)==wh(q)?q:p);
    }
    void access(int p) {for(int q=0;p;q=p,p=fa[p]) splay(p),ch[p][1]=q,update(p);}
    void makeRt(int p) {access(p); splay(p),rever(p);}
    void path(int p,int q) {makeRt(p); access(q),splay(q);}
    int find(int p) {access(p),splay(p); while(ch[p][0]) p=ch[p][0]; return p;}
    void link(int p,int q) {makeRt(p); fa[p]=q;}
    void cut(int p,int q) {path(p,q); if(ch[q][0]==p&&ch[p][1]==0) fa[p]=ch[q][0]=0,update(q);}
    int query(int p,int q) {path(p,q); return sum[q];}
    int main()
    {
        n=read(),m=read();
        for(int i=1;i<=n;i++) val[i]=sum[i]=read();
        for(int i=1;i<=m;i++)
        {
            int opt=read(),u=read(),v=read();
            if(opt==0) printf("%d
    ",query(u,v));
            else if(opt==1&&find(u)!=find(v)) link(u,v); 
            else if(opt==2&&find(u)==find(v)) cut(u,v);
            else if(opt==3) splay(u),val[u]=v,update(u);
        }
        return 0;
    }
    

    P.S.

    也算是压行比较严重了

  • 相关阅读:
    浅析String.intern()方法
    com.alibaba.druid.pool.DruidPooledConnection cannot be cast to oracle.jdbc.OracleConnection 异常解决办法
    ChannelEventRunnable handle RECEIVED operation error, channel is NettyChannel解决方法
    jsch channel is not opened原因及解决
    学习地址(oraclemysqllinux)
    python中数据分析常用函数整理
    Python之使用Pandas库实现MySQL数据库的读写
    Python数据分析
    如何用sql查询出连续三个月金额大于50的记录
    【Python项目实战】Pandas:让你像写SQL一样做数据分析(一)
  • 原文地址:https://www.cnblogs.com/VisJiao/p/BZOJ3282.html
Copyright © 2020-2023  润新知