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

题意

给定一个 \(n\times n\) 的矩阵 \(A\), (\(n\) 为奇数) , 每次可以选 \(A\) 的一个 \(\frac {n+1}2 \times \frac {n+1} 2\) 的子矩阵并让这个子矩阵中的所有值取反.

进行若干次操作最大化整个矩阵中的元素值之和. 输出这个最大值.

\(n\le 33\), \(|A_{i,j}|\le 1000\)

题解

毒瘤wls活该被A

hzoi2017_jjm 当场AC, 大强辣!

这题是个结论题.

首先我们看他 \(n\le 33\) 必有高论. 实际上就是个结论优化暴力.

接着我们发现这个 \(\frac{n+1}2\) 非常奥妙重重. 设这个值为 \(m\). 它刚好卡在比一半稍多的位置, 中间的一行一列经常被翻转. 或者说, 只要 \((i,j)\) 被翻转, \((i,m)\) 和 \((m,j)\) 一定也被翻了. 如果 \((i,j)\) 没被翻但是 \((i,m)\) 被翻了, 那么肯定当前操作的子矩阵就被怼到一边去, 导致 \((i,j\pm m)\) 被翻. 不难发现 \((i,j),(i,m),(i,j+m)\) 三个位置在一次操作中如果有一个被翻, 那么必定有且仅有另一个被翻. 也就是说这三个位置的翻转状态的异或和不变且一直是 \(0\).

这个结论显然对于另一维也成立. \((i,j),(m,j),(i+m,j)\) 三个位置的翻转状态的异或和也是 \(0\).

这三个位置的翻转状态只要知道两个显然就能计算出第三个. 而这些关系都和 \((i,m)\) 以及 \((m,j)\) 有关. 我们考虑枚举这些用得很多的位置的翻转状态. (注意到我们对于第 \(m\) 行/列, 只需要枚举一半就可以推出另一半的状态.) 容易发现第 \(m\) 行和第 \(m\) 列的状态确定后, 剩余的位置被分为若干形如 \(\{(i,j),(i+m,j),(i,j+m),(i+m,j+m)\}\) 的组合, 组合之间互相不再有影响. 于是我们可以枚举其中一个位置的状态推出其余位置的状态, 然后两种情况取 \(\max\) 求和即为答案.

虽然我们只需要枚举一半, 但是总枚举量还是有 \(2^n=2^{33}\approx 8\times 10^9\). 再加上还需要 \(O(n^2)\) 验证显然非常不靠谱.

我们又惊奇地发现, 枚举行之后, \(\{(i,j),(i+m,j),(i,j+m),(i+m,j+m)\}\) 只和 \((i,m)\) 有关. 于是我们可以分别枚举 \((i,m)\) 的状态计算一遍和再取 \(\max\) 最后求和.

总时间复杂度 \(O(2^mn^2)\).

参考代码

#include <bits/stdc++.h>

const int MAXN=50;
const int k[2]={1,-1}; int n;
int a[MAXN][MAXN];
int d[MAXN][MAXN]; int main(){
scanf("%d",&n);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",a[i]+j);
int m=(n+1)>>1;
int ans=INT_MIN;
for(int s=0;s<(1<<m);s++){
int sum=0;
for(int i=0;i<m;i++)
d[m-1][i]=((s>>i)&1)?1:-1;
for(int i=m;i<n;i++)
d[m-1][i]=d[m-1][i-m]*d[m-1][m-1];
for(int i=0;i<n;i++)
sum+=d[m-1][i]*a[m-1][i];
for(int i=0;i<m-1;i++){
int cur=INT_MIN;
for(int r=0;r<2;r++){
d[i][m-1]=k[r];
d[i+m][m-1]=d[i][m-1]*d[m-1][m-1];
int now=d[i][m-1]*a[i][m-1]+d[i+m][m-1]*a[i+m][m-1];
for(int j=0;j<m-1;j++){
int tmp=INT_MIN;
for(int r=0;r<2;r++){
d[i][j]=k[r];
d[i+m][j]=d[i][j]*d[m-1][j];
d[i][j+m]=d[i][j]*d[i][m-1];
d[i+m][j+m]=d[i+m][j]*d[i+m][m-1];
tmp=std::max(tmp,d[i][j]*a[i][j]+d[i+m][j]*a[i+m][j]+d[i][j+m]*a[i][j+m]+d[i+m][j+m]*a[i+m][j+m]);
}
now+=tmp;
}
cur=std::max(cur,now);
}
sum+=cur;
}
ans=std::max(ans,sum);
}
printf("%d\n",ans);
return 0;
}

[Codeforces 321D][2018HN省队集训D4T2] Ciel and Flipboard的更多相关文章

  1. [2018HN省队集训D9T1] circle

    [2018HN省队集训D9T1] circle 题意 给定一个 \(n\) 个点的竞赛图并在其中钦定了 \(k\) 个点, 数据保证删去钦定的 \(k\) 个点后这个图没有环. 问在不删去钦定的这 \ ...

  2. [2018HN省队集训D8T1] 杀毒软件

    [2018HN省队集训D8T1] 杀毒软件 题意 给定一个 \(m\) 个01串的字典以及一个长度为 \(n\) 的 01? 序列. 对这个序列进行 \(q\) 次操作, 修改某个位置的字符情况以及查 ...

  3. [2018HN省队集训D8T3] 水果拼盘

    [2018HN省队集训D8T3] 水果拼盘 题意 给定 \(n\) 个集合, 每个集合包含 \([1,m]\) 中的一些整数, 在这些集合中随机选取 \(k\) 个集合, 求这 \(k\) 个集合的并 ...

  4. [2018HN省队集训D6T2] girls

    [2018HN省队集训D6T2] girls 题意 给定一张 \(n\) 个点 \(m\) 条边的无向图, 求选三个不同结点并使它们两两不邻接的所有方案的权值和 \(\bmod 2^{64}\) 的值 ...

  5. [Luogu P4143] 采集矿石 [2018HN省队集训D5T3] 望乡台platform

    [Luogu P4143] 采集矿石 [2018HN省队集训D5T3] 望乡台platform 题意 给定一个小写字母构成的字符串, 每个字符有一个非负权值. 输出所有满足权值和等于这个子串在所有本质 ...

  6. [2018HN省队集训D5T2] party

    [2018HN省队集训D5T2] party 题意 给定一棵 \(n\) 个点以 \(1\) 为根的有根树, 每个点有一个 \([1,m]\) 的权值. 有 \(q\) 个查询, 每次给定一个大小为 ...

  7. [2018HN省队集训D5T1] 沼泽地marshland

    [2018HN省队集训D5T1] 沼泽地marshland 题意 给定一张 \(n\times n\) 的棋盘, 对于位置 \((x,y)\), 若 \(x+y\) 为奇数则可能有一个正权值. 你可以 ...

  8. [2018HN省队集训D1T3] Or

    [2018HN省队集训D1T3] Or 题意 给定 \(n\) 和 \(k\), 求长度为 \(n\) 的满足下列条件的数列的数量模 \(998244353\) 的值: 所有值在 \([1,2^k)\ ...

  9. [2018HN省队集训D1T1] Tree

    [2018HN省队集训D1T1] Tree 题意 给定一棵带点权树, 要求支持下面三种操作: 1 root 将 root 设为根. 2 u v d 将以 \(\operatorname{LCA} (u ...

随机推荐

  1. iOS 使用UI控件的外观协议UIAppearance进行设置默认UI控件样式

    在iOS开发中,经常会对UINavigationBar的样式进行全局样式.采用的设置方式有两种: 第一种,采用方式如下: [UINavigationBar appearance] 这种是对一类对象的默 ...

  2. XRP节点部署

    目录 XRP节点部署 准备 硬软件配置(建议) 安装Rippled服务 一. 以Stock Server模型运行 在何种情况下运行此模式 二 .以 Validator模式运行 在何种情况下运行此模式 ...

  3. 虚拟机安装Linux中常见异常及解决办法

    如果接着下去的提示按Test 的话 会出现Unable to read the disc checksum from the primary volume descriptor. This proba ...

  4. rpm包的rpmbuild spec文件详解

    http://machael.blog.51cto.com/829462/213477 上一篇日志写到,为什么要制作rpm包,以及如何使用.src.rpm文件生成rpm包.最后部分还看到.src.rp ...

  5. 用fullPage来实现全屏滚动效果

    [注意]所有的page要用div包裹,id为fullpage.不能直接包在body中 [使用fullpage的步骤] 1.导入 JQuery.js,fullpage.js,fullpage.css   ...

  6. Java版分布式ID生成器技术介绍

    分布式全局ID生成器作为分布式架构中重要的组成部分,在高并发场景下承载着分担数据库写瓶颈的压力. 之前实现过PHP+Swoole版,性能和稳定性在生产环境下运行良好.这次使用Java进行重写,目前测试 ...

  7. Hive 基础你需要掌握这些

    HDFS 中一个简单的 Join查询,是否需要撸一大串代码?我只会SQL语句 能不能入坑大数据?这里我们就来聊一聊 Hive. Hive 是什么? Hive 是一种数据仓库工具,不提供数据存储(数据还 ...

  8. windows多线程窗口程序设计

    掌握windows基于消息驱动的窗口应用程序设计的基本方法,掌握窗口程序资源的概念与设计,掌握常用的消息的程序处理方法,掌握文字图形输出相关函数编程.掌握设计的基本方法(选项),掌握时钟消息设计动画程 ...

  9. CSS - 伪类和伪元素的区别

    伪类和伪元素皆独立于文档结构.它们获取元素的途径也不是基于id.class.属性这些基础的元素特征,而是在处于特殊状态的元素(伪类),或者是元素中特别的内容(伪元素).区别总结如下: CSS伪类 (P ...

  10. hihocoder [Offer收割]编程练习赛12 [1494] ---- 一面砖墙

    原题链接 一面砖墙 算法分析 设墙的宽度为 range,则需要统计横坐标为 1,2,3,4,...,range-1 处的墙缝数,取最大的墙缝数(记为maxCrevices),从该处划一道竖线,竖线穿过 ...