题目描述

Description

首先你们得承认今天的题目很短很简洁。。。

然后,你们还得承认接下来这个题目的描述更加简洁!!!

Task:给出一个N*N(1≤N≤2000)的矩阵,还给出一个整数K。要你在给定的矩阵中

求一个子矩阵,这个子矩阵中所有数的和的范围要在[k,2*k] 这个区间。

如果有多个这样的子矩阵,请随便输出一个。

Input

第一行包含两个整数K 和N(1≤K≤10^8,1≤N≤2000)。其意义如题目描述!

接下来有N 行,每行有N 个数,表示题目给出的矩阵。矩阵中的数都是非负数,而且

不大于maxlongint。

Output

输出文件仅包含一行,四个整数,分别是你找出来的矩阵的左上角坐标和右下角坐标。

如果不存在这样的子矩阵,请输出0 0 0 0。

Sample Input

  1. Sample Input1:
  2. 4 3
  3. 1 1 1
  4. 1 9 1
  5. 1 1 1
  6. Sample Input2:
  7. 8 4
  8. 1 2 1 3
  9. 25 1 2 1
  10. 4 20 3 3
  11. 3 30 12 2
  12. Sample Input3:
  13. 8 4
  14. 12 2 1 3
  15. 25 1 2 1
  16. 4 20 3 3
  17. 3 30 12 2

Sample Output

  1. Sample Output1:
  2. 0 0 0 0
  3. Sample Output2:
  4. 1 2 2 4
  5. Sample Output3:
  6. 1 1 1 1

Data Constraint

Hint

数据约定:

对于30%的数据,1≤N≤5

对于60%的数据,1≤N≤60

对于100%的数据1≤N≤2000

题解

一道神题

首先>2k的数肯定不能选,所以先找一个不包含>2k的数的最大矩阵

用栈可以O(n^2)求出

然后讨论一下

①sum<k

无解

②k<=sum<=2k

当前矩阵即为解

③sum>2k

设当前矩阵中第一行的和为Sum

再讨论一下

1、Sum<k

那么用sum-Sum,不会超过k的边界,所以减掉后继续

2、k<=Sum<=2k

当前行即为解

3、Sum>2k

由于保证了矩阵中没有>2k的数,所以依次把该行中的第一个数删掉

再再讨论一下

设删掉的数大小为a

A、a<k

那么Sum-a不会超过边界,减掉后继续

B、k<=a<=2k

a即为解

C、a>2k

不存在

code

  1. #include <algorithm>
  2. #include <iostream>
  3. #include <cstdlib>
  4. #include <cstring>
  5. #include <cstdio>
  6. #define fo(a,b,c) for (a=b; a<=c; a++)
  7. #define fd(a,b,c) for (a=b; a>=c; a--)
  8. using namespace std;
  9. int a[2001][2001];
  10. int f[2001][2001];
  11. long long sum[2001][2001];
  12. int d[2001][2];
  13. int K,K2,n,i,j,k,l,x1,y1,x2,y2,t;
  14. long long mx,Sum;
  15. bool bz;
  16. long long get(int x1,int y1,int x2,int y2)
  17. {
  18. return sum[x2][y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1];
  19. }
  20. int main()
  21. {
  22. // freopen("kup.in","r",stdin);
  23. // freopen("kup.out","w",stdout);
  24. scanf("%d%d",&K,&n);K2=K*2;
  25. fo(j,1,n) f[0][j]=1;
  26. fo(i,1,n)
  27. {
  28. fo(j,1,n)
  29. {
  30. scanf("%d",&a[i][j]);
  31. if (a[i][j]<=K2)
  32. f[i][j]=f[i-1][j];
  33. else
  34. f[i][j]=i+1;
  35. sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j];
  36. }
  37. }
  38. fo(i,1,n)
  39. {
  40. t=0;
  41. fo(j,1,n)
  42. {
  43. bz=0;
  44. while (t && d[t][0]<f[i][j])
  45. {
  46. Sum=get(d[t][0],d[t][1],i,j-1);
  47. if (Sum>mx)
  48. {
  49. mx=Sum;
  50. x1=d[t][0];y1=d[t][1];
  51. x2=i;y2=j-1;
  52. }
  53. --t;
  54. bz=1;
  55. }
  56. if (f[i][j]<=i && (!t || f[i][j]<d[t][0]))
  57. {
  58. ++t;
  59. d[t][0]=f[i][j];
  60. if (!bz)
  61. d[t][1]=j;
  62. }
  63. }
  64. while (t)
  65. {
  66. Sum=get(d[t][0],d[t][1],i,n);
  67. if (Sum>mx)
  68. {
  69. mx=Sum;
  70. x1=d[t][0];y1=d[t][1];
  71. x2=i;y2=n;
  72. }
  73. --t;
  74. }
  75. }
  76. if (mx<K)
  77. {
  78. printf("0 0 0 0\n");
  79. return 0;
  80. }
  81. while (mx>K2)
  82. {
  83. Sum=get(x1,y1,x1,y2);
  84. if (Sum>=K)
  85. {
  86. x2=x1;
  87. mx=Sum;
  88. while (mx>K2)
  89. {
  90. if (a[x1][y1]<K)
  91. mx-=a[x1][y1++];
  92. else
  93. {
  94. mx=a[x1][y1];
  95. y2=y1;
  96. }
  97. }
  98. }
  99. else
  100. mx-=Sum,++x1;
  101. }
  102. printf("%d %d %d %d\n",x1,y1,x2,y2);
  103. fclose(stdin);
  104. fclose(stdout);
  105. return 0;
  106. }

1222/2516. Kup的更多相关文章

  1. 【BZOJ-1127】KUP 悬线法 + 贪心

    1127: [POI2008]KUP Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 317  Solved: 11 ...

  2. SQL SERVER错误:已超过了锁请求超时时段。 (Microsoft SQL Server,错误: 1222)

    在SSMS(Microsoft SQL Server Management Studio)里面,查看数据库对应的表的时候,会遇到"Lock Request time out period e ...

  3. POJ 1222 (开关问题+高斯消元法)

    题目链接: http://poj.org/problem?id=1222 题目大意:一堆开关,或开或关.每个开关按下后,周围4个方向开关反转.问使最后所有开关都关闭的,开关按法.0表示不按,1表示按. ...

  4. bzoj 1222 DP

    用w[i]表示在A中用了i的时间时在B中最少用多长时间,然后转移就可以了. 备注:这个边界不好定义,所以可以每次用一个cur来存储最优值,然后对w[i]赋值就可以了. /*************** ...

  5. ural 1222. Chernobyl’ Eagles

    1222. Chernobyl’ Eagles Time limit: 1.0 secondMemory limit: 64 MB A Chernobyl’ eagle has several hea ...

  6. 【wikioi】1222 信与信封问题(二分图+特殊的技巧)

    http://wikioi.com/problem/1222/ 一开始我就想到这样构图的,即可能的连边.但是似乎无法判断. 然后想来想去想不出来.. 题解: 同样是二分图,将可能的连边,然后跑一次最大 ...

  7. Poj 1222 EXTENDED LIGHTS OUT

    题目大意:给你一个5*6的格子,每个格子中有灯(亮着1,暗着0),每次你可以把一个暗的点亮(或者亮的熄灭)然后它上下左右的灯也会跟着变化.最后让你把所有的灯熄灭,问你应该改变哪些灯. 首先我们可以发现 ...

  8. poj 1222 EXTENDED LIGHTS OUT(位运算+枚举)

    http://poj.org/problem?id=1222 题意:给一个确定的5*6放入矩阵.每一个格子都有一个开关和一盏灯,0表示灯没亮,1表示灯亮着.让你输出一个5*6的矩阵ans[i][j], ...

  9. bzoj 1222: [HNOI2001]产品加工 dp

    1222: [HNOI2001]产品加工 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 381  Solved: 218[Submit][Status ...

随机推荐

  1. 剑指OFFER数据结构与算法分类

    目录 数据结构 算法 数据结构 数组 有序二维数组查找 数组相对位置排序 数组顺时针输出 把数组排成最小的数 数组中的逆序对 扑克牌顺子 数组中重复的数字 构建乘积数组 链表 链表反向插入ArrayL ...

  2. Python中调用c语言(简单版)

    Python中有时需要调用c程序中的函数.使用ctype库可以很方便地调用c语言.现说明方法,以及注意事项. c程序编译为.so文件: 我们需要的c语言文件为test.c,要从其中调用func(x,y ...

  3. 深入理解java:4.1. 框架编程之Spring MVC

    说到java的mvc框架,struts2和springmvc想必大家都知道, Spring MVC是当前最优秀的MVC框架,自从Spring 2.5版本发布后,由于支持注解配置,易用性有了大幅度的提高 ...

  4. [转帖]预警 | Linux 爆“SACK Panic”远程DoS漏洞,大量主机受影响

    预警 | Linux 爆“SACK Panic”远程DoS漏洞,大量主机受影响   https://cloud.tencent.com/developer/article/1447879 所有的 版本 ...

  5. 解决 Illegal DefaultValue null for parameter type integer 异常

    该异常是由 swagger 引起的 swagger 版本 1.9.2 解决原因:重新导入 swagger-annotations 和 swagger-models 版本 为 1.5.21 pom.xm ...

  6. 图片服务器期,利用一下园子练习一下markdown

    图片储存

  7. java向word中插入Excel附件

    1.word中插入对象的原理 编辑word,向word中插入图片.EXCEL.WORD等附件,再将word保存为xml格式,通过XML查看工具打开xml格式的word的源码,通过对比源码, 可以发现平 ...

  8. css 超出部分显示省略号 汇总

    单行: 加宽度 overflow: hidden; text-overflow:ellipsis; white-space: nowrap; 多行: display: -webkit-box; -we ...

  9. js 元素offset,client , scroll 三大系列总结

    1,element.offsetWidth : 包括 padding 和 边框 2,element.clientWidth : 包括 padding ,不包含边框 , 内容超出会溢出盒子的时候,就用s ...

  10. C++ 临时对象的生存周期

    C++ 临时对象的生存周期是一个不小的坑,参考 C++ standard 第十二章第二节,总结其规则如下: 基本原则:临时变量生存到其所在的完整表达式执行完毕之后(若作为函数参数,则以函数所在的完整表 ...