• [JZOJ]100047. 【NOIP2017提高A组模拟7.14】基因变异


    21 世纪是生物学的世纪,以遗传与进化为代表的现代生物理论越来越多的 进入了我们的视野。 如同大家所熟知的,基因是遗传因子,它记录了生命的基本构造和性能。 因此生物进化与基因的变异息息相关,考察基因变异的途径对研究生物学有着 至关重要的作用。现在,让我们来看这样一个模型:
    1、所有的基因都可以看作一个整数或该整数对应的二进制码;
    2、在 1 单位时间内,基因 x 可能会在其某一个二进制位上发生反转;
    3、在 1 单位时间内,基因 x 可能会遭到可感染基因库内任一基因 y 的影响 而突变为 x XOR y。
    现在给出可感染基因库,Q 组询问,每组给出初始基因与终止基因,请你 分别计算出每种变异最少要花费多少个单位时间。

    对于 20%的数据,N = 0;
    对于额外 40%的数据,1 ≤ Q ≤ 100,所有基因表示为不超过 10^4 的非负整 数;
    对于 100%的数据,0 ≤ N ≤ 20,1 ≤ Q ≤ 10^5,所有基因表示为不超过 10^6 的 非负整数。

    求st->ed的和求0->st^ed 的是等价的。bfs预处理一下即可。(注意bfs的上界不是1e6,是1048575......)

    #include <iostream>
    #include <cstdio>
    #include <queue>
    #include <cstring>
    using namespace std;
    const int N=1048576;
    int dis[N],a[50],n,Q;
    bool vis[N];
    void bfs() {
    	queue<int>q;
    	memset(dis,0x3f,sizeof dis);
    	q.push(0);
    	dis[0]=0;
    	while(!q.empty()) {
    		int u=q.front();q.pop();
    		for(int i=1;i<=n;i++) 
    			if((u^a[i])<=N-1&&dis[u^a[i]]>dis[u]+1) {dis[u^a[i]]=dis[u]+1;if(!vis[u^a[i]])q.push(u^a[i]),vis[u^a[i]]=1;}
    		for(int i=0;((1<<i))<=N-1;i++)
    			if((u^(1<<i))<=N-1&&dis[u^(1<<i)]>dis[u]+1) {
    				dis[u^(1<<i)]=dis[u]+1;if(!vis[u^(1<<i)]) q.push(u^(1<<i)),vis[u^(1<<i)]=1;
    			}
    		vis[u]=0;
    	}
    }
    int main() {
    	scanf("%d%d",&n,&Q);
    	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    	bfs();
    	int l,r;
    	while(Q--) {
    		scanf("%d%d",&l,&r);
    		printf("%d
    ",dis[l^r]);
    	}
    }
    
    我是咸鱼。转载博客请征得博主同意Orz
  • 相关阅读:
    异常处理
    SPD各模块总结
    简易js调试
    深入理解:java类加载器
    java基础简介
    android四大组件(一)Activity
    网路编程(网站源码查看器)
    ListView
    SQL查询数据总结
    函数作用域中的this问题
  • 原文地址:https://www.cnblogs.com/sdfzhsz/p/9427496.html
Copyright © 2020-2023  润新知