zoukankan      html  css  js  c++  java
  • Codeforces Round #647 (Div. 2) F. Johnny and Megan's Necklace

    题意:

    给你 (n) 条链,第 (i) 条链两端代表的点是 (2i-1)(2i) ,共计 (2n) 个点都有权值,现在要把这些链组成一个环,两条链之间的连接值就是相连的两个节点的权值异或结果的lowbit的基于2的对数,即 (val=log(lowbit(a异或b));) 如果权值相等则默认连接值为 (20),问如何连接可以使得最小连接值最大。

    分析:

    因为连接值的范围在 ([0,20]) ,所以可以枚举这个最小连接值然后判断是否可以满足连接成环;如果最小连接值为 (k) ,那么合法的连接方案中所有相连的两个节点的权值肯定满足 (a&M=b&M~(M=(1<<k)-1)) ,把能连接的两个节点缩成一个点,那么边就是原来的链,一个合法的连接即一条欧拉回路;

    代码:

    v#include<bits/stdc++.h>
    using namespace std;
    #define fi first
    #define sd second
    #define P pair<int,int>
    #define ll long long
    #define pb push_back
    #define rep(i,a,b) for(int i=a;i<=b;i++)
    #define frep(i,a,b) for(int i=a;i>=b;i--)
    const int N = 1<<20; 
    int n,p[N][2];
    bool vis[N];
    vector<int>ans;
    vector< P >G[N];
    
    void dfs(int u){
    	vis[u]=true;
    	for(auto v:G[u])if(!vis[v.fi])dfs(v.fi);
    }
    
    bool check(int M){
    	rep(i,0,M)G[i].clear(),vis[i]=false;
    	rep(i,1,n){
    		int u=p[i][0]&M; //根据权值构造新点
    		int v=p[i][1]&M;
    		G[u].pb({v,2*i-1}); //(新点的编号,对应原来点的编号) 
    		G[v].pb({u,2*i-2});
    	}
    	
    	int cnt=0;
    	rep(i,0,M){
    		if(G[i].size()&1)return false;  //无向图欧拉回路不存在奇数边的点
    		if(!vis[i]&&G[i].size()>0){
    			++cnt;
    			dfs(i);
    		}
    	}
    	return cnt==1;  //欧拉回路一次走完
    }
    
    void work(int u,int pre=-1){
    	while(G[u].size()){
    		auto e=G[u].back();
    		G[u].pop_back();   //删边
    		
    		if(vis[e.sd/2])continue; //这条链已经访问过了
    		vis[e.sd/2]=true;
    		work(e.fi,e.sd); 
    	}
    	if(pre!=-1){   //记录路径
    		ans.pb(pre);
    		ans.pb(pre^1); 
    	}
    }
    
    void print(int M){
    	rep(i,0,n)vis[i]=false;
    	rep(i,0,M)if(G[i].size()){  //随便找一个出发点
    		work(i);break;
    	}
    	rep(i,0,2*n-1) cout<<ans[i]+1<<" ";
    }
    
    int main()
    {
    	ios::sync_with_stdio(false);
    	cin.tie(0),cout.tie(0);
    	
    	cin>>n;
    	rep(i,1,n)cin>>p[i][0]>>p[i][1];
    	frep(i,20,0)if(check((1<<i)-1)){
    		cout<<i<<endl;
    		print((1<<i)-1);
    		exit(0);
    	} 
    }
    
  • 相关阅读:
    【纯水题】POJ 1852 Ants
    【树形DP】BZOJ 1131 Sta
    【不知道怎么分类】HDU
    【树形DP】CF 1293E Xenon's Attack on the Gangs
    【贪心算法】CF Emergency Evacuation
    【思维】UVA 11300 Spreading the Wealth
    【树形DP】NOI2003 逃学的小孩
    【树形DP】BZOJ 3829 Farmcraft
    【树形DP】JSOI BZOJ4472 salesman
    【迷宫问题】CodeForces 1292A A NEKO's Maze Game
  • 原文地址:https://www.cnblogs.com/17134h/p/13092491.html
Copyright © 2011-2022 走看看