zoukankan      html  css  js  c++  java
  • CodeForces 1447E Xor Tree

    给一堆数字,每个数字找和自己异或最小的连接,现在求删除最少几个点能留下一棵树

     

    就是分治搞树,第i位置都是0的之间有边,i位为1的数字之间有变,类似树形dp的分治一下就得出结论了,

     

    第i为是1的要和第i为是0的连接,只能是i位为1的集合都消除了才可能,具体看代码吧,挺简单的。。。。

    #include<iostream>
    #include<vector>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    const int maxn = 2e5+11;
    
    int list[maxn];
    vector<int>aa;
    
    ll ans = 0;
    
    
    int dfs(vector<int>ins,int dep){
    	if(dep < 0) return 0;
    	if(ins.size() == 0) return 0;
    	if(ins.size() == 1) return 1;
    	if(ins.size() == 2) return 2;
    	
    	vector<int>cns1,cns2;
    	for(int i=0;i<ins.size();i++){
    		int t = (ins[i] >> dep)&1;
    		if(t == 0) cns1.push_back(ins[i]);
    		else cns2.push_back(ins[i]);
    	}
    	int c = 0;
    	int a = dfs(cns1,dep-1);
    	int b = dfs(cns2,dep-1);
    	c += max(a,b);
    	if(min(a,b) != 0){
    		c++;	
    	}
    	
    	return c;
    }
    
    int main(){
    	int n;
    	scanf("%d",&n);
    	
    	for(int i=0;i<n;i++){
    		scanf("%d",&list[i]);
    	}
    	for(int i=0;i<n;i++){
    		aa.push_back(list[i]);
    	}
    	ans = dfs(aa,30);
    	printf("%d
    ",n - ans);
    	return 0;
    }
    

      

  • 相关阅读:
    Unique Binary Search Trees 解答
    Unique Paths II 解答
    Unique Paths 解答
    Maximum Subarray 解答
    Climbing Stairs 解答
    House Robber II 解答
    House Robber 解答
    Valid Palindrome 解答
    Container With Most Water 解答
    Remove Duplicates from Sorted List II 解答
  • 原文地址:https://www.cnblogs.com/lesning/p/14002137.html
Copyright © 2011-2022 走看看