WJQ与机房

sample input
5 6
7 2 3 1 1
5 0 6 0 0
8 6 6 5 3
4 3 7 8 2
4 0 0 6 9
sample output
20
样例解释:
分别以(2,1)为左上角(5,2)为右下角和以(1,3)为左上角以(4,5)
为右下角的两个矩阵。
数据范围:
对于20的数据n≤5
对于50的数据n≤50
另有5的数据满足所有电脑的便利值均为1
另另有25的数据满足所有的电脑便利值相同
对于100的数据满足n≤300,p≤50,0≤a[i][j]≤65536
首先,我们会想到n^4的暴力dp,但一看n的范围,完全装不下。
所以我们要考虑优化掉一维。
我们考虑枚举l和r这两条线,代表矩形的左右边界,同时我们对每一行求一个前缀和,方便我们更新。

l和r为矩形的左右两边,i和tong[i]为上下两边。
tong[i]的作用下次再说。
这样,我们就会得到每个矩形的和,并考虑对答案的贡献。
我们开两个数组f[i],g[i]
g[i]表示i这条直线的右边的最大矩形(不一定紧贴)
f[i]是紧贴着i这条线的左边的最大矩形
tong[i]存每一次矩形数字之和%p后的结果,第一次出现在哪一行。-1为没有出现过。(可能有点绕口雾)
tot为当前矩形的数字之和 tot += sum[i][r] - sum[i][l-1];
设k为tot % p之后的结果,当k不为1时会有以下两种情况。
1.k为0,是p的倍数,表明可以更新答案。
2.k这个结果以前出现过,那么tong[k]到k这一行矩形的数字和也恰好是p的倍数。
我们就可以更新一下两个数组。。
f[r] = max(f[r],(r-l+1) * (i-tong[tot]));
g[l] = max(g[l],(r-l+1) * (i-tong[tot]));
当我们矩形都找完后,还要在更新一下g数组,因为我们只考虑了紧贴的情况,而没有考虑不紧贴。
务必要倒叙枚举,因为后面的答案可以影响前面的结果,所以要倒序。
那么答案是什么呢???
for(int i = 1; i < n-1; i++) ans = max(ans,f[i] + g[i+1]);
i一定要到n-2不能到n-1,因为到n的话g数组的定义就会矛盾。
g[i+1]是为了防止与f[i]的边重叠。
PS:
对于为什么在“第二种:以前出现过模p得到k的情况”的时候也要更新答案?“
我们重新考虑题意:一块矩形的和是p的倍数,也就是模p为零
可以用式子表示为:
s当前−s上一次≡0(modp)
进一步转化为:
s当前≡s上一次(modp)
所以可理解为,只要上一次和这一次在模p意义的数字一样,就可以更新答案了,因为他们相减之后一定是p的倍数,可手跑几组例子
至此,关于“第二种:以前出现过模p得到k的情况”的时候也要更新答案?”这句话,也就不难理解了——from Thestars。
但我们发现少考虑了一种一个矩形在上,一个矩形在下的情况,这是我们只要旋转一下,在跑一遍就ok了
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,p,f[310],g[310],sum[310][310],tong[55],a[310][310],ans;
inline int read()
{
int s = 0, w = 1; char ch = getchar();
while(ch < '0' || ch > '9'){if(ch == '-') w = -1; ch = getchar();}
while(ch >= '0' && ch <= '9'){s = s * 10+ch -'0'; ch = getchar();}
return s * w;
}
void slove()
{
for(int i = 1; i <= n; i++) f[i] = g[i] = 0;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
sum[i][j] = sum[i][j-1] + a[i][j];//每一行求一个区间和
}
}
for(int l = 1; l <= n; l++)//枚举左边的线
{
for(int r = l; r <= n; r++)//右边的线
{
for(int i = 1; i <= p ;i++) tong[i] = -1;//桶里存模p结果第一次出现的行数 ,tong[0] 不要忘记初始化为0
int tot = 0;
for(int i = 1; i <= n; i++)
{
tot += sum[i][r] - sum[i][l-1];
tot %= p;//模p的结果开个桶
if(tong[tot] != -1)//不是第一次出现
{
f[r] = max(f[r],(r-l+1) * (i-tong[tot]));//更新
g[l] = max(g[l],(r-l+1) * (i-tong[tot]));
}
else tong[tot] = i;
}
}
}
for(int i = n-1; i; i--) g[i] = max(g[i],g[i+1]);//这一步考虑的是没有紧贴的情况
for(int i = 1; i < n-1; i++) ans = max(ans,f[i] + g[i+1]);
}
void zhuan()
{
for(int i = 1; i <= n; i++)
{
for(int j = i+1; j <= n; j++)
{
int xx = a[i][j]; int yy = a[j][i];
xx ^= yy; yy ^= xx; xx ^= yy;
a[i][j] = xx; a[j][i] = yy;
}
}
}
int main()
{
n = read(); p = read();
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
a[i][j] = read();
}
}
slove();
zhuan();
slove();
printf("%d\n",ans);
fclose(stdin); fclose(stdout);
return 0;
}
ENDING
WJQ与机房的更多相关文章
- 最近帮客户实施的基于SQL Server AlwaysOn跨机房切换项目
最近帮客户实施的基于SQL Server AlwaysOn跨机房切换项目 最近一个来自重庆的客户找到走起君,客户的业务是做移动互联网支付,是微信支付收单渠道合作伙伴,数据库里存储的是支付流水和交易流水 ...
- 从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点)
从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www ...
- SQL Server 跨网段(跨机房)FTP复制
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 搭建过程(Process) 注意事项(Attention) 参考文献(References) ...
- SQL Server 跨网段(跨机房)复制
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 解决方案(Solution) 搭建过程(Process) 注意事项(Attention) 参考 ...
- IT基础架构规划方案二(计算机系统与机房规划规划)
计算机系统规划 服务器硬件选型规划方案 根据对某集团的实际调研,获取了企业业务应用系统的建设情况,随着企业信息化建设的推进,需要对各种信息化管理系统和应用系统的服务器选型进行选 ...
- IDC机房线路质量测试方案
1.测试节点: 北京:123.206.*.* 上海:139.196.*.* 广州:119.29.*.* 汕头:125.91.*.* 香港:103.20.*.* 美国:198.52.*.* 测试服务器: ...
- Codevs 2370 小机房的树 LCA 树上倍增
题目描述 Description 小机房有棵焕狗种的树,树上有N个节点,节点标号为0到N-1,有两只虫子名叫飘狗和大吉狗,分居在两个不同的节点上.有一天,他们想爬到一个节点上去搞基,但是作为两只虫子, ...
- [转]搬瓦工换机房换ip之后不能连外网
搬瓦工换机房换ip之后不能连外网 时间 2015-07-21 15:17:16 Wendal随笔 原文 http://wendal.net/2015/07/21.html 主题 iptables ...
- 本机,同机房,同城,异地,不同城,腾讯云ping延时值
本机,同机房,同城,异地,不同城,腾讯云ping延时值 ping本机: 0.01ms ping同机房机器: 0.1ms ping同城机器: 1ms ping不同城机器: 20ms 北(南)方ping南 ...
随机推荐
- 【Android】AndroidStudio关于EventBus报错解决方法its super classes have no public methods with the @Subscribe
作者:程序员小冰,GitHub主页:https://github.com/QQ986945193 新浪微博:http://weibo.com/mcxiaobing 首先说明,以前我用eventBus的 ...
- 腾讯大牛半年心血高级编程PDF,帮你轻松构建企业级Web应用
毫无疑问,Java 是这些年来最流行的编程语言之一.它无处不在一计算机. 手机.网站以及各种嵌入式设备中都存在着大量的Java 应用程序,而其中应用最为广泛的应该就是Java EE Web应用程序(以 ...
- sort(桶排序+hash)
题目链接:https://cn.vjudge.net/problem/HDU-1425 注意是多组输入 代码: #include<cstdio> #include<iostream& ...
- 面试【JAVA基础】Web与网络
1.转发与重定向的区别 转发是服务器请求资源,服务器直接访问目标地址url,把响应内容返回给浏览器. 重定向根据服务器返回的状态码重新请求地址. 转发是服务器行为,重定向是客户端行为. 转发显示的ur ...
- 深入了解Kafka【一】概述与基础架构
1.概述 Kafka是一个分布式的.基于发布订阅的消息系统,主要解决应用解耦.异步消息.流量削峰等问题. 2.发布订阅模型 消息生产者将消息发布到Topic中,同时有多个消息消费者订阅该消息,消费者消 ...
- Prometheus 与 国产 TDengine 的对比
通过对比,能加深对这两个系统的理解,方便后续架构选型时作出正确决定.他们的设计思路有很多值得借鉴的地方,虽然工作中需要用到这些知识的地方不多,但是了解他们的设计细节能极大满足我的好奇心. 1.场景和需 ...
- Combine 框架,从0到1 —— 4.在 Combine 中使用通知
本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 4.在 Combine 中使用通知. 内容概览 前言 让通知处理代码使用 Combine 总结 ...
- RabbitMQ安装和运行
RabbitMQ在Windows下安装和运行 1.下载Erlang: http://www.erlang.org/downloads/19.2 2.下载Windows版RabbitMq: http:/ ...
- parseQueryString
var parseQueryString = function (url) { var reg = /([^\?\=\&]+)\=([^\?\=\&]*)/g; var o ...
- 5 分钟带你掌握 Makefile 分析
摘要:Makefile是一个名为GNU-Make软件所需要的脚本文件,该脚本文件可以指导Make软件控制arm-gcc等工具链去编译工程文件最终得到可执行文件,几乎所有的Linux发行版都内置了GNU ...