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

      

  • 相关阅读:
    杂记
    [POI2015]PUS
    CF786B Legacy(线段树优化建图)
    SP11470 TTM
    [WC2010]重建计划
    [HNOI2014]世界树
    luogu P4842 城市旅行
    [SDOI2016]征途
    [APIO2014]序列分割
    上下界网络流构图证明
  • 原文地址:https://www.cnblogs.com/lesning/p/14002137.html
Copyright © 2011-2022 走看看