Atcoder Grand Contest 031C(构造,思维,异或,DFS)
#include<bits/stdc++.h>
using namespace std;
int n,a,b,sum;
void dfs(int x,int y,int ban){
if(__builtin_popcount(ban^sum)==1){
printf("%d %d ",y,x^y);
return;
}
for(int i=0;i<n;i++)
if((~(ban>>i)&1)&&(x>>i&1))
for(int j=0;j<n;j++)
if((~(ban>>j)&1)&&i!=j){
dfs(1<<j,y,ban|1<<i);
dfs(x^(1<<i)^(1<<j),y^(1<<i)^(1<<j),ban|1<<i);
return;
}
}
/*dfs(x,y,ban)表示需要从状态0走到状态x,ban是一个长度为n的二进制串,其中第i位为1表示这一维已经不存在了,即若这个二进制串总共有p个0,则表示当前需要处理的是在p维空间下从0走到x这件事情。
划分的时候先找到某个二进制位满足x在这一位上为1(也就是代码里的i),然后在随便选一个在第i位上是0且有奇数个1的数,代码里为了方便我就直接选了某个2^j,然后递归构造0 -> 2^j -> 2^j+2^i -> x的路径就行了。
那个y是指表明接下来处理的所有数在输出时都要异或上y,这样在划分问题的时候可以比较方便地把子问题归为“从0出发走到x”这种形式。*/
int main(){
scanf("%d%d%d",&n,&a,&b);
sum=(1<<n)-1;
if(__builtin_popcount(a^b)&1){
printf("YES\n");
dfs(a^b,a,0);
}
else
printf("NO");
return 0;
}
/*要从0走到AxorB,可以选出一个二进制位p满足AxorB在第p位上值为1,遍历二进制第p位为0的所有点组成的n−1维超立方体后,再去遍历二进制位第p位为1的所有点组成的n−1维超立方体。两个n−1维超立方体之间的连接点的选取是任意的,只需要满足起点终点二进制位不同的位数是奇数。*/
/*感谢租酥宇大佬的解答*/
Atcoder Grand Contest 031C(构造,思维,异或,DFS)的更多相关文章
- AtCoder Grand Contest 011D(思维,规律,异或)
#include<bits/stdc++.h>using namespace std;char s[200007];int ans[200007];int main(){ int n ...
- 【AtCoder Grand Contest 007E】Shik and Travel [Dfs][二分答案]
Shik and Travel Time Limit: 50 Sec Memory Limit: 512 MB Description 给定一棵n个点的树,保证一个点出度为2/0. 遍历一遍,要求每 ...
- AtCoder Grand Contest 019 B - Reverse and Compare【思维】
AtCoder Grand Contest 019 B - Reverse and Compare 题意:给定字符串,可以选定任意i.j且i<=j(当然i==j时没啥卵用),然后翻转i到j的字符 ...
- Atcoder Grand Contest 024 E - Sequence Growing Hard(dp+思维)
题目传送门 典型的 Atcoder 风格的计数 dp. 题目可以转化为每次在序列中插入一个 \([1,k]\) 的数,共操作 \(n\) 次,满足后一个序列的字典序严格大于前一个序列,问有多少种操作序 ...
- AtCoder Grand Contest 012
AtCoder Grand Contest 012 A - AtCoder Group Contest 翻译 有\(3n\)个人,每一个人有一个强大值(看我的假翻译),每三个人可以分成一组,一组的强大 ...
- AtCoder Grand Contest 031 简要题解
AtCoder Grand Contest 031 Atcoder A - Colorful Subsequence description 求\(s\)中本质不同子序列的个数模\(10^9+7\). ...
- AtCoder Grand Contest 004
AtCoder Grand Contest 004 A - Divide a Cuboid 翻译 给定一个\(A*B*C\)的立方体,现在要把它分成两个立方体,求出他们的最小体积差. 题解 如果有一条 ...
- AtCoder Grand Contest 010
AtCoder Grand Contest 010 A - Addition 翻译 黑板上写了\(n\)个正整数,每次会擦去两个奇偶性相同的数,然后把他们的和写会到黑板上,问最终能否只剩下一个数. 题 ...
- AtCoder Grand Contest 008
AtCoder Grand Contest 008 A - Simple Calculator 翻译 有一个计算器,上面有一个显示按钮和两个其他的按钮.初始时,计算器上显示的数字是\(x\),现在想把 ...
随机推荐
- Linux学习笔记 -- Shell 数组
定义 在Shell的世界里,我们只能定义一维数组. 定义数组的时候不需要指定长度,数组的下标从0开始; Shell 数组用括号来表示,元素用"空格"符号分割开,语法格式如下: sh ...
- php写一个判断是否有cookie的脚本
前言: 刚刚学习完cookie函数,写个练习. 0x01: //其实第二个应该改为elseif,但是我懒.啊哈 <?php $vlas="BnJhiFoPS4"; if(is ...
- 点击jQuery Mobile的按钮改变颜色
jquery-mobile-移动 我有这样的代码来改变点击一个按钮的颜色: $('.fav').live('click', function(e) { $(this).buttonMarkup({ t ...
- MAPREDUCE原理篇2
mapreduce的shuffle机制 概述: mapreduce中,map阶段处理的数据如何传递给reduce阶段,是mapreduce框架中最关键的一个流程,这个流程就叫shuffle: shuf ...
- Halcon学习之五:有关图像的定义域的函数
1.add_channels ( Regions, Image : GrayRegions : : ) 将Image图像的灰度值赋给区域Regions,得到GrayRegions. 2.change_ ...
- Java中long和Long的区别
Java的数据类型分两种: 1.基本类型:long,int,byte,float,double,char,short,boolean 2. 对象类型(类): Long,Integer,Byte,Flo ...
- c++之继承与派生
再来回顾下继承派生的语法. 继承方式显示有三种(public, protected, privatez),隐式默认private.所谓继承方式,是指派生类对基类成员的访问权限控制. 派生类构造函数定义 ...
- 一,安装python
在Windows上安装Python 首先,从Python的官方网站www.python.org下载最新的2.7.9版本,地址是这个: http://www.python.org/ftp/python/ ...
- ubuntu下不用eclipse开发cocos2d-x(命令行)
之前在ubuntu下通过eclipse搭建开发cocos2d-x的环境,但是由于eclipse界面在ubuntu显得很丑,在里面写代码,完全没有感觉,后来我转到了win7上通过vs2010和eclip ...
- Docker学习笔记_安装ActiveMQ
一.实验环境 1.宿主机OS:Win10 64位 2.虚拟机OS:Ubuntu18.04,虚拟机名称:Ubuntu18VM1,虚拟机IP:192.168.8.25 3.操作账号 :Docker 4.在 ...