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的倍数。

我们就可以更新一下两个数组。。

  1. f[r] = max(f[r],(r-l+1) * (i-tong[tot]));
  2. g[l] = max(g[l],(r-l+1) * (i-tong[tot]));

当我们矩形都找完后,还要在更新一下g数组,因为我们只考虑了紧贴的情况,而没有考虑不紧贴。

务必要倒叙枚举,因为后面的答案可以影响前面的结果,所以要倒序。

那么答案是什么呢???

  1. 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了

代码

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. using namespace std;
  5. int n,p,f[310],g[310],sum[310][310],tong[55],a[310][310],ans;
  6. inline int read()
  7. {
  8. int s = 0, w = 1; char ch = getchar();
  9. while(ch < '0' || ch > '9'){if(ch == '-') w = -1; ch = getchar();}
  10. while(ch >= '0' && ch <= '9'){s = s * 10+ch -'0'; ch = getchar();}
  11. return s * w;
  12. }
  13. void slove()
  14. {
  15. for(int i = 1; i <= n; i++) f[i] = g[i] = 0;
  16. for(int i = 1; i <= n; i++)
  17. {
  18. for(int j = 1; j <= n; j++)
  19. {
  20. sum[i][j] = sum[i][j-1] + a[i][j];//每一行求一个区间和
  21. }
  22. }
  23. for(int l = 1; l <= n; l++)//枚举左边的线
  24. {
  25. for(int r = l; r <= n; r++)//右边的线
  26. {
  27. for(int i = 1; i <= p ;i++) tong[i] = -1;//桶里存模p结果第一次出现的行数 ,tong[0] 不要忘记初始化为0
  28. int tot = 0;
  29. for(int i = 1; i <= n; i++)
  30. {
  31. tot += sum[i][r] - sum[i][l-1];
  32. tot %= p;//模p的结果开个桶
  33. if(tong[tot] != -1)//不是第一次出现
  34. {
  35. f[r] = max(f[r],(r-l+1) * (i-tong[tot]));//更新
  36. g[l] = max(g[l],(r-l+1) * (i-tong[tot]));
  37. }
  38. else tong[tot] = i;
  39. }
  40. }
  41. }
  42. for(int i = n-1; i; i--) g[i] = max(g[i],g[i+1]);//这一步考虑的是没有紧贴的情况
  43. for(int i = 1; i < n-1; i++) ans = max(ans,f[i] + g[i+1]);
  44. }
  45. void zhuan()
  46. {
  47. for(int i = 1; i <= n; i++)
  48. {
  49. for(int j = i+1; j <= n; j++)
  50. {
  51. int xx = a[i][j]; int yy = a[j][i];
  52. xx ^= yy; yy ^= xx; xx ^= yy;
  53. a[i][j] = xx; a[j][i] = yy;
  54. }
  55. }
  56. }
  57. int main()
  58. {
  59. n = read(); p = read();
  60. for(int i = 1; i <= n; i++)
  61. {
  62. for(int j = 1; j <= n; j++)
  63. {
  64. a[i][j] = read();
  65. }
  66. }
  67. slove();
  68. zhuan();
  69. slove();
  70. printf("%d\n",ans);
  71. fclose(stdin); fclose(stdout);
  72. return 0;
  73. }

ENDING

WJQ与机房的更多相关文章

  1. 最近帮客户实施的基于SQL Server AlwaysOn跨机房切换项目

    最近帮客户实施的基于SQL Server AlwaysOn跨机房切换项目 最近一个来自重庆的客户找到走起君,客户的业务是做移动互联网支付,是微信支付收单渠道合作伙伴,数据库里存储的是支付流水和交易流水 ...

  2. 从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点)

    从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www ...

  3. SQL Server 跨网段(跨机房)FTP复制

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 搭建过程(Process) 注意事项(Attention) 参考文献(References) ...

  4. SQL Server 跨网段(跨机房)复制

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 解决方案(Solution) 搭建过程(Process) 注意事项(Attention) 参考 ...

  5. IT基础架构规划方案二(计算机系统与机房规划规划)

    计算机系统规划       服务器硬件选型规划方案       根据对某集团的实际调研,获取了企业业务应用系统的建设情况,随着企业信息化建设的推进,需要对各种信息化管理系统和应用系统的服务器选型进行选 ...

  6. IDC机房线路质量测试方案

    1.测试节点: 北京:123.206.*.* 上海:139.196.*.* 广州:119.29.*.* 汕头:125.91.*.* 香港:103.20.*.* 美国:198.52.*.* 测试服务器: ...

  7. Codevs 2370 小机房的树 LCA 树上倍增

    题目描述 Description 小机房有棵焕狗种的树,树上有N个节点,节点标号为0到N-1,有两只虫子名叫飘狗和大吉狗,分居在两个不同的节点上.有一天,他们想爬到一个节点上去搞基,但是作为两只虫子, ...

  8. [转]搬瓦工换机房换ip之后不能连外网

    搬瓦工换机房换ip之后不能连外网 时间 2015-07-21 15:17:16  Wendal随笔 原文  http://wendal.net/2015/07/21.html 主题 iptables ...

  9. 本机,同机房,同城,异地,不同城,腾讯云ping延时值

    本机,同机房,同城,异地,不同城,腾讯云ping延时值 ping本机: 0.01ms ping同机房机器: 0.1ms ping同城机器: 1ms ping不同城机器: 20ms 北(南)方ping南 ...

随机推荐

  1. [PyTorch 学习笔记] 4.3 优化器

    本章代码: https://github.com/zhangxiann/PyTorch_Practice/blob/master/lesson4/optimizer_methods.py https: ...

  2. 2020最新Servlet+form表单实现文件上传(图片)

    servlet实现文件上传接受 这几天学了一点文件上传,有很多不会,在网查了许多博客,但是最新的没有,都比较久了 因为我是小白,版本更新了,以前的方法自己费了好久才弄懂,写个随笔方便以后查找 代码奉上 ...

  3. tars 问题汇总

    1. 节点 ip地址变了如何解决.后台不可以改. 2. [ok] 服务如何在本地运行../HelloGo --config.conf

  4. Mono嵌入C++

    http://docs.go-mono.com/index.aspx?link=xhtml%3Adeploy%2Fmono-api-embedding.html https://www.mono-pr ...

  5. Pandas | Dataframe的merge操作,像数据库一样尽情join

    今天是pandas数据处理第8篇文章,我们一起来聊聊dataframe的合并. 常见的数据合并操作主要有两种,第一种是我们新生成了新的特征,想要把它和旧的特征合并在一起.第二种是我们新获取了一份数据集 ...

  6. 用Python实现十大经典排序算法-插入、选择、快速、冒泡、归并等

    本文来用图文的方式详细讲解了Python十大经典排序算法 —— 插入排序.选择排序.快速排序.冒泡排序.归并排序.希尔排序.插入排序.桶排序.基数排序.计数排序算法,想要学习的你们,继续阅读下去吧,如 ...

  7. Mysql业务设计(逻辑设计)

    逻辑设计 数据库设计三大范式 数据库设计第一大范式 数据库表中所有的字段都只具有单一属性 单一属性的列是由基本数据类型所构成 设计出来的表都是简单的二维表 数据库设计的第二大范式 要求表中只有一个业务 ...

  8. css实现导航栏下划线跟随效果

    话不多说先附上代码 <style> ul li { float: left; display: block; list-style: none; margin-left: 20px; bo ...

  9. URL 传参转义 (特殊符号转义)

    问题: url参数中 存在+,空格,/,?,%,#,&,=等特殊符号的时候,可能在服务器端无法获得正确的参数值,如何是好? 解决办法:将这些字符转化成服务器可以识别的字符,对应关系如下:URL ...

  10. 解决Maven的JDK版本问题

    在pom文件中添加以下代码 <build> <plugins> <plugin> <groupId>org.apache.maven.plugins&l ...