[bzoj5285][Hnoi2018]寻宝游戏【复杂度分析】

原创 2018年04月17日 18:40:35

【题目链接】
  https://www.lydsy.com/JudgeOnline/problem.php?id=5285
【题解】
  考虑最后一个影响一个二进制位的数。
  如果出现“&0”,那么之前所有的操作都不能影响它。同理“|1”也是。
  另外两种状态“&1”,“|0”不会影响前面的状态。
  所以从后往前枚举每一位的运算符。如果是“&”所有为0的位置不用再做下去,是“|”所有为1的位置不用做下去。所以一次询问的复杂度是O(NM)的。
  总复杂度:O(NMQ)

# include <bits/stdc++.h>
# define    N       1010
# define    M       5010
# define    P       1000000007
using namespace std;
int read(){
    int tmp=0, fh=1; char ch=getchar();
    while (ch<'0'||ch>'9'){if (ch=='-') fh=-1; ch=getchar();}
    while (ch>='0'&&ch<='9'){tmp=tmp*10+ch-'0'; ch=getchar();}
    return tmp*fh;
}
int n,m,q,ans;
char s[N][M],t[M];
int use[N][M],mul[N];
int solve(int k, int cnt){
    if (cnt==0) return mul[k];
    if (k==0){
        for (int i=1; i<=cnt; i++)
            if (t[use[k][i]]=='1')
                return 0;
        return 1;
    }
    int nex=0, flag=true, num=0;
    for (int i=1; i<=cnt; i++){ // ^
        if (s[k][use[k][i]]=='0'){
            if (t[use[k][i]]=='1'){
                flag=false; break;
            }
        }
        else use[k-1][++nex]=use[k][i];
    }
    if (flag) num=num+solve(k-1,nex);
    nex=0, flag=true;
    for (int i=1; i<=cnt; i++){ // v
        if (s[k][use[k][i]]=='1'){
            if (t[use[k][i]]=='0'){
                flag=false; break;
            }
        }
        else use[k-1][++nex]=use[k][i];
    }
    if (flag) num=(num+solve(k-1,nex))%P;
    return num;
}
int main(){
    n=read(), m=read(); q=read();
    mul[0]=1;
    for (int i=1; i<=n; i++)
        mul[i]=mul[i-1]*2%P;
    for (int i=1; i<=n; i++)
        scanf("\n%s",s[i]+1);
    while (q--){
        scanf("\n%s",t+1);
        for (int i=1; i<=m; i++) use[n][i]=i;
        ans=solve(n,m);
        printf("%d\n",ans);
    }
    return 0;
}

HNOI2018游记

DAY0 CY:省选前带你们出去玩,去哪啊,用四个字回答我! 我们:(想要我们说“烈士公园”(学校门口),没门!)橘子洲头! 于是我们就去了橘子洲头…… 然后吹了一上午风…… 吹得我耳朵痛…...
  • litble
  • litble
  • 2018-04-15 21:47:10
  • 173

HNOI2018翻水记

day0 又一次来到了长沙南站。 毕竟不是自己省选所以感觉比较轻松,晚上爽快战斗一下就睡觉了。 day1 看完题后发现好像三题都不是很可做,于是就选择先去刚看起来最清真的t1。 搞来搞去...
  • qq_33229466
  • qq_33229466
  • 2018-04-15 18:50:49
  • 131

[BZOJ3991] [SDOI2015]寻宝游戏

传送门http://www.lydsy.com/JudgeOnline/problem.php?id=3991题目大意给定一棵树,询问从某一关键点出发再回到该点遍历所有关键点的最短距离 支持加入1个...
  • slongle_amazing
  • slongle_amazing
  • 2016-03-06 13:57:16
  • 645

[BZOJ5285][HNOI2018]寻宝游戏-思维

寻宝游戏Description某大学每年都会有一次Mystery Hunt的活动,玩家需要根据设置的线索解谜,找到宝藏的位置,前一年获胜的队伍可以获得这一年出题的机会。作为新生的你,对这个活动非常感兴...
  • zlttttt
  • zlttttt
  • 2018-04-18 01:11:39
  • 9

记HNOI2018

day0颓完睡觉day1BL突然出货,好久没出了看完t1感觉是个神题,跳t2感觉可以推一推式子,待会再看,跳t3感觉暴力70,打打完t3看t2,推一推式子就出来了t1无脑打一个暴力t2打完线段树,发现...
  • tswdfop
  • tswdfop
  • 2018-04-15 19:40:09
  • 44

LibreOJ #2510.「HNOI2018」道路 树形dp

题意 分析 在考场上的时候以为这是神仙题,就没有太仔细想,结果这就是一道普及dp题。 设f[d,x,y]表示以d为根的子树,上面有x条公路,y条铁路时的最优翻修方案。 记忆化搜索一...
  • qq_33229466
  • qq_33229466
  • 2018-04-16 19:22:47
  • 40

寻宝游戏设计攻略

每次带小朋友出去玩,寻宝游戏都是重头戏,我会根据地形,花很长时间去设计游戏。可以说,台上一分钟,台下十年功。准备很多天,寻宝一个小时就搞定了。 从来不吝啬跟妈妈们分享,如何设计寻宝游戏,在游戏中...
  • hyfound
  • hyfound
  • 2017-09-03 22:26:11
  • 1922

【bzoj3991】【SDOI2015】【寻宝游戏】【dfs序】

Description  小B最近正在玩一个寻宝游戏,这个游戏的地图中有N个村庄和N-1条道路,并且任何两个村庄之间有且仅有一条路径可达。游戏开始时,玩家可以任意选择一个村庄,瞬间转移到这个村庄,然...
  • sunshinezff
  • sunshinezff
  • 2015-10-08 16:19:36
  • 307

【BZOJ 3991】 [SDOI2015]寻宝游戏

set维护dfs序~
  • Regina8023
  • Regina8023
  • 2015-05-05 14:41:14
  • 1592

迷宫寻宝C语言代码

  • 2015年05月25日 22:00
  • 4KB
  • 下载
收藏助手
不良信息举报
您举报文章:[bzoj5285][Hnoi2018]寻宝游戏【复杂度分析】
举报原因:
原因补充:

(最多只允许输入30个字)