题目链接   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})$

  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define rep(i, a, b) for (int i(a); i <= (b); ++i)
  6. #define dec(i, a, b) for (int i(a); i >= (b); --i)
  7.  
  8. const int N = 53;
  9. const int mul[2] = {1, -1};
  10.  
  11. int a[N][N];
  12. int n, x;
  13. int st[N][N];
  14. int ans;
  15.  
  16. int main(){
  17.  
  18. scanf("%d", &n);
  19. rep(i, 0, n - 1) rep(j, 0, n - 1) scanf("%d", &a[i][j]);
  20. x = (n + 1) / 2;
  21. ans = -(1 << 30);
  22. rep(s, 0, (1 << x) - 1){
  23. int sum = 0;
  24. rep(i, 0, x - 1) st[x - 1][i] = (s >> i) & 1;
  25. rep(i, x, n - 1) st[x - 1][i] = st[x - 1][i - x] ^ st[x - 1][x - 1];
  26. rep(i, 0, n - 1) sum += mul[st[x - 1][i]] * a[x - 1][i];
  27. rep(i, 0, x - 2){
  28. int cnt = -(1 << 30);
  29. rep(op, 0, 1){
  30. st[i][x - 1] = op;
  31. st[i + x][x - 1] = op ^ st[x - 1][x - 1];
  32. int now = a[i][x - 1] * mul[op] + a[i + x][x - 1] * mul[st[i + x][x - 1]];
  33. rep(j, 0, x - 2){
  34. int et = -(1 << 30);
  35. rep(ct, 0, 1){
  36. st[i][j] = ct;
  37. st[i][j + x] = ct ^ st[i][x - 1];
  38. st[i + x][j] = ct ^ st[x - 1][j];
  39. st[i + x][j + x] = st[i + x][x - 1] ^ st[i + x][j];
  40. 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]]);
  41. }
  42. now += et;
  43. }
  44. cnt = max(cnt, now);
  45. }
  46. sum += cnt;
  47. }
  48. ans = max(ans, sum);
  49. }
  50. printf("%d\n", ans);
  51. return 0;
  52. }

  

Codeforces 321D Ciel and Flipboard(结论题+枚举)的更多相关文章

  1. [Codeforces 321D][2018HN省队集训D4T2] Ciel and Flipboard

    [Codeforces 321D][2018HN省队集训D4T2] Ciel and Flipboard 题意 给定一个 \(n\times n\) 的矩阵 \(A\), (\(n\) 为奇数) , ...

  2. codeforces 1269D. Domino for Young (二分图证明/结论题)

    链接:https://codeforces.com/contest/1269/problem/D 题意:给一个不规则的网格,在上面放置多米诺骨牌,多米诺骨牌长度要么是1x2,要么是2x1大小,问最多放 ...

  3. 【bzoj4401】块的计数 结论题

    题目描述 给出一棵n个点的树,求有多少个si使得整棵树可以分为n/si个连通块. 输入 第一行一个正整数N,表示这棵树的结点总数,接下来N-1行,每行两个数字X,Y表示编号为X的结点与编号为Y的结点相 ...

  4. [codevs5578][咸鱼]tarjan/结论题

    5578 咸鱼  时间限制: 1 s  空间限制: 128000 KB   题目描述 Description 在广袤的正方形土地上有n条水平的河流和m条垂直的河流,发达的咸鱼家族在m*n个河流交叉点都 ...

  5. BZOJ_1367_[Baltic2004]sequence_结论题+可并堆

    BZOJ_1367_[Baltic2004]sequence_结论题+可并堆 Description Input Output 一个整数R Sample Input 7 9 4 8 20 14 15 ...

  6. [BZOJ3609][Heoi2014]人人尽说江南好 结论题

    Description 小 Z 是一个不折不扣的 ZRP(Zealot Round-game Player,回合制游戏狂热玩家), 最近他 想起了小时候在江南玩过的一个游戏.     在过去,人们是要 ...

  7. 【uoj#282】长度测量鸡 结论题

    题目描述 给出一个长度为 $\frac{n(n+1)}2$ 的直尺,要在 $0$ 和 $\frac{n(n+1)}2$ 之间选择 $n-1$ 个刻度,使得 $1\sim \frac{n(n+1)}2$ ...

  8. 【uoj#175】新年的网警 结论题+Hash

    题目描述 给出一张 $n$ 个点 $m$ 条边的无向连通图,每条边的边权为1.对于每个点 $i$ ,问是否存在另一个点 $j$ ,使得对于任意一个不为 $i$ 或 $j$ 的点 $k$ ,$i$ 到 ...

  9. 【uoj#180】[UR #12]实验室外的攻防战 结论题+树状数组

    题目描述 给出两个长度为 $n$ 的排列 $A$ 和 $B$ ,如果 $A_i>A_{i+1}$ 则可以交换 $A_i$ 和 $A_{i+1}$ .问是否能将 $A$ 交换成 $B$ . 输入 ...

随机推荐

  1. MySQL写delete语句时不支持表别名

    今天写代码时发现了下面一个比较奇怪的问题: 有下面的删除数据的SQL ; 这个sql本来没有问题,但是在MySQL中执行时会报错 ; 原因是 MySQL写delete语句时不支持表别名,困扰了我一会儿 ...

  2. PHP 代码优化建议

    1.尽量静态化: 如果一个方法能被静态,那就声明它为静态的,速度可提高1/4,甚至我测试的时候,这个提高了近三倍.当然了,这个测试方法需要在十万级以上次执行,效果才明显.其实静态方法和非静态方法的效率 ...

  3. apply 与 lambda

    Python中的lambda和apply用法  https://blog.csdn.net/anshuai_aw1/article/details/82347016

  4. 学习pwn的一些指导

    使用ret2libc攻击方法绕过数据执行保护 http://blog.csdn.net/linyt/article/details/43643499 格式化字符串利用小结 http://www.cnb ...

  5. 下载linaro android 4.4.2 for panda4460

    $ export MANIFEST_REPO=git://android.git.linaro.org/platform/manifest.git$ export MANIFEST_BRANCH=li ...

  6. Java构造器(construtor)与垃圾收集器(GB)

    在Java中,程序员会在乎内存中的两块空间. 堆(heap)和栈(stack). 当java虚拟机启动时, 它会从底层的操作系统取得一块内存, 并且以此块内存来执行java程序. 在Java中, 实例 ...

  7. Python类元编程

    类元编程是指在运行时创建或定制类.在Python中,类是一等对象,因此任何时候都可以使用函数创建新类,而无需用class关键字.类装饰器也是函数,不过能够审查.修改,甚至把被装饰的类替换成其他类.元类 ...

  8. luogu2951 noip2017 小凯的疑惑

    在考场上我们可以打表发现规律是 $ ab-a-b $ .下面给出证明(看的网上的). 若有正数 $ x $ 不能被 $ a $ , $ b $ 组合出,假设 $ a>b $ ,则存在 \[ x= ...

  9. tomcat6-endpoint设计

    之前写的一个ppt 搬到博客来

  10. GBDT 与 XGBoost

    GBDT & XGBoost ### 回归树 单棵回归树可以表示成如下的数学形式 \[ f(x) = \sum_j^Tw_j\mathbf{I}(x\in R_j) \] 其中\(T\)为叶节 ...