• 睡觉困难综合征


    为什么每次数据结构题主程序都写挂

    #include<cstdio>
    #include<vector>
    #include<iostream>
    #include<algorithm>
    typedef unsigned long long u64;
    struct func{
        u64 a,b;
        inline func(u64 x=-1ull,u64 y=0){a=x,b=y;}
        inline u64 operator()(u64 x)const{return(x&a)|(~x&b);}
        inline func operator()(func x)const{return func(x(a),x(b));}
    };
    int n,m,k;
    const auto getxor = [](u64 x){return func(~x,x);};
    const auto getand = [](u64 x){return func(x,0);};
    const auto getor = [](u64 x){return func(-1ull,x);};
    const int maxn = 100100;
    func v[maxn],sum1[maxn],sum2[maxn];
    int son[maxn][2],fa[maxn],tag[maxn],st[maxn],top;
    inline int get(int x,int p=1){return son[fa[x]][p]==x;}
    inline int is_root(int x){return!(get(x)||get(x,0));}
    inline void up(int x){
        sum1[x]=sum1[son[x][0]](v[x])(sum1[son[x][1]]);
        sum2[x]=sum2[son[x][1]](v[x])(sum2[son[x][0]]);
    }
    inline void puttag(int x){if(x)std::swap(sum1[x],sum2[x]),tag[x]^=1;}
    inline void down(int x){
        if(tag[x]){
            std::swap(son[x][1],son[x][0]);
            puttag(son[x][1]),puttag(son[x][0]);
            tag[x]=0;
        }
    }
    inline void rotate(int x){
        int y=fa[x],z=fa[y],b=get(x);
        if(!is_root(y))son[z][get(y)]=x;
        son[y][b]=son[x][!b],son[x][!b]=y;
        fa[son[y][b]]=y,fa[y]=x,fa[x]=z;
        up(y),up(x);
    }
    inline void splay(int x){
        st[top=1]=x;
        for(int y=x;!is_root(y);st[++top]=y=fa[y]);
        for(;top;--top)down(st[top]);
        for(;!is_root(x);rotate(x))
            if(!is_root(fa[x]))rotate(get(x)^get(fa[x])?x:fa[x]);
        up(x);
    }
    inline void access(int x){for(int t=0;x;son[x][1]=t,t=x,x=fa[x])splay(x);}
    inline void make_root(int x){access(x),splay(x),puttag(x);}
    inline void split(int x,int y){make_root(x),access(y),splay(y);}
    std::vector<int>e[maxn];
    int vis[maxn];
    inline void dfs(int x){vis[x]=1;for(int i:e[x])if(!vis[i])fa[i]=x,dfs(i);}
    int main(){
        std::ios::sync_with_stdio(false),std::cin.tie(0);
        std::cin >> n >> m >> k;
        for(int i=1;i<=n;++i){
            int a;u64 b;
            std::cin >> a >> b;
            if(a==1)v[i]=getand(b);
            if(a==2)v[i]=getor(b);
            if(a==3)v[i]=getxor(b);
            up(i);
        }
        for(int i=1,x,y;i<n;++i)
            std::cin>>x>>y,e[x].push_back(y),e[y].push_back(x);
        dfs(1);
        for(int i=1;i<=m;++i){
            int q,x,y;u64 z;
            std::cin >> q >> x >> y >> z;
            if(q==1){
                split(x,y);
                func o = sum1[y];
                u64 res=0;
                for(int i=63;~i;--i)
                    if(o(res|1ull<<i)>o(res)&&(res|1ull<<i)<=z)res|=1ull<<i;
                std::cout << o(res) << '
    ';
            }else{
                make_root(x);
                if(y==1)v[x]=getand(z);
                if(y==2)v[x]=getor(z);
                if(y==3)v[x]=getxor(z);
                up(x);
            }
        }
    }
  • 相关阅读:
    最小生成树Prim算法和Kruskal算法(转)
    tarjan有向图的强连通
    匈牙利算法
    字符类数组的常用函数
    三层登录——C#版
    监考风波
    SQL Server 2012 安装——安装 OR 卸载
    SQL Server 2012安装——.net framework 3.5离线安装
    坚定自我 守住寂寞
    浅谈三层
  • 原文地址:https://www.cnblogs.com/skip1978/p/10353150.html
Copyright © 2020-2023  润新知