zoukankan      html  css  js  c++  java
  • 【JZOJ100047】基因变异【BFS】

    题目大意:

    题目链接:https://jzoj.net/senior/#main/show/100047
    题目图片:
    http://wx1.sinaimg.cn/mw690/0060lm7Tly1fy7gss4ijmj30j50cujrv.jpg
    http://wx4.sinaimg.cn/mw690/0060lm7Tly1fy7gss4gyaj30j20asdfx.jpg
    已知数组aa,两种操作:

    • xx变成x xor aix xor a_i
    • xx二进制下任意一位取反。

    求从xx变成yy的最少步数。


    思路:

    如果我们有一个数zz使得x xor z=yx xor z=y,那么很明显的zz就是我们要求的答案。
    反过来得x xor y=zx xor y=z
    所以,其实xxyy的最少步数就是00zz的最少步数!
    那么就从00开始BFSBFS,求出不超过z=max{1111111}z=max{1111111}的答案(因为xorxor最大就是11111111111111了)。然后就可以O(1)O(1)输出了。
    思维好题。


    代码:

    #include <cstdio>
    #include <queue>
    #define ri register
    using namespace std;
    
    const int N=1200000;
    int n,u,v,Q,a[N],s,t,ans[N];
    bool vis[N];
    char c;
    
    int read()
    {
    	u=0;
    	c=getchar();
    	while (c<'0'||c>'9') c=getchar();
    	while (c>='0'&&c<='9')
    		u=(u<<3)+(u<<1)+c-48,c=getchar();
    	return u;
    }
    
    int write(int x)
    {
    	if (x>9) write(x/10);
    	putchar(x%10+48);
    }
    
    void bfs()
    {
    	queue<int> q;
    	q.push(0);
    	vis[0]=1;
    	while (q.size())
    	{
    		u=q.front();
    		q.pop();
    		for (ri int i=1;i<=n;i++)  //选择每一个数xor
    			if (!vis[u^a[i]])
    			{
    				vis[u^a[i]]=1;
    				ans[u^a[i]]=ans[u]+1;
    				q.push(u^a[i]);
    			}
    		for (ri int i=0;i<=19;i++)  //选择每一位取反
    		{
    			if ((u&(1<<i))==(1<<i)) v=u-(1<<i);
    				else v=u+(1<<i);
    			if (!vis[v])
    			{
    				vis[v]=1;
    				ans[v]=ans[u]+1;
    				q.push(v);
    			}
    		}
    	}
    }
    
    int main()
    {
    	n=read();
    	Q=read();
    	for (ri int i=1;i<=n;i++)
    		a[i]=read();
    	bfs();
    	while (Q--)
    	{
    		s=read();
    		t=read();
    		write(ans[s^t]);
    		putchar(10);
    	}
    	return 0;
    }
    
  • 相关阅读:
    二叉树
    bfs
    E-Gold Coins
    D-We Love MOE Girls
    A
    哈希--查找出现过的数字
    二分查找
    KMP简单应用
    KMP算法(2)
    [JSOI2008]最大数
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/11998427.html
Copyright © 2011-2022 走看看