十二省联考

Posted wanghaoyu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了十二省联考相关的知识,希望对你有一定的参考价值。

异或粽子:

#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;
}

 

以上是关于十二省联考的主要内容,如果未能解决你的问题,请参考以下文章

「十二省联考 2019」希望

「十二省联考 2019」希望

十二省联考

[十二省联考2019]D2T2春节十二响

P5283 [十二省联考2019]异或粽子

[十二省联考2019]春节十二响