bzoj 1127 [POI2008]KUP——思路(悬线法)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1127
大于2*K的视为不能选的“坏点”。有单个格子满足的就直接输出。
剩下的都是<K的格子,求面积大于等于K的一个矩形;若还<=2*K就直接输出,否则一列一列删;
删去一列后若仍>=2*K,继续;若>=K&&<=2*K,就输出;若<K,则删去的那一列满足>=K,在那列上一格一格删,因为格子<K,所以不能从>2*K跳到<K,一定有解了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=;
int n,K,D,a[N][N],l[N][N],r[N][N],u[N][N],p0,p1;
ll s[N][N];
bool b[N][N],flag;
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='') ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
return fx?ret:-ret;
}
ll calc(int h1,int l1,int h2,int l2)
{
return s[h2][l2]-s[h2][l1-]-s[h1-][l2]+s[h1-][l1-];
}
void solve2(int h1,int h2,int j)
{
int sm=calc(h1,j,h2,j);
if(sm>=K&&sm<=D){printf("%d %d %d %d\n",j,h1,j,h2);return;}
for(int i=h2;i>=h1;i--)
{
sm-=a[i][j];
if(sm>=K&&sm<=D){printf("%d %d %d %d\n",j,h1,j,i-);return;}
}
}
void solve(int h1,int l1,int h2,int l2)
{
ll sm=calc(h1,l1,h2,l2);
if(sm<K)return;
if(sm>=K&&sm<=D){printf("%d %d %d %d\n",l1,h1,l2,h2);flag=;return;}
for(int i=l2;i>=l1;i--)
{
sm=calc(h1,l1,h2,i-);
if(sm>=K&&sm<=D)
{
printf("%d %d %d %d\n",l1,h1,i-,h2);
flag=;return;
}
if(sm<K)
{
solve2(h1,h2,i);flag=;return;
}
}
}
int main()
{
K=rdn(); n=rdn(); D=(K<<);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
a[i][j]=rdn(); if(a[i][j]>D)b[i][j]=;
if(a[i][j]>=K&&a[i][j]<=D)p0=j,p1=i;
s[i][j]=s[i][j-]+a[i][j];
}
if(p0){printf("%d %d %d %d\n",p0,p1,p0,p1);return ;}
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)s[i][j]+=s[i-][j]; for(int i=,k;i<=n;i++)
for(int j=,k=;j<=n;j++)
{
if(!b[i-][j]) u[i][j]=u[i-][j]+;
else u[i][j]=;
if(!b[i][j])l[i][j]=max(k,l[i-][j]);
else k=j+;
}
for(int j=;j<=n;j++)r[][j]=n;//!
for(int i=,k;i<=n;i++)
for(int j=n,k=n;j>=;j--)
{
if(!b[i][j])r[i][j]=min(k,r[i-][j]);
else k=j-,r[i][j]=n;//for don't influence i+1,j
if(!b[i][j])solve(i-u[i][j]+,l[i][j],i,r[i][j]);
if(flag)return ;
}
puts("NIE");
return ;
}
bzoj 1127 [POI2008]KUP——思路(悬线法)的更多相关文章
- 【BZOJ】3039: 玉蟾宫 悬线法
[题意]给定01矩阵,求最大全1子矩阵.n,m<=1000. [算法]动态规划(悬线法) [题解]★对于01矩阵中的任意一个全1极大子矩阵,都可以在其上边界遇到的障碍点处悬线到下边界的点x,则点 ...
- BZOJ 1057: [ZJOI2007]棋盘制作 悬线法求最大子矩阵+dp
1057: [ZJOI2007]棋盘制作 Description 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑 ...
- [BZOJ] 1127: [POI2008]KUP
似曾相识的感觉 考虑另一个判断问题,给定一个k,问这个k是否可行 存在矩形和\(sum>2k\),则该矩阵不对判定做出贡献 存在矩形和\(sum\in [k,2k]\),则我们找到了一个解 于是 ...
- [POJ1964]City Game (悬线法)
题意 其实就是BZOJ3039 不过没权限号(粗鄙之语) 同时也是洛谷4147 就是求最大子矩阵然后*3 思路 悬线法 有个博客讲的不错https://blog.csdn.net/u012288458 ...
- P1169 [ZJOI2007]棋盘制作 悬线法or单调栈
思路:悬线法\(or\)单调栈 提交:2次 错因:正方形面积取错了\(QwQ\) 题解: 悬线法 讲解:王知昆\(dalao\)的\(PPT\) 详见代码: #include<cstdio> ...
- 【BZOJ-1127】KUP 悬线法 + 贪心
1127: [POI2008]KUP Time Limit: 10 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 317 Solved: 11 ...
- BZOJ 1057: [ZJOI2007]棋盘制作( dp + 悬线法 )
对于第一问, 简单的dp. f(i, j)表示以(i, j)为左上角的最大正方形, f(i, j) = min( f(i + 1, j), f(i, j + 1), f(i + 1, j + 1)) ...
- BZOJ 3039: 玉蟾宫( 悬线法 )
最大子矩阵...悬线法..时间复杂度O(nm) 悬线法就是记录一个H向上延伸的最大长度(悬线), L, R向左向右延伸的最大长度, 然后通过递推来得到. ----------------------- ...
- 悬线法 || BZOJ 1057: [ZJOI2007]棋盘制作 || Luogu P1169 [ZJOI2007]棋盘制作
题面:P1169 [ZJOI2007]棋盘制作 题解: 基本是悬线法板子,只是建图判断时有一点点不同. 代码: #include<cstdio> #include<cstring&g ...
随机推荐
- 免费DNSserver有哪些?
DNS 是上网中极其重要的一环,因为电脑仅仅认识数字组成的 IP 地址,人们发明了域名来帮助记忆 (如 iPlaySoft.com),因此,在訪问不论什么域名时.背后都须要一台 DNS server来 ...
- Lightoj 1088 - Points in Segments 【二分】
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1088 题意: 有一维的n个点和q条线段.询问每条线段上的点有多少个. 思路:寻 ...
- web微信开发
群里接收消息时,使用广播,但需要刷新页面才能接收到广播内容. - 轮询: 定时每秒刷新一次,当群不活跃时,群里的每个客户端都在刷新,对服务端压力太大. - 长轮询:客户端连服务端,服务端一直不断开,也 ...
- fedora delete openJDK
博客分类: linux 由于Fedora系统安装的时候会自带OpenJDK,安装完系统后 java -version 会显示 [root@localhost bin]# java -versio ...
- 新一代AJAX API:FETCH
AJAX半遮半掩的底层API是饱受诟病的一件事情. XMLHttpRequest 并不是专为Ajax而设计的. 虽然各种框架对 XHR 的封装已经足够好用, 但我们可以做得更好.更好用的API是 fe ...
- php中屏蔽date的错误
php中添加 date_default_timezone_set('asia/shanghai'); 可以屏蔽 <?php echo date('Y-m-d',$row3['time']); ...
- Python标准库:内置函数set([iterable])
本函数是从迭代对象生成集合.集合能够添加或删除元素. 样例: #set() tset = set([1, 2, 3, 3, 4, 5, 6, 6]) print(tset) tset.add(20) ...
- #include <sys/socket.h>找不到头文件
ubuntu下socket编程涉及到头文件sys/socket.h 和sys/types.h.我是用的codeblocks编辑器,当我想查看socket,h头文件时编辑器提示找不到头文件. 我就想可能 ...
- Vue入门(一) 环境配置
Node.js 安装,https://nodejs.org/en/ 默认安装就可以 安装好后测试版本,cmd 键入命令 1.node -v 2.npm -v 安装,淘宝 NPM n ...
- 页面滚动tab监听
页面 需求,顶部固定,左侧固定,右侧内容滚动 所以给右侧内容高度,内容里面滚动(使用固定定位的话,右侧内容总会给head部分遮挡,比较坑) 1.左侧是侧边栏,点击li,右侧内容显示当前 右侧内容滚动, ...