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

      

  • 相关阅读:
    总结
    spring boot 使用mongodb基本操作与一些坑
    java 在循环中删除数组元素之二
    学习spring cloud 笔记
    一些名词解释
    redis--分布式锁
    微信小程序的加密与解密--java
    java 动态代理
    (收藏)CORS(跨域资源共享)
    策略模式学习笔记--在写更好的代码路上
  • 原文地址:https://www.cnblogs.com/lesning/p/14002137.html
Copyright © 2011-2022 走看看