1127: [POI2008]KUP
1127: [POI2008]KUP
https://lydsy.com/JudgeOnline/problem.php?id=1127
分析:
如果存在一个点大于等于k,小于等于2k的话,直接输出。
否则把点分成两类,一类是<k的,另一类是大于2k的,大于2k的一定没用。
然后找一个全部由小于2k的点中组成一个的矩形(悬线法),这个矩形有三种情况:1、<k,没用;2、大于等于k,小于等于2k,输出;3、大于2k,它的子矩阵中一定存在一个合法的矩阵(因为每个元素都是<k的,所以增加一个元素不可能直接使面积从小于k变成大于等于2k)。
考虑如何对一个大于等于2k的矩形找到它的合法的子矩阵。每次删掉一行或者一列一定可以找到。
代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<cctype>
#include<set>
#include<queue>
#include<vector>
#include<map>
#include<cstdlib>
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int N = ; LL sum[N][N], k;
int a[N][N], U[N][N], L[N], R[N], n; void pd(int u,int d,int l,int r) {
if (u > d || l > r) return ;
LL now = sum[d][r] - sum[d][l - ] - sum[u - ][r] + sum[u - ][l - ];
if (now < k) return ;
if (now >= k && now <= k + k) {
printf("%d %d %d %d",l, u, r, d); exit();
}
if (d - u > r - l) {
pd(u + , d, l, r); pd(u, d - , l, r);
pd(u, d, l + , r); pd(u, d, l, r - );
}
else {
pd(u, d, l + , r); pd(u, d, l, r - );
pd(u + , d, l, r); pd(u, d - , l, r);
}
} int main() {
k = read(), n = read();
for (int i = ; i <= n; ++i)
for (int j = ; j <= n; ++j) {
a[i][j] = read();
sum[i][j] = a[i][j] + sum[i][j - ] + sum[i - ][j] - sum[i - ][j - ];
if (a[i][j] >= k && a[i][j] <= k + k) { printf("%d %d %d %d\n",j, i, j, i); return ; }
}
for (int i = ; i <= n; ++i)
for (int j = ; j <= n; ++j)
U[i][j] = a[i][j] <= k + k ? U[i - ][j] + : ;
for (int i = ; i <= n; ++i) L[i] = , R[i] = n + ;
for (int i = ; i <= n; ++i) {
int last = ;
for (int j = ; j <= n; ++j) {
if (a[i][j] <= k + k) L[j] = max(L[j], last + );
else last = j, L[j] = ;
}
last = n + ;
for (int j = n; j >= ; --j) {
if (a[i][j] <= k + k) R[j] = min(R[j], last - );
else last = j, R[j] = n + ;
}
for (int j = ; j <= n; ++j)
if (U[i][j] && L[j] >= && R[j] <= n) pd(i - U[i][j] + , i, L[j], R[j]);
}
puts("NIE");
return ;
}
1127: [POI2008]KUP的更多相关文章
- bzoj 1127 [POI2008]KUP——思路(悬线法)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1127 大于2*K的视为不能选的“坏点”.有单个格子满足的就直接输出. 剩下的都是<K的 ...
- [BZOJ] 1127: [POI2008]KUP
似曾相识的感觉 考虑另一个判断问题,给定一个k,问这个k是否可行 存在矩形和\(sum>2k\),则该矩阵不对判定做出贡献 存在矩形和\(sum\in [k,2k]\),则我们找到了一个解 于是 ...
- [BZOJ1127][POI2008] KUP子矩阵
Description 给一个n*n的地图,每个格子有一个价格,找一个矩形区域,使其价格总和位于[k,2k] Input 输入k n(n<2000)和一个n*n的地图 Output 输出矩形的左 ...
- bzoj1127: [POI2008]KUP
Description 给一个n*n的地图,每个格子有一个价格,找一个矩形区域,使其价格总和位于[k,2k] Input 输入k n(n<2000)和一个n*n的地图 Output 输出矩形的左 ...
- bzoj1127[POI2008]KUP 悬线法
Time Limit: 10 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 485 Solved: 174[Submit][Status][D ...
- [POI2008]KUP
Description 给一个\(n\times n\)的地图,每个格子有一个价格,找一个矩形区域,使其价格总和位于[k,2k] Input 输入k n(n<2000)和一个\(n\times ...
- 【BZOJ-1127】KUP 悬线法 + 贪心
1127: [POI2008]KUP Time Limit: 10 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 317 Solved: 11 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- bzoj 1127 KUP —— 最大子矩形+答案构造
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1127 首先,把权值 > 2*k 的点作为“坏点”,然后在图中用悬线法找权值最大的子矩形 ...
随机推荐
- python,dict的setdefault方法
@dict的setdefault方法 先看看文档中的解释 setdefault(...) D.setdefault(k[,d]) -> D.get(k,d), also set D[k]= ...
- [WebKit] JavaScriptCore解析--基础篇 (一)JSC与WebCore
先看一下官方的基本介绍,短短几句就塞满了关键字. SquirrelFish,正式名称是JavaScriptCore,包括register-based(基于寄存器的虚拟机), direct-thread ...
- Win2008 r2 IIS7.5出现“FastCGI进程最近常常失败。请过一会再尝试此请求”的解决方法
错误信息如图所示: 应用程序“PIAOYUN.CC”中的服务器错误Internet Information Services 7.5 错误摘要HTTP 错误 500.0 - Internal Serv ...
- apache、nginx实现反向代理
一.apache(不推荐): 代理80端口:a. 配置:b. 效果:c. 配置文件参考: ServerRoot "/etc/httpd" Listen 80 ProxyPass / ...
- CSS中背景图片的background-position中的left top到底是相对于谁的?
在学习的时候遇到了如下问题: CSS中背景图片的background-position中的left top到底是相对于谁的,content-box?padding-box?border-box? ba ...
- C#中HttpWebRequest的用法详解(转载)
1.HttpWebRequest和HttpWebResponse类是用于发送和接收HTTP数据的最好选择.2.命名空间:System.Net3.HttpWebRequest对象不是利用new关键字创建 ...
- 为何.NET Core控制台项目发布后是一个dll文件,而不是exe文件?
项目中有一个.NET Core控制台项目叫ConsoleCoreApp,写好代码后准备发布: 结果发布后生成的是一个dll文件...为不是一个exe的可执行文件: 后来了解到.NET Core的项目分 ...
- Easyui之accordion修改Title样式,字体等
.accordion{background:#fff;overflow:hidden;}.accordion .accordion-header{background:#efefef;border-t ...
- Javascript--将十进制数字转换成罗马数字显示
下午在FCC(FreeCodeCamp)中文网上做到一道练习题:将给定的数字转换成罗马数字.折磨了一个多小时,终于能把基本功能给实现了.过程如下: 关于罗马数字 罗马数字的详细介绍可见百度,或者罗马数 ...
- 【python 虚拟环境 virtualenv的配置】
该目录内生成一个虚目录: #运行activcate下的shell脚本,激活虚拟环境 #pip python包管理器