Description

给一个\(n\times n\)的地图,每个格子有一个价格,找一个矩形区域,使其价格总和位于[k,2k]

Input

输入k n(n<2000)和一个\(n\times n\)的地图

Output

输出矩形的左上和右下的列-行坐标或NIE

Sample Input 1

4 3

1 1 1

1 9 1

1 1 1

Sample Output 1

NIE

Sample Input 2

8 4

1 2 1 3

25 1 2 1

4 20 3 3

3 30 12 2

Sample Output 2

2 1 4 2

HINT

1<=k<=10^9 每个价格都是不大于2$\times$10^9的非负整数


首先如果单点有就直接输出,否则的话,我们把<k的点给标记一下,那么我们可以发现,答案必然是标记的点所构成的极大子矩阵中的子矩阵。所以我们对标记的点求一次极大子矩阵,然后看情况不断对矩阵删减即可。如果不会极大子矩阵的话可以参考该国家队论文王知昆--浅谈用极大化思想解决最大子矩形问题

/*program from Wolfycz*/
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 0x7f7f7f7f
using namespace std;
typedef long long ll;
typedef unsigned int ui;
typedef unsigned long long ull;
inline int read(){
int x=0,f=1;char ch=getchar();
for (;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') f=-1;
for (;ch>='0'&&ch<='9';ch=getchar()) x=(x<<1)+(x<<3)+ch-'0';
return x*f;
}
inline void print(int x){
if (x>=10) print(x/10);
putchar(x%10+'0');
}
const int N=2e3;
int map[N+10][N+10],L[N+10][N+10],R[N+10][N+10],l[N+10][N+10],r[N+10][N+10],h[N+10][N+10];
ll sum[N+10][N+10];
int k,n;
ll 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];}
void write(int x1,int y1,int x2,int y2){
while (get(x1,y1,x2,y2)>2*k){
if (get(x1+1,y1,x2,y2>=k)) x1++;
else if (get(x1,y1,x2-1,y2)>=k) x2--;
else if (get(x1,y1+1,x2,y2)>=k) y1++;
else if (get(x1,y1,x2,y2-1)>=k) y2--;
}
printf("%d %d %d %d\n",y1,x1,y2,x2);
exit(0);
}
int main(){
k=read(),n=read();
for (int i=1;i<=n;i++){
for (int j=1;j<=n;j++){
map[i][j]=read();
if (map[i][j]>=k&&map[i][j]<=2*k){
printf("%d %d %d %d\n",j,i,j,i);
return 0;
}
sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+map[i][j];
}
}
for (int i=1;i<=n;i++){
int nowl=0;
for (int j=1;j<=n;j++) map[i][j]<k?L[i][j]=nowl+1:nowl=j;
}
for (int i=1;i<=n;i++){
int nowr=n+1;
for (int j=n;j>=1;j--) map[i][j]<k?R[i][j]=nowr-1:nowr=j;
}
for (int i=1;i<=n;i++){
for (int j=1;j<=n;j++){
if (map[i][j]>2*k) continue;
if (i==1||map[i-1][j]>2*k) h[i][j]=1,l[i][j]=L[i][j],r[i][j]=R[i][j];
else h[i][j]=h[i-1][j]+1,l[i][j]=max(l[i-1][j],L[i][j]),r[i][j]=min(r[i-1][j],R[i][j]);
}
}
for (int i=1;i<=n;i++){
for (int j=1;j<=n;j++){
if (map[i][j]<=k<<1){
int x1=i-h[i][j]+1,y1=l[i][j],x2=i,y2=r[i][j];
if (get(x1,y1,x2,y2)>=k) write(x1,y1,x2,y2);
}
}
}
printf("NIE\n");
return 0;
}

[POI2008]KUP的更多相关文章

  1. 1127: [POI2008]KUP

    1127: [POI2008]KUP https://lydsy.com/JudgeOnline/problem.php?id=1127 分析: 如果存在一个点大于等于k,小于等于2k的话,直接输出. ...

  2. [BZOJ1127][POI2008] KUP子矩阵

    Description 给一个n*n的地图,每个格子有一个价格,找一个矩形区域,使其价格总和位于[k,2k] Input 输入k n(n<2000)和一个n*n的地图 Output 输出矩形的左 ...

  3. bzoj1127: [POI2008]KUP

    Description 给一个n*n的地图,每个格子有一个价格,找一个矩形区域,使其价格总和位于[k,2k] Input 输入k n(n<2000)和一个n*n的地图 Output 输出矩形的左 ...

  4. bzoj1127[POI2008]KUP 悬线法

    Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 485  Solved: 174[Submit][Status][D ...

  5. [BZOJ] 1127: [POI2008]KUP

    似曾相识的感觉 考虑另一个判断问题,给定一个k,问这个k是否可行 存在矩形和\(sum>2k\),则该矩阵不对判定做出贡献 存在矩形和\(sum\in [k,2k]\),则我们找到了一个解 于是 ...

  6. bzoj 1127 [POI2008]KUP——思路(悬线法)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1127 大于2*K的视为不能选的“坏点”.有单个格子满足的就直接输出. 剩下的都是<K的 ...

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

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

  8. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  9. [BZOJ1112][POI2008]砖块Klo

    [BZOJ1112][POI2008]砖块Klo 试题描述 N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另 ...

随机推荐

  1. 【python】super()

    转自: http://www.cnblogs.com/lovemo1314/archive/2011/05/03/2035005.html

  2. Android 开源框架ViewPageIndicator 和 ViewPager 仿网易新闻clientTab标签

    之前用JakeWharton的开源框架ActionBarSherlock和ViewPager实现了对网易新闻clientTab标签的功能,ActionBarSherlock是在3.0下面的机器支持Ac ...

  3. There is no PasswordEncoder mapped for the id "null"

    There is no PasswordEncoder mapped for the id "null" 学习了:https://blog.csdn.net/dream_an/ar ...

  4. centos Crontab

    minute   hour   day   month   week   command     顺序:分 时 日 月 周 命令 第1列分钟1-59第2列小时1-23(0表示子夜)第3列日1-31第4 ...

  5. 网络基础笔记——OSI七层模型

    OSI七层模型 由于整个网络连接的过程相当复杂,包含硬件.软件数据封包与应用程序的互相链接等等.假设想要写一支将联网所有功能都串连在一块的程序.那么当某个小环节出现故障时,整仅仅程序都须要改写.所以我 ...

  6. HDU1542Atlantis(扫描线)

    HDU1542Atlantis(扫描线) 题目链接 题目大意:给你n个覆盖矩形,问最后覆盖的面积. 解题思路:将每一个矩形拆成两条线段,一条是+1的,还有一条是减1的.然后扫描先从上往下扫描,碰到加1 ...

  7. Robotframework集成jenkins执行用例

    Robotframework+jenkins配置 假设我们完成了一个模块的用例设计,可是想晚上9点或凌晨运行,这时候该怎么实现呢?jenkins可以很好解决我们的疑难. Jenkins安装 这里简单说 ...

  8. Visual Studio安装空白 和 VS Code打开失败解决方案

    微软博文:https://docs.microsoft.com/zh-cn/visualstudio/install/troubleshooting-installation-issues?view= ...

  9. Selenium系列之--03【转】页面元素找不到问题的分析思路

    如果在测试过程中遇到了NoSuchElementException 这个异常, 说明元素查找失败. Caused by: org.openqa.selenium.NoSuchElementExcept ...

  10. Spring学习笔记——Spring中lazy-init与abstract具体解释

    Spring的懒载入的作用是为了避免无谓的性能开销,就是当真正须要数据的时候才去运行数据的载入操作.不只在Spring中.我们在实际的编码过程中也应该借鉴这种思想,来提高我们程序的效率. 首先我们看一 ...