码迷,mamicode.com
首页 > 其他好文 > 详细

十二省联考

时间:2019-05-06 19:11:09      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:ios   while   back   color   namespace   priority   size   long   break   

异或粽子:

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
typedef long long i64;
const int N=7e5+5;
const int D=64;
const int S=N*D;

int cnt,c[S][2],z[S];
i64 a[N],s[N];
int f[N];
struct inf{
    i64 s;
    int x; 
    bool operator<(const inf a)const{
        return s<a.s;
    }
};
priority_queue<inf>q;

int ins(i64 x,int v){
    int r,u,i;
    i64 t;
    r=u=++cnt;
    z[u]=z[v]+1;
    for(i=D-1;i>=0;i--){
        t=(x>>i)&1;
        c[u][t^1]=c[v][t^1];
        ++cnt;
        c[u][t]=cnt;
        u=cnt;
        v=c[v][t];
        z[u]=z[v]+1;
    }
    return r;
}

int dlt(i64 x,int v){
    int r,u,i;
    i64 t;
    if(z[v]==1)return 0;
    r=u=++cnt;
    z[u]=z[v]-1;
    for(i=D-1;i>=0;i--){
        t=(x>>i)&1;
        c[u][t^1]=c[v][t^1];
        if(z[c[v][t]]==1)
            break;
        ++cnt;
        c[u][t]=cnt;
        u=cnt;
        v=c[v][t]; 
        z[u]=z[v]-1;
    }
    return r;
}

i64 slv(i64 x,int v){
    i64 s=0,t;
    int i;
    for(i=D-1;i>=0;i--){
        t=((x>>i)&1)^1;
        if(c[v][t]){
            s+=t<<i;
            v=c[v][t];
        }
        else{
            s+=(t^1)<<i;
            v=c[v][t^1];
        }
    }
    return s;
}

int main()
{
    int n,m,i,v;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++){
        scanf("%lld",&a[i]);
        a[i]=a[i]^a[i-1];
        f[i]=ins(a[i-1],f[i-1]);
        s[i]=slv(a[i],f[i]);
        q.push((inf){a[i]^s[i],i});
    }
    i64 ans=0;
    for(i=1;i<=m;i++){
        v=q.top().x;
        ans+=a[v]^s[v];
        q.pop();
        f[v]=dlt(s[v],f[v]);
        if(f[v]){
            s[v]=slv(a[v],f[v]);
            q.push((inf){a[v]^s[v],v});
        }
    }
    printf("%lld",ans);
    return 0;
}

春节十二响(清明十二响):

#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
typedef long long i64;
const int N=2e5+5;

int c[N][2],a[N],s[N];
vector<int>e[N];

int unn(int u,int v){
    if(!u)return v;
    if(!v)return u;
    if(a[u]<a[v])swap(u,v);
    c[u][1]=unn(c[u][1],v);
    s[u]+=s[v];
    if(s[c[u][1]]>s[c[u][0]])
        swap(c[u][0],c[u][1]);
    return u;
}

int mrg(int u,int v){
    if(!u)return v;
    if(!v)return u;
    int r=0,p,q;
    while(u&&v){
        p=u;
        u=unn(c[u][0],c[u][1]);
        c[p][0]=c[p][1]=0;
        s[p]=1;
        q=v;
        v=unn(c[v][0],c[v][1]);
        c[q][0]=c[q][1]=0;
        s[q]=1;
        if(a[p]<a[q])swap(p,q);
        r=unn(r,p);
    }
    if(u)r=unn(r,u);
    if(v)r=unn(r,v);
    return r;
}

int dfs(int v,int p){
    int r=0,i,u;
    for(i=0;i<e[v].size();i++)
        if(e[v][i]!=p)
            r=mrg(r,dfs(e[v][i],v));
    c[v][0]=c[v][1]=0;
    s[v]=1;
    r=unn(v,r);
}

i64 gtsz(int v){
    if(!v)return 0;
    return (i64)a[v]+gtsz(c[v][0])+gtsz(c[v][1]);
}

int main()
{
    int n,i,f;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        scanf("%d",&a[i]);
    for(i=2;i<=n;i++){
        scanf("%d",&f);
        e[f].push_back(i);
    }
    printf("%lld",gtsz(dfs(1,0)));
    return 0;
}

 

十二省联考

标签:ios   while   back   color   namespace   priority   size   long   break   

原文地址:https://www.cnblogs.com/wanghaoyu/p/Jointly-GivenEntranceExam2019.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!