zoukankan      html  css  js  c++  java
  • HNOI2018寻宝游戏

    https://www.luogu.org/problemnew/show/P4424

    题解

    我们首先按位考虑。

    如果有一位最终的结果为1,那么我们可以把树的序列看成一个二进制数,先出现的在底位,后出现的在高位,操作序列也可以看做一个二进制数,(and)为1,(or)为0,先出现的在低位,后出现的在高位。

    首先操作序列是不可能把0变成1的,那么要使最后的结果为1,就得考虑数字序列最高位的1,那么如果操作序列的更高位有1,结果肯定会变成0,否则如果操作序列这一位不是1,那么结果肯定是1。

    如果这两种情况都不是,那么说明这一位操作序列和数字序列都是1,这时就得往低位继续判断。

    如此归纳下去,如果需要满足这一位为1,必须要求数字序列>操作序列。

    再考虑多位的情况,相当于是有很多的限制。

    这样我们就会得到一个性质,合法的序列是一段连续的二进制数。

    我们直接把所有序列拍完序后对每个询问暴力扫就好了。

    注意边界!!!!

    代码

    #include<bits/stdc++.h>
    #define N 5009 
    #define M 1009
    using namespace std;
    typedef long long ll;
    const int mod=1000000007;
    char s[N];
    int n,m,q,rnk[N];
    ll ji[N],cnt[N];
    inline void MOD(ll &x){x=x>=mod?x-mod:x;}
    inline ll rd(){
    	ll x=0;char c=getchar();bool f=0;
    	while(!isdigit(c)){if(c=='-')f=1;c=getchar();}
    	while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
    	return f?-x:x;
    }
    struct skr{
    	int a[M],id;
    	inline bool operator <(const skr &b)const{
    		for(int i=1;i<=n;++i)if(a[i]!=b.a[i])return a[i]>b.a[i];
    		return 0;
    	}
    }a[N];
    int main(){
    	n=rd();m=rd();q=rd();
    	ji[0]=1;
    	for(int i=1;i<=n;++i)ji[i]=ji[i-1]*2%mod;
    	for(int i=1;i<=n;++i){
    		scanf("%s",s+1);
    		for(int j=1;j<=m;++j){
    			a[j].a[n-i+1]=s[j]^48;
    		}
    	}
    	for(int i=1;i<=m;++i)a[i].id=i;
    	sort(a+1,a+m+1);
    	for(int i=1;i<=m;++i)rnk[a[i].id]=i;
    	for(int i=1;i<=m;++i)for(int j=1;j<=n;++j)if(a[i].a[j])MOD(cnt[i]+=ji[n-j]);
    	for(int j=1;j<=n;++j)MOD(cnt[0]+=ji[n-j]);MOD(cnt[0]+=1);
    	while(q--){
    		scanf("%s",s+1);
    	    int L=m+1,R=0;
    	    for(int i=1;i<=m;++i)
    		  if(s[i]=='1')R=max(R,rnk[i]);
    		  else L=min(L,rnk[i]);
    		if(R>L)puts("0");
    		else printf("%lld
    ",(cnt[R]-cnt[L]+mod)%mod); 
    	}
    	return 0;
    }
    
  • 相关阅读:
    asp.net core 3 WebApi System.Text.Json 返回数据配置
    linux 版本
    netcore HttpClient Post 提交数据
    mysql information_schema 常用命令
    linux 发布console 控制台命令
    mysql 创建数据库脚本
    C# 两个 List 数组 元素是否相同 数组相等
    windows 安装redis64
    阿里云 linux 安全组
    linux 安装redis
  • 原文地址:https://www.cnblogs.com/ZH-comld/p/10770571.html
Copyright © 2011-2022 走看看