题目描述

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

无解

②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

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#define fo(a,b,c) for (a=b; a<=c; a++)
#define fd(a,b,c) for (a=b; a>=c; a--)
using namespace std; int a[2001][2001];
int f[2001][2001];
long long sum[2001][2001];
int d[2001][2];
int K,K2,n,i,j,k,l,x1,y1,x2,y2,t;
long long mx,Sum;
bool bz; long long get(int x1,int y1,int x2,int y2)
{
return sum[x2][y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1];
} int main()
{
// freopen("kup.in","r",stdin);
// freopen("kup.out","w",stdout); scanf("%d%d",&K,&n);K2=K*2;
fo(j,1,n) f[0][j]=1;
fo(i,1,n)
{
fo(j,1,n)
{
scanf("%d",&a[i][j]); if (a[i][j]<=K2)
f[i][j]=f[i-1][j];
else
f[i][j]=i+1; sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j];
}
} fo(i,1,n)
{
t=0;
fo(j,1,n)
{
bz=0;
while (t && d[t][0]<f[i][j])
{
Sum=get(d[t][0],d[t][1],i,j-1);
if (Sum>mx)
{
mx=Sum;
x1=d[t][0];y1=d[t][1];
x2=i;y2=j-1;
} --t;
bz=1;
} if (f[i][j]<=i && (!t || f[i][j]<d[t][0]))
{
++t;
d[t][0]=f[i][j];
if (!bz)
d[t][1]=j;
}
}
while (t)
{
Sum=get(d[t][0],d[t][1],i,n);
if (Sum>mx)
{
mx=Sum;
x1=d[t][0];y1=d[t][1];
x2=i;y2=n;
} --t;
}
} if (mx<K)
{
printf("0 0 0 0\n");
return 0;
}
while (mx>K2)
{
Sum=get(x1,y1,x1,y2); if (Sum>=K)
{
x2=x1;
mx=Sum; while (mx>K2)
{
if (a[x1][y1]<K)
mx-=a[x1][y1++];
else
{
mx=a[x1][y1];
y2=y1;
}
}
}
else
mx-=Sum,++x1;
} printf("%d %d %d %d\n",x1,y1,x2,y2); fclose(stdin);
fclose(stdout); return 0;
}

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. php配置 php-cgi.sock使用

    PHP配置文件: [global]pid = /run/php-fpm/php-fpm.piderror_log = /var/log/php-fpm/php-fpm.loglog_level = n ...

  2. Docker 容器操作

    1. 创建并运行 一个容器 docker run -it --rm   centos:latest  bash run  运行容器 -it  以交互方式运行容器 --rm  退出容器后删除容器 cen ...

  3. Opencv之LBP特征(算法)

    LBP(Local Binary Pattern),即局部二进制模式,对一个像素点以半径r画一个圈,在圈上取K个点(一般为8),这K个点的值(像素值大于中心点为1,否则为0)组成K位二进制数.此即局部 ...

  4. 【神经网络与深度学习】深度学习实战——caffe windows 下训练自己的网络模型

    1.相关准备 1.1 手写数字数据集 这篇博客上有.jpg格式的图片下载,附带标签信息,有需要的自行下载,博客附带百度云盘下载地址(手写数字.jpg 格式):http://blog.csdn.net/ ...

  5. 【VS开发】windows注册ActiveX控件

    ActiveX控件是一个动态链接库,是作为基于COM服务器进行操作的,并且可以嵌入在包容器宿主应用程序中,ActiveX控件的前身就是OLE控件.由于ActiveX控件与开发平台无关,因此,在一种编程 ...

  6. Conetos 下安装docker 和镜像加速

    首先升级yum yum update 安装yum-utils,它提供yum-config-manager可以用来配置repo yum install -y yum-utils 使用以下命令设置稳定版 ...

  7. MySQL -1- 简介及安装

    第一章 MySQL 大纲介绍 1.官方定义的MySQL DBA工作内容 (1)运维DBA 初级:各版本.各平台安装搭建.升级 中级:体系结构原理.基础管理(启动关闭.初始化配置文件管理.多实例管理.用 ...

  8. Linux命令基础#1

    系统基础 三大部件:CPU 内存 IO 1.CPU :运算器 控制器 存储器 2.内存:CPU的数据只能从内存读取,且内存数据有易失性(页面) 3.IO:控制总线 数据总线(一个IO) OS原理: O ...

  9. 由对称性解2-SAT问题

    由对称性解2-SAT问题 (by 伍昱,03年IOI国家集训队论文ppt) 2-SAT: 2-SAT就是2判定性问题,是一种特殊的逻辑判定问题. 2-SAT问题有何特殊性?该如何求解? 我们从一道例题 ...

  10. 解决Asp.Net core 控制台出现乱码的情况

    将控制台的编码页修改成Unicode,在运行程序或者在程序里加一行Console.OutputEncoding = Encoding.Unicode; Console.OutputEncoding = ...