BZOJ 1127 [POI2008]KUP 最大子矩阵
题意:链接
方法:最大子矩阵
解析:
先考虑1*n的情况,如果有在目标区间内的直接输出。
否则找是否存在一个区间即可。
然后能否推广呢?
可以的。
如果元素有在目标区间的值的话,直接输出即可。
否则的话我们将大于2*k的点看作坏点。
则我们只要扫极大子矩阵再进行验证即可。
考虑如何验证总和满足目标区间的极大子矩阵。
如果是1*n的情况,因为所有的元素都小于k。
所以必定有一个前缀的和是在目标区间内的。
所以我们只需要缩y2即可。
如果是正常的矩阵的话,上下两行一定存在一行满足和小于k,干掉这一行后判断矩阵和是否满足目标区间,不满足则递归,满足则输出。
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 2010
using namespace std;
typedef long long ll;
int k,n;
ll sum[N][N];
ll a[N][N];
int le[N][N];
int ri[N][N];
int h[N][N];
ll getsum(int x1,int y1,int x2,int y2)
{return sum[x2][y2]-sum[x2][y1-1]-sum[x1-1][y2]+sum[x1-1][y1-1];
}
void print(int x1,int y1,int x2,int y2)
{while(getsum(x1,y1,x2,y2)>2*k){if(x1==x2)y2--;else if(getsum(x1+1,y1,x2,y2)>=k)x1++;else x2--;}printf("%d %d %d %d\n",y1,x1,y2,x2);exit(0);
}
int main()
{scanf("%d%d",&k,&n);for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){scanf("%lld",&a[i][j]);if(a[i][j]>=k&&a[i][j]<=2*k){printf("%d %d %d %d\n",j,i,j,i);return 0;}sum[i][j]=sum[i][j-1]+sum[i-1][j]-sum[i-1][j-1]+a[i][j];}}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(a[i][j]>2*k)le[i][j]=0;else le[i][j]=le[i][j-1]+1;}for(int j=n;j>=1;j--){if(a[i][j]>2*k)ri[i][j]=0;else ri[i][j]=ri[i][j+1]+1; }}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(a[i][j]<=2*k&&a[i-1][j]<=2*k&&i!=1){h[i][j]=h[i-1][j]+1;le[i][j]=min(le[i-1][j],le[i][j]);ri[i][j]=min(ri[i-1][j],ri[i][j]);}}}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(a[i][j]<=2*k){int tmp=getsum(i-h[i][j],j-le[i][j]+1,i,j+ri[i][j]-1);if(tmp>=k)print(i-h[i][j],j-le[i][j]+1,i,j+ri[i][j]-1);}}}puts("NIE");
}
BZOJ 1127 [POI2008]KUP 最大子矩阵相关推荐
- BZOJ 1127: [POI2008]KUP 最大子矩阵
时空隧道 对于这个矩阵如果其中某一个元素满足要求直接输出即可-否则就把大于2k的点都视为不可选择的点-找出所有的极大子矩阵-如果存在一个极大子矩阵符合要求就直接输出-否则就寻找大于2k的极大子矩阵然后 ...
- bzoj 1127 [POI2008]KUP——思路(悬线法)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1127 大于2*K的视为不能选的"坏点".有单个格子满足的就直接输出. 剩 ...
- bzoj1127: [POI2008]KUP
1127: [POI2008]KUP Time Limit: 10 Sec Memory Limit: 162 MBSec Special Judge Submit: 568 Solved: 2 ...
- BZOJ 1124: [POI2008]枪战Maf(构造 + 贪心)
题意 有 \(n\) 个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开枪. 因此,对于不同的开枪顺序,最后死的人也不同. 问最 ...
- [BZOJ 1112] [POI2008] 砖块Klo 【区间K大】
题目链接:BZOJ - 1112 题目分析 枚举每一个长度为k的连续区间,求出这个区间的最优答案,更新全局答案. 可以发现,这个区间的所有柱子最终都变成这k个数的中位数时最优,那么我们就需要查询这个区 ...
- bzoj 1124 [POI2008]枪战Maf 贪心
[POI2008]枪战Maf Time Limit: 10 Sec Memory Limit: 162 MB Submit: 741 Solved: 295 [Submit][Status][Di ...
- BZOJ 1113: [Poi2008]海报PLA
1113: [Poi2008]海报PLA Time Limit: 10 Sec Memory Limit: 162 MB Submit: 1025 Solved: 679 [Submit][Sta ...
- bzoj 1116: [POI2008]CLO(并查集)
1116: [POI2008]CLO Time Limit: 10 Sec Memory Limit: 162 MB Submit: 1180 Solved: 649 [Submit][Statu ...
- bzoj 1113: [Poi2008]海报PLA(栈)
1113: [Poi2008]海报PLA Time Limit: 10 Sec Memory Limit: 162 MB Submit: 1272 Solved: 870 [Submit][Sta ...
最新文章
- python3 导入自定义函数
- springmvc+mybatis+ajax 批量插入数据
- ComeFuture英伽学院——2020年 全国大学生英语竞赛【C类初赛真题解析】(持续更新)
- [导入]Google Earth坐标集(能更看清这个世界喽!)
- Mac上的Dock 栏如何设置更好用?
- 小程序列表倒计时使用wxs实现
- BankNext 微服务:案例研究
- 停课集训 11.27
- 达梦DM7数据库服务启动异常,管道文件已存在,DmAPService dead but pid file exists
- C语言数据类型重新认识
- 几种归一化方法(Normalization Method)python实现
- 51单片机实战教程(32 人机界面编程9)
- matlab存储excel数据,怎么把matlab表格数据写入excel-怎么把matlab中处理的数据存入到excel中...
- 高速固态存储卡学习资料第701篇:基于6U VPX XC7V690T的阵列M.2高速固态存储卡
- Edge优质插件分享
- Ptcms在php7.2.10下的调试,each等方法
- 想入坑自动化测试?先了解下必备工具---Selenium
- 股票多因子模型之截面回归
- 内蒙古2019计算机考试安排,2019年下半年内蒙古计算机软考考试报名通知
- Vue3.0 - elementUiPlus Can‘t resolve ‘./fonts/element-icons.ttf‘