bzoj2437 [Noi2011]兔兔与蛋蛋
二分图博弈果然都是一个套路,必经点必胜,非必经点必败,
但是肯定不能每走一步就重新建图判断必胜还是必败,那么我们可以这样:每走一步就把这个点删掉,然后find他原来的匹配,如果找不到,就说明他是必经点,否则就是非必经点。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#define N 1601
using namespace std;
int e=,head[N];
struct edge{int v,next;}ed[N*];
void add(int u,int v){ed[e].v=v;ed[e].next=head[u];head[u]=e++;}
int pp[N],del[N],id[][];
bool vis[N],ans[N];
bool find(int x){
for(int i=head[x];i;i=ed[i].next){
int v=ed[i].v;
if(del[v]||vis[v])continue;vis[v]=;
if(!pp[v]||find(pp[v])){
pp[v]=x;pp[x]=v;
return ;
}
}return ;
}
int a[][],be,n,m,T,sx,sy,tot1,tot2,tot;
char ch[];
bool check(int i,int j){return ((i+j)&)^a[i][j]==be;}
int f[N],f_cnt;
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
scanf("%s",ch+);
for(int j=;j<=m;j++)
if(ch[j]=='O')a[i][j]=;
else if(ch[j]=='X')a[i][j]=;
else sx=i,sy=j;
}
be=(sx+sy)&;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)if(check(i,j))
if(a[i][j])id[i][j]=++tot1;
else id[i][j]=++tot2;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)if(check(i,j)&&(!a[i][j]))
id[i][j]+=tot1;
tot=tot1+tot2;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)if(id[i][j]){
if(id[i+][j])add(id[i][j],id[i+][j]);
if(id[i][j+])add(id[i][j],id[i][j+]);
if(id[i-][j])add(id[i][j],id[i-][j]);
if(id[i][j-])add(id[i][j],id[i][j-]);
}
for(int i=;i<=tot1;i++){
memset(vis,,sizeof vis);
find(i);
}
scanf("%d",&T);T<<=;
for(int i=,x,y;i<=T;i++){
int now=id[sx][sy],p=pp[now];
del[now]=;pp[now]=pp[p]=;
if(!p)ans[i]=;
else{
memset(vis,,sizeof vis);
ans[i]=find(p)^;
}
scanf("%d%d",&sx,&sy);
}
for(int i=;i<=T;i+=)
if(ans[i]&&ans[i+])f[++f_cnt]=(i+)>>;
printf("%d\n",f_cnt);
for(int i=;i<=f_cnt;i++)
printf("%d\n",f[i]);
return ;
}
bzoj2437 [Noi2011]兔兔与蛋蛋的更多相关文章
- 【BZOJ2437】【NOI2011】兔兔与蛋蛋(博弈论,二分图匹配)
[BZOJ2437][NOI2011]兔兔与蛋蛋(博弈论,二分图匹配) 题面 BZOJ 题解 考虑一下暴力吧. 对于每个状态,无非就是要考虑它是否是必胜状态 这个直接用\(dfs\)爆搜即可. 这样子 ...
- 【bzoj2437】[Noi2011]兔兔与蛋蛋 二分图最大匹配+博弈论
Description Input 输入的第一行包含两个正整数 n.m. 接下来 n行描述初始棋盘.其中第i 行包含 m个字符,每个字符都是大写英文字母"X".大写英文字母&quo ...
- 【BZOJ 2437】 2437: [Noi2011]兔兔与蛋蛋 (博弈+二分图匹配**)
未经博主同意不得转载 2437: [Noi2011]兔兔与蛋蛋 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 693 Solved: 442 Des ...
- bzoj 2437[Noi2011]兔兔与蛋蛋 黑白染色二分图+博弈+匈牙利新姿势
noi2011 兔兔与蛋蛋 题目大意 直接看原题吧 就是\(n*m\)的格子上有一些白棋和一些黑棋和唯一一个空格 兔兔先手,蛋蛋后手 兔兔要把与空格相邻的其中一个白棋移到空格里 蛋蛋要把与空格相邻的其 ...
- 2437: [Noi2011]兔兔与蛋蛋 - BZOJ
Description Input 输入的第一行包含两个正整数 n.m.接下来 n行描述初始棋盘.其中第i 行包含 m个字符,每个字符都是大写英文字母"X".大写英文字母" ...
- NOI2011 兔兔与蛋蛋游戏
http://www.lydsy.com/JudgeOnline/problem.php?id=2437 这道题真是极好的. 75分做法: 搜索. 出题人真的挺良心的,前15个数据点的范围都很小,可以 ...
- 博弈论(二分图匹配):NOI 2011 兔兔与蛋蛋游戏
Description Input 输入的第一行包含两个正整数 n.m. 接下来 n行描述初始棋盘.其中第i 行包含 m个字符,每个字符都是大写英文字母"X".大写英文字母&quo ...
- 【BZOJ2432】【NOI2011】兔农(数论,矩阵快速幂)
[BZOJ2432][NOI2011]兔农(数论,矩阵快速幂) 题面 BZOJ 题解 这题\(75\)分就是送的,我什么都不想写. 先手玩一下,发现每次每次出现\(mod\ K=1\)的数之后 把它减 ...
- BZOJ2437 [Noi2011]兔兔与蛋蛋 【博弈论 + 二分图匹配】
题目链接 BZOJ2437 题解 和JSOI2014很像 只不过这题动态删点 如果我们把空位置看做\(X\)的话,就会发现我们走的路径是一个\(OX\)交错的路径 然后将图二分染色,当前点必胜,当且仅 ...
- BZOJ2437 NOI2011兔兔与蛋蛋(二分图匹配+博弈)
首先将棋盘黑白染色,不妨令空格处为黑色.那么移动奇数次后空格一定处于白色格子,偶数次后空格一定处于黑色格子.所以若有某个格子的棋子颜色与棋盘颜色不同,这个棋子就是没有用的.并且空格与某棋子交换后,棋子 ...
随机推荐
- phantomjs 爬去动态页面
最近有一个小需求,需要根据用户输入的某宝的店铺 url,检查地址是否存在,并抓取店铺名称.某宝店铺 url 的 title 通常是 xx-xx-xx 的形式,中间的 xx 就是对应的店铺名称. 这个需 ...
- MQ队列管理器搭建(一)
多应用单MQ使用场景 如上图所示,MQ独立安装,或者与其中一个应用同处一机.Application1与Application2要进行通信,但因为跨系统,所以引入中间件来实现需求. Applicat ...
- tvtk管线技术、数据集与数据加载
管线技术也称流水线技术(Pipeline)每个对象只实现相对简单的任务,整个管线进行复杂的可视化处理在tvtk中分为可视化管线和图形管线 可视化管线(Visualization Pipeline):将 ...
- mysql 5.7主从安装和配置
本文主要介绍mysql 5.7主从复制,转载请注明出处 下载地址 模块 版本 下载地址 mysql 5.7 https://dev.mysql.com/downloads/mysql/ libaio( ...
- letter combinations of a phone number(回溯)
Given a digit string, return all possible letter combinations that the number could represent. A map ...
- java并发容器(Map、List、BlockingQueue)
转发: 大海巨浪 Java库本身就有多种线程安全的容器和同步工具,其中同步容器包括两部分:一个是Vector和Hashtable.另外还有JDK1.2中加入的同步包装类,这些类都是由Collectio ...
- Day9 进程同步锁 进程队列 进程池 生产消费模型 进程池 paramike模块
进程同步锁: 当运行程序的时候,有可能你的程序同时开多个进程,开进程的时候会将多个执行结果打印出来,这样的话打印的信息都是错乱的,怎么保证打印信息是有序的呢? 其实也就是相当于让进程独享资源. fro ...
- Day4_名称空间与作用域
函数嵌套: 函数的嵌套调用:在调用一个函数的过程中,又调用了了另外一个函数 比如说比较多个值的大小,可以利用这种方法: def max2(x,y): if x > y: return x els ...
- 开始记录学习java的笔记
今天开始记录学习java的笔记,加油
- maxSubArray
Description: Find the contiguous subarray within an array (containing at least one number) which has ...