十二省联考
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; }
以上是关于十二省联考的主要内容,如果未能解决你的问题,请参考以下文章