Codeforces 321D Ciel and Flipboard(结论题+枚举)
题目链接 Ciel and Flipboard
题意 给出一个$n*n$的正方形,每个格子里有一个数,每次可以将一个大小为$x*x$的子正方形翻转
翻转的意义为该区域里的数都变成原来的相反数。
求经过若干次操作之后整个正方形的所有数之和。
这题关键就是要知道这个结论。
假设$st[i][j]$为$a[i][j]$的翻转情况($st[i][j] = 0$ 不翻转 $st[i][j] = 1$ 翻转)
那么一定有 $st[i][j]$ xor $st[i][x]$ xor $st[i][j + x]$ = $0$
这是行的情况
那么对于列的情况也有
$st[i][j]$ xor $st[x][j]$ xor $st[i + x][j]$ = $0$
每一个式子中,我们求出了两项,就可以知道另外一项。
考虑枚举$st[x][1]$, $st[x][2]$, $st[x][3]$, ..., $st[x][x]$
这样一共有$2^{17}$种枚举方案
根据上面的结论,枚举了这$x$个元素之后,这一行的剩下全部元素都知道了
也就是说我们花了$2^{x}$的复杂度,得到了中间这一行的所有情况。
接着我们要对剩下的一些未知情况进行枚举。
首先我们枚举$st[1][x]$($0$ or $1$)
这样的话我们得到了$st[x + 1][x]$的值
在知道这两个值的情况下, 我们再枚举$st[1][1]$的值($0$ or $1$)
于是根据所有之前得到的值,我们可以得到$st[1][1], st[1][x + 1], st[x + 1][1], st[x + 1][x + 1]$
我们根据这些枚举得到的值算出$a[1][1] + a[1][x + 1] + a[x + 1][1] + a[x + 1][x + 1]$在$st[1][1]$等于$0$或$1$的时候哪个更大
处理完$st[1][1]$这边之后我们处理$st[1][2]$(同枚举$st[1][1]$的方法),直到处理到$st[1][x - 1]$。
然后我们枚举$st[2][x]$($0$ or $1$)
......
直到枚举到$st[x - 1][x]$($0$ or $1$)
这样就把所有的情况都覆盖了。
时间复杂度$O(2^{x}x^{2})$
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i) const int N = 53;
const int mul[2] = {1, -1}; int a[N][N];
int n, x;
int st[N][N];
int ans; int main(){ scanf("%d", &n);
rep(i, 0, n - 1) rep(j, 0, n - 1) scanf("%d", &a[i][j]);
x = (n + 1) / 2;
ans = -(1 << 30);
rep(s, 0, (1 << x) - 1){
int sum = 0;
rep(i, 0, x - 1) st[x - 1][i] = (s >> i) & 1;
rep(i, x, n - 1) st[x - 1][i] = st[x - 1][i - x] ^ st[x - 1][x - 1];
rep(i, 0, n - 1) sum += mul[st[x - 1][i]] * a[x - 1][i];
rep(i, 0, x - 2){
int cnt = -(1 << 30);
rep(op, 0, 1){
st[i][x - 1] = op;
st[i + x][x - 1] = op ^ st[x - 1][x - 1];
int now = a[i][x - 1] * mul[op] + a[i + x][x - 1] * mul[st[i + x][x - 1]];
rep(j, 0, x - 2){
int et = -(1 << 30);
rep(ct, 0, 1){
st[i][j] = ct;
st[i][j + x] = ct ^ st[i][x - 1];
st[i + x][j] = ct ^ st[x - 1][j];
st[i + x][j + x] = st[i + x][x - 1] ^ st[i + x][j];
et = max(et, a[i][j] * mul[st[i][j]] + a[i][j + x] * mul[st[i][j + x]] + a[i + x][j] * mul[st[i + x][j]] + a[i + x][j + x] * mul[st[i + x][j + x]]);
}
now += et;
}
cnt = max(cnt, now);
}
sum += cnt;
}
ans = max(ans, sum);
}
printf("%d\n", ans);
return 0;
}
Codeforces 321D Ciel and Flipboard(结论题+枚举)的更多相关文章
- [Codeforces 321D][2018HN省队集训D4T2] Ciel and Flipboard
[Codeforces 321D][2018HN省队集训D4T2] Ciel and Flipboard 题意 给定一个 \(n\times n\) 的矩阵 \(A\), (\(n\) 为奇数) , ...
- codeforces 1269D. Domino for Young (二分图证明/结论题)
链接:https://codeforces.com/contest/1269/problem/D 题意:给一个不规则的网格,在上面放置多米诺骨牌,多米诺骨牌长度要么是1x2,要么是2x1大小,问最多放 ...
- 【bzoj4401】块的计数 结论题
题目描述 给出一棵n个点的树,求有多少个si使得整棵树可以分为n/si个连通块. 输入 第一行一个正整数N,表示这棵树的结点总数,接下来N-1行,每行两个数字X,Y表示编号为X的结点与编号为Y的结点相 ...
- [codevs5578][咸鱼]tarjan/结论题
5578 咸鱼 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description 在广袤的正方形土地上有n条水平的河流和m条垂直的河流,发达的咸鱼家族在m*n个河流交叉点都 ...
- BZOJ_1367_[Baltic2004]sequence_结论题+可并堆
BZOJ_1367_[Baltic2004]sequence_结论题+可并堆 Description Input Output 一个整数R Sample Input 7 9 4 8 20 14 15 ...
- [BZOJ3609][Heoi2014]人人尽说江南好 结论题
Description 小 Z 是一个不折不扣的 ZRP(Zealot Round-game Player,回合制游戏狂热玩家), 最近他 想起了小时候在江南玩过的一个游戏. 在过去,人们是要 ...
- 【uoj#282】长度测量鸡 结论题
题目描述 给出一个长度为 $\frac{n(n+1)}2$ 的直尺,要在 $0$ 和 $\frac{n(n+1)}2$ 之间选择 $n-1$ 个刻度,使得 $1\sim \frac{n(n+1)}2$ ...
- 【uoj#175】新年的网警 结论题+Hash
题目描述 给出一张 $n$ 个点 $m$ 条边的无向连通图,每条边的边权为1.对于每个点 $i$ ,问是否存在另一个点 $j$ ,使得对于任意一个不为 $i$ 或 $j$ 的点 $k$ ,$i$ 到 ...
- 【uoj#180】[UR #12]实验室外的攻防战 结论题+树状数组
题目描述 给出两个长度为 $n$ 的排列 $A$ 和 $B$ ,如果 $A_i>A_{i+1}$ 则可以交换 $A_i$ 和 $A_{i+1}$ .问是否能将 $A$ 交换成 $B$ . 输入 ...
随机推荐
- LeetCode945-使数组唯一的最小增量
问题:使数组唯一的最小增量 给定整数数组 A,每次 move 操作将会选择任意 A[i],并将其递增 1. 返回使 A 中的每个值都是唯一的最少操作次数. 示例 1: 输入:[1,2,2] 输出:1 ...
- python入门:if和else的基本用法
#!/usr/bin/env python # -*- coding:utf-8 -*- #2.X用raw_input,3.X用input #if和else的基本用法 name = input(&qu ...
- 22.Yii2.0框架多表关联一对一查询之hasOne
思路: 通过文章查它对应的分类信息 一对一的关系 控制器里 //一对一关联查询 public function actionRelatesone() { //方法一,hasOne() 用查一条文章的结 ...
- python getopt模块使用方法
python中 getopt 模块,是专门用来处理命令行参数的 getop标准格式: 函数getopt(args, shortopts, longopts = []) shortopts 是短参数 ...
- 函数名&函数名取地址
有时看到如下的代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 /*****************************/ #includ ...
- PYday16&17-设计模式\选课系统习题
1.设计模式:对程序做整体得规划设计,这样做是为了更好的实现功能,使代码的可扩展性更好有27种常见的设计模式.流行的设计模式参考书:GoF设计模式.大话设计模式设计模式是为了更好的实现模块间的解耦,便 ...
- 04_ThreadLocal整合事务操作
文章导读: 本文主要讲解了如何在没有框架情况下如何解决Dao的事务问题, 重点理解Connection存放到WeakReference中为什么垃圾回收的时候Connection不回收 视频与源码下载: ...
- [转] 查看 SELinux状态及关闭SELinux
本文转载自: http://bguncle.blog.51cto.com/3184079/957315 查看SELinux状态: 1./usr/sbin/sestatus -v ##如果SE ...
- ogre3D学习基础9 -- 光源程序实例
这一章练习一下光源的使用,光源分为三种:点光源,聚光源,有向光.具体内容前面说过,这里就不解释了. 继续在上一章的程序的基础上实现. 1.创建摄像机(Camera) createCamera()函数是 ...
- python学习--学习时间属性的应用(time / datetime )
#!/usr/bin/python # -*- coding:utf-8 -*- # import time # myd={1:'a',2:'b'}# for key,value in dict.it ...