codeforces 888g Xor-MST
2018-02-27 10:16
417 查看
题意:给你n个点,点权为a[i],连接两个点的代价是a[i]^a[j],求这n个点的最小生成树。
我们可以首先有kruskal的贪心算法,我们可以知道肯定如果有两个数字只有最低位不一样,那么肯定要将这两个数字连一条边。
那么我们可以通过分治的方法进行实现,从高位到低位进行递归,将每一位是0与是1的分成两堆,再进行递归,在回溯的时候,肯定保证了全是0的一堆集合与全是1的一堆集合里面已经分别合并到了一起,那么我们只需要找到一个1集合里的数字使得其与0集合异或值最小即可将两堆集合以最小的代价合并到一起,我们可以将0集合建一棵0,1字典树,对1集合里的每个数字在0,1字典树里面查找异或最小值即可。因为每一次都保证了将可利用的最小代价利用了,类似kruskal的思想,这样求出来的就是最小生成树。
下附AC代码。
我们可以首先有kruskal的贪心算法,我们可以知道肯定如果有两个数字只有最低位不一样,那么肯定要将这两个数字连一条边。
那么我们可以通过分治的方法进行实现,从高位到低位进行递归,将每一位是0与是1的分成两堆,再进行递归,在回溯的时候,肯定保证了全是0的一堆集合与全是1的一堆集合里面已经分别合并到了一起,那么我们只需要找到一个1集合里的数字使得其与0集合异或值最小即可将两堆集合以最小的代价合并到一起,我们可以将0集合建一棵0,1字典树,对1集合里的每个数字在0,1字典树里面查找异或最小值即可。因为每一次都保证了将可利用的最小代价利用了,类似kruskal的思想,这样求出来的就是最小生成树。
下附AC代码。
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> #define maxn 200005 using namespace std; typedef long long ll; ll ans; int tes=0; int n,tot; int a[maxn]; int son[maxn*30][2]; void insert(int t) { int now=0; for(int i=29;i>=0;i--) { int nex=((t>>i)&1); if(!son[now][nex]) son[now][nex]=++tot; now=son[now][nex]; } } int query(int t) { int now=0,res=0; for(int i=29;i>=0;i--) { int nex=((t>>i)&1); if(son[now][nex]) now=son[now][nex]; else res|=(1<<i),now=son[now][!nex]; } return res; } void dfs(int l,int r,int dep) { if(dep==-1 || l>r) return; int mid=l,flag=false; for(int i=l;i<=r;i++) { mid=i; if((1<<dep)&a[i]) { flag=true; break; } } if(!flag) mid=r+1; dfs(l,mid-1,dep-1);dfs(mid,r,dep-1); if(l>mid-1 || mid>r) return; for(int i=l;i<=mid-1;i++) insert(a[i]); ll res=123495673233ll; for(int i=mid;i<=r;i++) { res=min(res,(ll)query(a[i])); } ans+=res; for(int i=0;i<=tot;i++) son[i][0]=son[i][1]=0; tot=0; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); sort(a+1,a+1+n); dfs(1,n,29); printf("%I64d\n",ans); }
相关文章推荐
- codeforces 888G Xor-MST(01字典树)
- CodeForces 888G Xor-MST(Sollin MST+Trie)
- Codeforces 888G XOR MST(分治)
- Codeforces 888G Xor-MST - 分治 - 贪心 - Trie
- codeforces 888G Xor-MST
- CodeForces 827D Round #423 Div2F&Div1D:LCA+路径压缩+MST(最小生成树)
- [Codeforces]160D - Edges in MST
- codeforces 160D - Edges in MST
- Codeforces 160D Edges in MST【思维+并查集+求桥(有重边)】
- Codeforces 472D Design Tutorial: Inverse the Problem【MST+SPFA+思维】
- 【Codeforces 733F】 Drivers Dissatisfaction 【MST+bianry lifting】
- codeforces 888G Xor-MST Sollin算法求最小生成树,0-1异或True
- CodeForces 472 D ,E,F (MST,构造,线性代数)(待补)
- [Codeforces 888G]Xor-MST
- Codeforces 472C - Design Tutorial: Make It Nondeterministic(模拟)
- codeforces 472BDesign Tutorial: Learn from Life(简单贪心)
- codeforces 808C——Tea Party(贪心)
- 【22.70%】【codeforces 591C】 Median Smoothing
- HDU 5627 Clarke and MST 求&的最大生成树 贪心
- codeforces-702D-Road to Post Office