题目描述
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
Sample Input1:
4 3
1 1 1
1 9 1
1 1 1
Sample Input2:
8 4
1 2 1 3
25 1 2 1
4 20 3 3
3 30 12 2
Sample Input3:
8 4
12 2 1 3
25 1 2 1
4 20 3 3
3 30 12 2
Sample Output
Sample Output1:
0 0 0 0
Sample Output2:
1 2 2 4
Sample Output3:
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<=sum<=2k 当前矩阵即为解 ③sum>2k 设当前矩阵中第一行的和为Sum 再讨论一下 1、Sum 那么用sum-Sum,不会超过k的边界,所以减掉后继续 2、k<=Sum<=2k 当前行即为解 3、Sum>2k 由于保证了矩阵中没有>2k的数,所以依次把该行中的第一个数删掉 再再讨论一下 设删掉的数大小为a A、a 那么Sum-a不会超过边界,减掉后继续 B、k<=a<=2k a即为解 C、a>2k不存在code
#include