BZOJ4171 : Rhl的游戏

把第一行每个位置设成未知量,对于之后每一行,都可以用第一行的未知量线性表示。

那么只需要加上最后一行的$m$个方程,对于不能按的那$k$个位置也列出对应的方程。

用高斯消元判断是否有解即可,时间复杂度$O(\frac{n^3}{64})$。

#include<cstdio>
#include<algorithm>
#include<bitset>
#define N 260
using namespace std;
int T,C,n,m,k,cnt,i,j,t,x,y;char s[N][N];bitset<N>f[N][N],a[N*2];
bool solve(){
  scanf("%d%d%d",&n,&m,&k);
  for(i=1;i<=n;i++)scanf("%s",s[i]+1);
  for(j=1;j<=m;j++)f[1][j].reset(),f[1][j][j]=1;
  for(i=2;i<=n;i++)for(j=1;j<=m;j++){
    f[i][j]=f[i-1][j]^f[i-2][j];
    if(j>1)f[i][j]^=f[i-1][j-1];
    if(j<m)f[i][j]^=f[i-1][j+1];
    if(s[i-1][j]==‘B‘)if(f[i][j][m+1])f[i][j][m+1]=0;else f[i][j][m+1]=1;
  }
  cnt=0;
  for(j=1;j<=m;j++){
    a[++cnt]=f[n][j];
    if(j>1)a[cnt]^=f[n][j-1];
    if(j<m)a[cnt]^=f[n][j+1];
    if(n>1)a[cnt]^=f[n-1][j];
    if(s[n][j]==‘B‘)if(a[cnt][m+1])a[cnt][m+1]=0;else a[cnt][m+1]=1;
  }
  while(k--)scanf("%d%d",&x,&y),a[++cnt]=f[x][y];
  for(i=j=1;i<=m;i++){
    for(t=0,k=j;k<=cnt;k++)if(a[k][i]){t=k;break;}
    if(!t)continue;
    swap(a[j],a[t]);
    for(k=j+1;k<=cnt;k++)if(a[k][i])a[k]^=a[j];
    j++;
  }
  for(i=1;i<=cnt;i++){
    for(j=1;j<=m;j++)if(a[i][j])break;
    if(j>m&&a[i][m+1])return 0;
  }
  return 1;
}
int main(){
  scanf("%d",&T);
  for(C=1;C<=T;C++)printf("Case #%d:\n",C),puts(solve()?"YES":"NO");
  return 0;
}

  

时间: 2024-10-04 11:28:14

BZOJ4171 : Rhl的游戏的相关文章

【BZOJ 4171】 4171: Rhl的游戏 (高斯消元)

4171: Rhl的游戏 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 74  Solved: 33[Submit][Status][Discuss] Description RHL最近迷上一个小游戏:Flip it.游戏的规则很简单,在一个N*M的格子上,有一些格子是黑色,有一些是白色 .每选择一个格子按一次,格子以及周围边相邻的格子都会翻转颜色(边相邻指至少与该格子有一条公共边的格子 ),黑变白,白变黑.RHL希望把所有格子都变成白色的.不幸

bzoj4171 or 省队集训day3 chess: Rhl的游戏

[题目描述] RHL最近迷上一个小游戏:Flip it.游戏的规则很简单,在一个N*M的格子上,有一些格子是黑色,有一些是白色.每选择一个格子按一次,格子以及周围边相邻的格子都会翻转颜色(边相邻指至少与该格子有一条公共边的格子),黑变白,白变黑. RHL希望把所有格子都变成白色的.不幸的是,有一些格子坏掉了,无法被按下.这时,它可以完成游戏吗? [输入格式] 第一行一个整数T,表示T组数据. 每组数据开始于三个整数n,m,k,分别表示格子的高度和宽度.坏掉格子的个数.接下来的n行,每行一个长度m

【BZOJ 4169】 4169: Lmc的游戏 (树形DP)

4169: Lmc的游戏 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 44  Solved: 25 Description RHL有一天看到lmc在玩一个游戏. "愚蠢的人类哟,what are you doing",RHL说. "我在玩一个游戏.现在这里有一个有n个结点的有根树,其中有m个叶子结点.这m个叶子从1到m分别被给予了一个 号码,每个叶子的号码都是独一无二的.一开始根节点有一个棋子,两个玩家每次行动将棋子移动到当

20170913自制猜数字游戏

/* 猜数字:系统随机生成一个四位数,请根据下列判断猜出来 A:数值正确,位置正确 B:数值正确,位置不正确 C:数值不正确 */ #include<stdio.h> #include<time.h> #include<stdlib.h> #pragma warning (disable:4996) #define pUCharHead unsigned char * //以数组形式返回n个无重复的随机数,范围可指定[min,max] pUCharHead GenNoR

洛谷P1199 三国游戏

题目描述 小涵很喜欢电脑游戏,这些天他正在玩一个叫做<三国>的游戏. 在游戏中,小涵和计算机各执一方,组建各自的军队进行对战.游戏中共有 N 位武将(N为偶数且不小于 4),任意两个武将之间有一个"默契值",表示若此两位武将作为一对组合作战时,该组合的威力有多大.游戏开始前,所有武将都是自由的(称为自由武将,一旦某个自由武将被选中作为某方军队的一员,那么他就不再是自由武将了),换句话说,所谓的自由武将不属于任何一方. 游戏开始,小涵和计算机要从自由武将中挑选武将组成自己的军

游戏开发 系统app开发游戏定制开发找谁

梦幻珍珠港理财拆分游戏系统软件开发怎么做?找[江生:185-2911-8412 微电]. 梦幻珍珠港拆分游戏平台开发.梦幻珍珠港理财全网模式开发.梦幻珍珠港收益模式介绍开发. 梦幻珍珠港拆分游戏系统源码搭建平台!!我们是软件开发,玩家勿扰!非平台客服,玩家勿扰!] 游戏规则: 一.开发新会员要从您的库房扣除3 03颗珍珠,体系扣除5颗珍珠,新会员有298颗珍珠. 二.推荐老友,推荐人能够得到第一代会员的2%,第二代会员的1%,第三代会员的0.5%,一代的收益就是5.96颗珍珠奖赏(可转换为等量可

游戏服务器开发需要学习的技术

一,游戏服务器编程语言的选择 所谓的游戏服务器编程语言其实有很多,基本上任何一种语言都可以作为游戏服务器的编程语言.这需要根据自己游戏的类型和要求加以选择.比如C++,Java ,Erlang,go等等.目前我用过的只有C++和Java.但是以Java为主.所以接下来就以自己的经验,谈谈以Java为核心的游戏服务器开发技术体系. Java目前作为游戏服务器开发语言已经很是普遍.但是大多数是作为页游或手游的服务器,而端游戏一般选择C++,因为端游对服务器的性能要求相对比较高一些.两种语言各有利弊.

赛码网算法: 格子游戏

格子游戏 题目描述 有n个格子,从左到右放成一排,编号为1-n.共有m次操作,有3种操作类型:1.修改一个格子的权值,2.求连续一段格子权值和,3.求连续一段格子的最大值.对于每个2.3操作输出你所求出的结果. 输入输入第一行两个整数,n表示格子个数,m表示操作次数,n和m中间用空格隔开:接下来输入n行,每行一个整数表示一个格子的权值接下来输入m行,每行有三个整数,中间用空格隔开:第一个是选择的操作类型1-3,第二和第三个整数是操作格子的编号.样例输入3 37892 1 33 1 32 1 2输

【BZOJ4945】[Noi2017]游戏 2-SAT

[BZOJ4945][Noi2017]游戏 题目描述 题解:2-SAT学艺不精啊! 这题一打眼看上去是个3-SAT?哎?3-SAT不是NPC吗?哎?这题x怎么只有8个?暴力走起! 因为x要么不是A要么不是B,所以直接2^8枚举所有x就行了.然后就变成了一个2-SAT问题.假设有两场游戏1,2,分别可以使用的地图为A1,A2,B1,B2,如果有一个限制是1 A 2 A,那么选A1就必须选A2,然后我这个沙茶就开开心心的拿了55分. 为什么不对?我建出来的图显然不对偶啊!考虑逆否命题,选A1就必须选