zoukankan      html  css  js  c++  java
  • P5283 [十二省联考2019]异或粽子 可持久化字典树

      

    非常类似那道超级钢琴

    维护一个可持久化01trie即可

    #include<bits/stdc++.h>
    using namespace std;
    #define rep(i,a,b) for(int i=(a);i<=(b);i++)
    #define repp(i,a,b) for(int i=(a);i>=(b);--i)
    #define ll long long
    #define see(x) (cerr<<(#x)<<'='<<(x)<<endl)
    #define inf 0x3f3f3f3f
    #define CLR(A,v)  memset(A,v,sizeof A)
    //////////////////////////////////
    const int N=2e6+10;
    int T[N],t[N<<5][2],ncnt,siz[N<<5];
    void upnode(int k,ll val,int v,int pre,int &pos)
    {
        pos=++ncnt;
        t[pos][0]=t[pre][0];
        t[pos][1]=t[pre][1];
        siz[pos]=siz[pre]+v;
        if(k==-1)return ;
        if( (val>>k)&1 )upnode(k-1,val,v,t[pre][1],t[pos][1]);
        else upnode(k-1,val,v,t[pre][0],t[pos][0]);
    }
    ll qmax(int k,ll val,int pos)
    {
        if(k==-1)return 0;
        int c=(val>>k)&1;
        if(siz[t[pos][c^1]])return qmax(k-1,val,t[pos][c^1])+(1<<k);
        else return qmax(k-1,val,t[pos][c]);
    }
    struct node{ll v;int x;};
    bool operator< (node a,node b){return a.v<b.v;}
    priority_queue<node>q;
    ll a[N],ans;int n,k;
    int main()
    {
        scanf("%d%d",&n,&k);
        rep(i,1,n)
        {
            ll x;scanf("%lld",&x);a[i]=a[i-1]^x;
        }
        //upnode(32,0,1,T[0],T[0]);
        rep(i,1,n)upnode(32,a[i-1],1,T[i-1],T[i]);
        
        rep(i,1,n)q.push((node){qmax(32,a[i],T[i]),i});
        while(k--)
        {
            node u=q.top();q.pop();
            ans+=u.v;
            upnode(32,u.v^a[u.x],-1,T[u.x],T[u.x]);
            q.push((node){qmax(32,a[u.x],T[u.x]),u.x});
        }
        cout<<ans;
    
        return 0;
    }
    View Code
  • 相关阅读:
    轮播图
    原生js实现分页效果(带实例)
    mint-ui Toast icon 图标
    阮小二买彩票
    js事件冒泡和事件捕捉
    html,css,js加载顺序
    单调栈-哈希表-768. 最多能完成排序的块 II
    同余问题-三整除系列
    动态规划-区间dp-单调栈-1130. 叶值的最小代价生成树
    动态规划-1Ddp-983. 最低票价
  • 原文地址:https://www.cnblogs.com/bxd123/p/11514289.html
Copyright © 2011-2022 走看看