• BZOJ 4811 树链剖分+线段树


    思路:

    感觉这题也可神了..

    还是我太弱

    首先发现每一位不会互相影响,可以把每一位分开考虑,然后用树链剖分或者LCT维护这个树

    修改直接修改,询问的时候算出来每一位填0,1经过这条链的变换之后得到的值

    考虑贪心,从高往低,如果这一位填0可以得到1,那么填0一定是最优的

    否则如果可以填1,就把这一位填为1

    复杂度是nklog^2n或者nklogn,只能通过50%的数据

    发现可以并行计算这k位,复杂度降为nlog^2n的树链剖分或者nlogn的LCT,可以通过100%的数据

    这个题没有卡常,合并信息不是O( 1 )的算法没有通过是很正常的吧。。。

    还有树链剖分没法做到logn,每条链建线段树也是log^2n的,还不能搞子树,似乎常数也一般。。。

    最优复杂度是log^2n,不过期望下大概是lognloglogn的感觉

    这个题的最优复杂度为O( n + q( logn + k ) ),至少目前来说是这样的

    from 洛谷的题解.

    unsigned long long +各种位运算

    线段树要分别维护向上的和向下的

    //By SiriusRen
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    const int N=100005;
    typedef unsigned long long ull;
    ull a[N],zz,now,ans;
    int n,m,k,op,xx,yy,Op[N],first[N],next[N*2],v[N*2],tot;
    int size[N],fa[N],son[N],deep[N],rev[N],dfn[N],cnt,top[N];
    struct Tree{
        ull v0,v1;Tree(){}
        Tree(int op,ull x){if(op==1)v0=0,v1=x;else if(op==2)v0=x,v1=~0;else v0=x,v1=(~0)^x;}
        Tree(ull x,ull y){v0=x,v1=y;}
    }trl[N*8],trr[N*8];
    Tree operator+(Tree x,Tree y){return Tree((x.v0&y.v1)|((~x.v0)&y.v0),(x.v1&y.v1)|((~x.v1)&y.v0));}
    void add(int x,int y){v[tot]=y,next[tot]=first[x],first[x]=tot++;}
    void dfs(int x){
        size[x]=1;
        for(int i=first[x];~i;i=next[i])if(v[i]!=fa[x]){
            fa[v[i]]=x,deep[v[i]]=deep[x]+1,dfs(v[i]),size[x]+=size[v[i]];
            if(size[v[i]]>size[son[x]])son[x]=v[i];
        }
    }
    void dfs2(int x,int tp){
        rev[dfn[x]=++cnt]=x;top[x]=tp;
        if(son[x])dfs2(son[x],tp);
        for(int i=first[x];~i;i=next[i])if(v[i]!=fa[x]&&v[i]!=son[x])dfs2(v[i],v[i]);
    }
    void build(int l,int r,int pos){
        if(l==r){trl[pos]=trr[pos]=Tree(Op[rev[l]],a[rev[l]]);return;}
        int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
        build(l,mid,lson),build(mid+1,r,rson);
        trl[pos]=trl[lson]+trl[rson],trr[pos]=trr[rson]+trr[lson];
    }
    void insert(int l,int r,int pos,int num){
        if(l==r){trl[pos]=trr[pos]=Tree(Op[rev[l]],a[rev[l]]);return;}
        int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
        if(mid<num)insert(mid+1,r,rson,num);
        else insert(l,mid,lson,num);
        trl[pos]=trl[lson]+trl[rson],trr[pos]=trr[rson]+trr[lson];
    }
    Tree query(int l,int r,int pos,int L,int R,int f){
        if(l>=L&&r<=R)return f?trr[pos]:trl[pos];
        int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
        if(mid<L)return query(mid+1,r,rson,L,R,f);
        else if(mid>=R)return query(l,mid,lson,L,R,f);
        else{if(!f)return query(l,mid,lson,L,R,f)+query(mid+1,r,rson,L,R,f);
            else return query(mid+1,r,rson,L,R,f)+query(l,mid,lson,L,R,f);
        }
    }
    Tree solve(int x,int y){
        Tree vx=Tree((int)3,0ull),vy=Tree((int)3,0ull);
        int fx=top[x],fy=top[y];
        while(fx!=fy)
            if(deep[fx]>deep[fy])vx=vx+query(1,n,1,dfn[fx],dfn[x],1),x=fa[fx],fx=top[x];
            else vy=query(1,n,1,dfn[fy],dfn[y],0)+vy,y=fa[fy],fy=top[y];
        if(deep[x]>deep[y])return vx+query(1,n,1,dfn[y],dfn[x],1)+vy;
        return vx+query(1,n,1,dfn[x],dfn[y],0)+vy;
    }
    int main(){
        memset(first,-1,sizeof(first)),deep[1]=1;
        scanf("%d%d%d",&n,&m,&k);
        for(int i=1;i<=n;i++)scanf("%d%llu",&Op[i],&a[i]);
        for(int i=1;i<n;i++)scanf("%d%d",&xx,&yy),add(xx,yy),add(yy,xx);
        dfs(1),dfs2(1,1),build(1,n,1);
        while(m--){
            scanf("%d%d%d%llu",&op,&xx,&yy,&zz);
            if(op==2)Op[xx]=yy,a[xx]=zz,insert(1,n,1,dfn[xx]);
            else{Tree t=solve(xx,yy);now=ans=0;
                for(int i=k-1;~i;i--)
                    if(t.v0&(1ull<<i))ans+=1ull<<i;
                    else if(t.v1&(1ull<<i)&&now+(1ull<<i)<=zz)now+=1ull<<i,ans+=1ull<<i;
                printf("%llu
    ",ans);
            }
        }
    }
  • 相关阅读:
    Linux 下安装 mysql8
    Git 上传本地项目到Github
    vue+vscode+nodejs 开发环境搭建
    window下 局域网内使用mysql,mysql 开启远程访问权限
    spring boot application 配置详情
    spring boot starter列表
    【第一篇】spring boot 快速入门
    Spring中手动增加配置文件中占位符引用的变量
    spring容器
    springmvc细节篇
  • 原文地址:https://www.cnblogs.com/SiriusRen/p/6685529.html
Copyright © 2020-2023  润新知