BZOJ 3901 棋盘游戏 解题报告
这题有个重要性质:
我们设 Flag[i][j] 表示 (i, j) 是否被奇数个操作所覆盖,
也就是操作次数对 2 取模。
设 x = (n + 1) / 2。
那么对于所有的合法的操作方案,
令 1 <= i <= x , 1 <= j < x,
都有 Flag[i][j] ^ Flag[i][x] ^ Flag[i][j + x] = 0
令 1 <= i < x , 1 <= j <= x,
都有 Flag[i][j] ^ Flag[x][j] ^ Flag[i + x][j] = 0
考虑任意一次操作,如果覆盖了 (i, x),
那么在 (i, j) 和 (i, j + x) 中必然有且仅有一个被覆盖。
(i, j) 和 (i + x, j) 同理,
于是每次都会改变那个三元组中的两个元素,或者一个都不改变。
所以这个性质也是成立的。
那么怎么说明满足上述性质的 Flag[][] 就可以对应一个合法的方案呢?
我们考虑:
我们无论怎样在这个满足性质的 Flag[][] 基础上进行操作,
这个 Flag[][] 还会是满足性质的。
先不考虑其他格子的 Flag[][] 值,
我们考虑所有的 1 <= i <= x,1 <= j <= x:
我们都可以把 Flag[i][j] 变成 0。
然后我们考虑对于所有的 1 <= i <= x,x < j <= n:
Flag[i][j] = Flag[i][x] ^ Flag[i][j - x] = 0 ^ 0 = 0
同理,其他格子的 Flag[][] 值也都会是 0。
于是满足上述性质的 Flag[][] 就可以对应一个合法的方案。
好了,那么我们就暴力枚举 Flag[x][1] - Flag[x][x] 的值,
然后 Flag[x][x + 1] - Flag[x][n] 的值也就可以确定了,
其次再分别枚举 Flag[1][x] - Flag[x - 1][x] 的值,
(这里是指一个一个处理这些值,不用再 dfs 了)
那么 Flag[x + 1][x] - Flag[n][x] 的值也可以确定了。
在此基础上对于 1 < i < x,1 < j < x:
我们可以枚举 Flag[i][j] 的值,
那么 Flag[i + x][j], Flag[i][j + x], Flag[i + x][j + x] 的值都可以确定,
于是取最优值即可。
复杂度 O(1.4^n * n^2)。
毕竟 Gromah 太弱,只会做水题。
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define N 33 + 5
#define INF 0x7fffffff int n, x, Max, A[N][N];
bool Flag[N][N]; inline int get(int u)
{
return u == ? - : ;
} inline int Calc()
{
for (int i = x + ; i <= n; i ++)
Flag[i][x] = Flag[x][x] ^ Flag[i - x][x];
int res = ;
for (int i = ; i <= n; i ++)
res += get(Flag[i][x]) * A[i][x];
for (int i = ; i < x; i ++)
{
int _Max = -INF, sum;
for (int k = ; k < ; k ++)
{
Flag[x][i] = k;
Flag[x][i + x] = Flag[x][i] ^ Flag[x][x];
sum = get(Flag[x][i]) * A[x][i] + get(Flag[x][i + x]) * A[x][i + x];
for (int j = ; j < x; j ++)
{
int _res = -INF;
for (int _k = ; _k < ; _k ++)
{
Flag[j][i] = _k;
Flag[j][i + x] = Flag[j][i] ^ Flag[j][x];
Flag[j + x][i] = Flag[j][i] ^ Flag[x][i];
Flag[j + x][i + x] = Flag[j + x][i] ^ Flag[j + x][x];
int _sum = get(Flag[j][i]) * A[j][i] + get(Flag[j][i + x]) * A[j][i + x];
_sum += get(Flag[j + x][i]) * A[j + x][i] + get(Flag[j + x][i + x]) * A[j + x][i + x];
_res = max(_res, _sum);
}
sum += _res;
}
_Max = max(_Max, sum);
}
res += _Max;
}
return res;
} inline void dfs(int z)
{
if (z > x)
{
Max = max(Max, Calc());
return ;
}
Flag[z][x] = ;
dfs(z + );
Flag[z][x] = ;
dfs(z + );
} int main()
{
#ifndef ONLINE_JUDGE
freopen("3901.in", "r", stdin);
freopen("3901.out", "w", stdout);
#endif scanf("%d", &n);
x = n + >> ;
for (int i = ; i <= n; i ++)
for (int j = ; j <= n; j ++)
scanf("%d", A[i] + j);
dfs();
printf("%d\n", Max); #ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
#endif
return ;
}
BZOJ 3901 棋盘游戏 解题报告的更多相关文章
- BZOJ 2959: 长跑 解题报告
2959: 长跑 Description 某校开展了同学们喜闻乐见的阳光长跑活动.为了能"为祖国健康工作五十年",同学们纷纷离开寝室,离开教室,离开实验室,到操场参加3000米长跑 ...
- BZOJ 3901 棋盘游戏 (找结论+枚举+贪心)
题面 略 BZOJ 传送门 分析 具体分析见 dalao博客 妙就妙在当i<x,j<xi<x,j<xi<x,j<x时,(i,j)(i,j)(i,j) ^ (i,x) ...
- BZOJ 4238 电压 解题报告
BZOJ 4238 电压 考虑一条边成为答案以后,删去Ta后剩下的图是一个或很多个二分图,即没有奇环 则一条边可以成为答案,当且仅当自己在所有奇环的交上且不在偶环上. 考虑建出dfs树,那么返祖边一定 ...
- BZOJ 3159: 决战 解题报告
BZOJ 3159: 决战 1 sec 512MB 题意: 给你一颗\(n\)个点,初始点权为\(0\)的有跟树,要求支持 Increase x y w 将路径\(x\)到\(y\)所有点点权加上\( ...
- BZOJ 3328: PYXFIB 解题报告
BZOJ 3328: PYXFIB 题意 给定\(n,p,k(1\le n\le 10^{18},1\le k\le 20000,1\le p\le 10^9,p \ is \ prime,k|(p- ...
- BZOJ 4302 Buildings 解题报告
这个题好像很有趣的样子. 题目分析: 房间都是 $1\times k$ 的,也就是一条一条的.这个好像比较显然的样子. 一个房间如果要覆盖某个格子$u$,那么这个房间的面积至少为 $dis(u, Bo ...
- BZOJ 3160 万径人踪灭 解题报告
这个题感觉很神呀.将 FFT 和 Manacher 有机结合在了一起. 首先我们不管那个 “不能连续” 的条件,那么我们就可以求出有多少对字母关于某一条直线对称,然后记 $T_i$ 为关于直线 $i$ ...
- BZOJ 4127 Abs 解题报告
这个题感觉很厉害的样子.. 首先我们注意到一点:每次加的 $d$ 都是非负的. 那么就说明一个数只可能从负数变成非负数并且只会变一次. 所以我们就可以暴力地去改变一个数的正负情况. 然后我们就可以用树 ...
- BZOJ 3953 Self-Assembly 解题报告
首先,我们可以先考虑一个暴力一点的算法: 对于任意两个分子,如果它们能以至少一种进行匹配,那么我们就在这两个分子之间连一条边. 然后如果我们能找到一个环,就说明是 unbounded,否则就是 bou ...
随机推荐
- jquery animate 制作简单弹幕
定位滚动条 $("html,body").animate({scrollTop:$(".middle1").offset().top},1000) 弹幕 < ...
- CSS常用布局实现方法
CSS 布局对我来说,既熟悉又陌生.我既能实现它,又没有很好的了解它.所以想总结一下,梳理一下 CSS 中常用的一列,两列,三列布局等的实现方法.本文小白,仅供参考.但也要了解下浮动,定位等. 一.一 ...
- JAXB - Unmarshalling
A simple approach for unmarshalling an XML document consists of the creation of a JAXB context and t ...
- 精妙SQL语句介绍
说明:复制表(只复制结构,源表名:a 新表名:b) SQL: select * into b from a where 1<>1 说明:拷贝表(拷贝数据,源表名:a 目标表名:b) SQL ...
- 用jquery-easyui中的combotree实现树形结构的选择
用jquery-easyui中的combotree实现树形结构的选择 需求:实现一个树形节点的选择,要求默认父节点都折叠,父节点前的checkbox不显示,子节点显示checkbox,且父节点不可选择 ...
- cocos2d-x实战 C++卷 学习笔记--第4章 字符串 __String类
前言: <cocos2d-x实战C++卷>学习笔记.(cocos2d-x 是3.0版本) 介绍 cocos2d-x 通用的字符串类 __String . 使用cocos2d::__Str ...
- ios数据库FMDB
一.下载fmdb类库 二.添加libsqulite3.0.dylib 三.添加头文件#import "FMDB.h" 四.打开数据库 a.设置路径NSString *path = ...
- 常用终端及git命令
终端常用命令 1,打开终端,git version 查看版本 2,pwd 打印工作目录 3,ls(list简写)查看当前目录的所有文件 4,clear 清掉屏幕 5,cd (change direct ...
- [LINQ]查询关键字
摘自https://msdn.microsoft.com/zh-cn/library/bb310804.aspx,方便以后翻阅. from子句 查询表达式必须以 from 子句开头.另外,查询表达式还 ...
- 15_会话技术_Cookie
[简述] 会话可理解为:用户打开一个浏览器,点击多个超链接,访问服务器多个Web资源,然后关闭浏览器,整个过程成为一个会话. [会话过程中我们要解决的一些问题] * 每个用户与服务器进行交互的过程中, ...