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的更多相关文章

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

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

  2. [BZOJ] 1127: [POI2008]KUP

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

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

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

  4. bzoj1127: [POI2008]KUP

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

  5. bzoj1127[POI2008]KUP 悬线法

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

  6. [POI2008]KUP

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

  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. bzoj 1127 KUP —— 最大子矩形+答案构造

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1127 首先,把权值 > 2*k 的点作为“坏点”,然后在图中用悬线法找权值最大的子矩形 ...

随机推荐

  1. Input and Output-The input is all the sources of action for your app

    Programs take input and produce output. The output is the result of doing something with the input. ...

  2. windows C++ new/delete内存大小

    转载自:https://blog.csdn.net/will_hsbsch/article/details/21124055 windows 上,但使用C++语言new一块内存,用指针P指向这块内存, ...

  3. codeforces472D

    Design Tutorial: Inverse the Problem CodeForces - 472D 给你了一个 n × n最短距离矩阵.(即矩阵中dis[u][v]为u点到v点的最短距离), ...

  4. CDN的作用与基本过程

     转载请注明出处: leehao.me 或 https://blog.csdn.net/lihao21/article/details/52808747 简介 CDN,Content Distribu ...

  5. PAT——1028. 人口普查

    某城镇进行人口普查,得到了全体居民的生日.现请你写个程序,找出镇上最年长和最年轻的人. 这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过200岁的老人,而今天是2014年9月 ...

  6. 处理HTML表单(11)

    PHP和Web表单 <?php if(isset($_POST["name"])){//isset()函数设置变量是否设置,并且不能为空 $name = $_POST[&qu ...

  7. Oracle分析函数巧妙使用

    在 Oracle中使用Sql必须弄懂分析函数 Oracle开发专题之:分析函数(OVER) 1 Oracle开发专题之:分析函数2(Rank, Dense_rank, row_number) 6 Or ...

  8. http协议的总结

    HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统,其主要特点概括如下: 1.支持客户/服务器模式. 2.简单快速:客户向服务器请求服务时,只需传送请求方法和 ...

  9. MySQL:如何导入导出数据表和如何清空有外建关联的数据表

    1.导入导出 导入数据库:前提:数据库和数据表要存在(已经被创建) (1)将数据表 test_user.sql 导入到test 数据库的test_user 表中 [root@test ~]# mysq ...

  10. 课时17.WebStorm安装(理解)

    开发工具(工欲善其事,必先利其器) 为了让大家更快的融入到编程的世界中去,不被繁琐的英文单词所困扰,不用每天编写很多没有意义的重复代码,提升大家的开发效率,今后的课程中我们统一采用开发工具来编写网页 ...