bzoj 1127 KUP —— 最大子矩形+答案构造
题目: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 —— 最大子矩形+答案构造的更多相关文章
- XJOI 3606 最大子矩形面积/LightOJ 1083 Histogram(单调栈/笛卡尔树)
A histogram is a polygon composed of a sequence of rectangles aligned at a common base line. The rec ...
- Vijos1055 奶牛浴场(极大化思想求最大子矩形)
思路详见 王知昆<浅谈用极大化思想解决最大子矩形问题> 写得很详细(感谢~....) 因为不太会用递推,所以用了第一种方法,时间复杂度是O(n^2),n为枚举的点数,对付这题绰绰有余 思路 ...
- POJ 2018 Best Cow Fences (二分答案构造新权值 or 斜率优化)
$ POJ~2018~Best~Cow~ Fences $(二分答案构造新权值) $ solution: $ 题目大意: 给定正整数数列 $ A $ ,求一个平均数最大的长度不小于 $ L $ 的子段 ...
- 经典单调栈最大子矩形——牛客多校第二场H
题目是求次大子矩形,那么在求最大子矩形的时候维护M1,M2即可 转移M2时比较的过程要注意一下 #include<bits/stdc++.h> using namespace std; # ...
- 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]\),则我们找到了一个解 于是 ...
- [BZOJ 1816] [Cqoi2010] 扑克牌 【二分答案】
题目链接:BZOJ - 1816 题目分析 答案具有可以二分的性质,所以可以二分答案. 验证一个答案 x 是否可行,就累加一下各种牌相对于 x 还缺少的量,如果总和超过了 x 或 m ,就不可行. 因 ...
- BZOJ 1052 HAOI2007 覆盖问题 二分法答案+DFS
标题效果:特定n点.涵盖所有的点与同方三面.斧头要求方垂直边界,最小平方的需求方长值 最大值至少.答案是很明显的二分法 但验证是一个问题 考虑仅仅有三个正方形,故用一个最小矩形覆盖这三个正方形时至少有 ...
- P1578 奶牛浴场 有障碍点的最大子矩形
这题咕咕了很久终于写了\(QwQ\) 思路:扫? 提交:2次 错因:数据差评,第一次把矩形的长宽搞反了竟然只有一个点没有\(A\). 题解: 显然能成为答案的矩形的边界一定有障碍点或者与大矩形边界重合 ...
随机推荐
- noip 2010 数字统计
数位dp解水题 luogu1179 dp[i][j]表示 有i位,且首位是j(包括0) 的 ‘2’的个数 dp[i][j]={ Σ(dp[i-1][k]),j!=2; Σ(dp[i-1][k])+va ...
- CodeForces - 43B Letter
字符串的处理 统计已有字符的个数 和需求字符比较 #include <iostream> #include <stdio.h> #include <string.h> ...
- [NOIP2003] 提高组 洛谷P1039 侦探推理
题目描述 明明同学最近迷上了侦探漫画<柯南>并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏.游戏的内容是这样的,明明的同学们先商量好由其中的一个人充当罪犯(在明明不知情的情况下),明 ...
- Python基础教程笔记——第3章:使用字符串
字符串是不可修改的,标准序列操作(索引,分片,判断成员资格,求长度,取最大值 最小值)对字符串都是有效的. 格式化字符串,类似于C语言的输出是的感觉. >>> format=&quo ...
- PHP中的魔术方法【转载】
__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, _ ...
- 魔咒词典--hdu1880(字符串 暴力)
http://acm.hdu.edu.cn/showproblem.php?pid=1880 不要想其他的 暴力就能过 #include <iostream> #include < ...
- SHELL脚本实现分区
写一个脚本(前提:请为虚拟机新增一块硬盘,架设它为/dev/sdb),为指定的硬盘创建分区 1,列出当前系统上所有的磁盘,让用户选择,如果选择quit则退出脚本:如果用户选择错误,就让用户重新选择 2 ...
- Python中文GBK编码解决实例
http://eatsalt.blog.163.com/blog/static/879402662009420508748/ #coding:gbk l=['我'.decode('gbk'),'我'. ...
- FM算法及FFM算法
转自:http://tech.meituan.com/deep-understanding-of-ffm-principles-and-practices.html http://blog.csdn. ...
- 小心入怀Yaf
http://www.laruence.com/2015/05/14/3021.html, 鸟哥文章 看了这个文章,更加要小心的对待 Yaf Yar 框架了. 不正确 glib 有一定的了解进来就是深 ...