题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1127

首先,把权值 > 2*k 的点作为“坏点”,然后在图中用悬线法找权值最大的子矩形;

如果权值最大的子矩形的权值 < k ,那么无解;

否则,针对这个子矩形,一列一列地删掉元素,某一时刻权值一定会变成 k~2*k 或 < k;

如果变成 k~2*k ,直接输出即可;

如果变成 < k,那么刚才删掉的那一列的权值 > k;

针对那一列,如果权值和就是 k~2*k,输出那一列;

否则,针对这一列,一个一个删除元素,因为此时元素的权值都是 < k 的,所以总会有某一时刻删成 k~2*k,即为答案;

注意输出的坐标是 列-行 !!!

还要注意一个一个删除列上的元素时,符合答案后的坐标是 i+1 !!!

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int const xn=;
int n,k,v[xn][xn],l[xn][xn],r[xn][xn],s[xn][xn];
ll sum[xn][xn];
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
return f?ret:-ret;
}
ll get(int a,int b,int c,int d){return sum[c][d]-sum[a-][d]-sum[c][b-]+sum[a-][b-];}
int main()
{
k=rd(); n=rd(); int a=,b=,c,d;
for(int i=;i<=n;i++)
{
int tmp=;
for(int j=;j<=n;j++)
{
v[i][j]=rd();
sum[i][j]=sum[i][j-]+sum[i-][j]-sum[i-][j-]+v[i][j];
if(v[i][j]>=k&&v[i][j]<=*k)a=i,b=j;
if(v[i][j]>*k){tmp=j+; continue;}
s[i][j]=s[i-][j]+;
if(v[i-][j]>*k||i==)l[i][j]=tmp;
else l[i][j]=max(tmp,l[i-][j]);
}
tmp=n;
for(int j=n;j;j--)
{
if(v[i][j]>*k){tmp=j-; continue;}
if(v[i-][j]>*k||i==)r[i][j]=tmp;
else r[i][j]=min(tmp,r[i-][j]);
}
}
if(a){printf("%d %d %d %d\n",b,a,b,a); return ;}
ll mxs=;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
if(v[i][j]>*k)continue;
int ta=i-s[i][j]+,tb=l[i][j],tc=i,td=r[i][j];
ll ts=get(ta,tb,tc,td);
if(ts<k)continue;
if(ts>mxs)mxs=ts,a=ta,b=tb,c=tc,d=td;
}
if(!mxs){printf("NIE\n"); return ;}
if(mxs>=k&&mxs<=*k){printf("%d %d %d %d\n",b,a,d,c); return ;}
for(int j=b;j<=d;j++)
{
mxs-=get(a,j,c,j);
if(mxs>=k&&mxs<=*k){printf("%d %d %d %d\n",j+,a,d,c); return ;}
else if(mxs<k)
{
ll ts=get(a,j,c,j);
if(ts>=k&&ts<=*k){printf("%d %d %d %d\n",j,a,j,c); return ;}
for(int i=a;i<=c;i++)
{
ts-=v[i][j];
if(ts>=k&&ts<=*k){printf("%d %d %d %d\n",j,i+,j,c); return ;}//i+1!!!
}
}
}
return ;
}

bzoj 1127 KUP —— 最大子矩形+答案构造的更多相关文章

  1. XJOI 3606 最大子矩形面积/LightOJ 1083 Histogram(单调栈/笛卡尔树)

    A histogram is a polygon composed of a sequence of rectangles aligned at a common base line. The rec ...

  2. Vijos1055 奶牛浴场(极大化思想求最大子矩形)

    思路详见 王知昆<浅谈用极大化思想解决最大子矩形问题> 写得很详细(感谢~....) 因为不太会用递推,所以用了第一种方法,时间复杂度是O(n^2),n为枚举的点数,对付这题绰绰有余 思路 ...

  3. POJ 2018 Best Cow Fences (二分答案构造新权值 or 斜率优化)

    $ POJ~2018~Best~Cow~ Fences $(二分答案构造新权值) $ solution: $ 题目大意: 给定正整数数列 $ A $ ,求一个平均数最大的长度不小于 $ L $ 的子段 ...

  4. 经典单调栈最大子矩形——牛客多校第二场H

    题目是求次大子矩形,那么在求最大子矩形的时候维护M1,M2即可 转移M2时比较的过程要注意一下 #include<bits/stdc++.h> using namespace std; # ...

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

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

  6. [BZOJ] 1127: [POI2008]KUP

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

  7. [BZOJ 1816] [Cqoi2010] 扑克牌 【二分答案】

    题目链接:BZOJ - 1816 题目分析 答案具有可以二分的性质,所以可以二分答案. 验证一个答案 x 是否可行,就累加一下各种牌相对于 x 还缺少的量,如果总和超过了 x 或 m ,就不可行. 因 ...

  8. BZOJ 1052 HAOI2007 覆盖问题 二分法答案+DFS

    标题效果:特定n点.涵盖所有的点与同方三面.斧头要求方垂直边界,最小平方的需求方长值 最大值至少.答案是很明显的二分法 但验证是一个问题 考虑仅仅有三个正方形,故用一个最小矩形覆盖这三个正方形时至少有 ...

  9. P1578 奶牛浴场 有障碍点的最大子矩形

    这题咕咕了很久终于写了\(QwQ\) 思路:扫? 提交:2次 错因:数据差评,第一次把矩形的长宽搞反了竟然只有一个点没有\(A\). 题解: 显然能成为答案的矩形的边界一定有障碍点或者与大矩形边界重合 ...

随机推荐

  1. poj2446 Chessboard 【最大匹配】

    题目大意:一个n*m的棋盘,某些格子不能用,问用1*2的骨牌能否完全覆盖这个棋盘,当然,骨牌不能有重叠 思路:显然黑白染色后,一个骨牌只能覆盖一个白色格子和一个黑色格子,然后我们间二染色建图,看能否有 ...

  2. hdu4352 XHXJ's LIS(数位DP + LIS + 状态压缩)

    #define xhxj (Xin Hang senior sister(学姐)) If you do not know xhxj, then carefully reading the entire ...

  3. Vim command handbook

    /* 本篇文章已经默认你通过了vimtuor训练并能熟练使用大部分命令.此篇文章主要是对于tutor命令的总结和梳理.适合边学习边记忆 tutor那个完全是在学习中记忆 符合认知规律但是练习有限.所以 ...

  4. 【HDOJ6308】Time Zone(模拟)

    题意: 以"UTC+X'', "UTC-X'', "UTC+X.Y'', or "UTC-X.Y'' 四种格式给定当地时间,要求转换为北京时间 思路:Gold_ ...

  5. jquery serializeArray() 方法通过序列化表单值来创建对象数组(名称和值)。

    serializeArray() 方法序列化表单元素(类似 .serialize() 方法),返回 JSON 数据结构数据. html代码: <form> <div><i ...

  6. poj2723 2sat判断解+二分

    典型的2-sat问题,题意:有m个门,每个门上俩把锁,开启其中一把即可,现在给n对钥匙(所有 钥匙编号0123456...2n-1),每对钥匙只能用一把,要求尽可能开门多(按顺序,前max个). 关键 ...

  7. 导师高茂源:用CODEX创新方法破解西方创新“秘密”(转)

    高茂源,“CODEX创新体系”的创立者,精一学社的创业导师.“CODEX”是Copy.Optimize.Dimension.Ecosystem.Extra五个单词的缩写,该体系精炼了现在世界上流行的创 ...

  8. 洛谷——P2865 [USACO06NOV]路障Roadblocks

    P2865 [USACO06NOV]路障Roadblocks 题目描述 Bessie has moved to a small farm and sometimes enjoys returning ...

  9. JAVA实验--统计文章中单词的个数并排序

    分析: 1)要统计单词的个数,就自己的对文章中单词出现的判断的理解来说是:当出现一个非字母的字符的时候,对前面的一部分字符串归结为单词 2)对于最后要判断字母出现的个数这个问题,我认为应该是要用到ma ...

  10. Atom安装Markdown编辑器

    1.安装插件 2.打开/关闭实时渲染: [Ctrl]+[Shift]+[M] 3.[增强]安装同步滚动插件(markdown-scroll-sync) 4.[增强]安装代码增强插件(language- ...