1127: [POI2008]KUP

Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special Judge
Submit: 317  Solved: 111
[Submit][Status][Discuss]

Description

给一个n*n的地图,每个格子有一个价格,找一个矩形区域,使其价格总和位于[k,2k]

Input

输入k n(n<2000)和一个n*n的地图

Output

输出矩形的左上和右下的列-行坐标或NIE

Sample Input

inputdata1
4 3
1 1 1
1 9 1
1 1 1
inputdata2
8 4
1 2 1 3
25 1 2 1
4 20 3 3
3 30 12 2

Sample Output

outputdata1
NIE
outputdata2
2 1 4 2

HINT

1<=k<=10^9 每个价格都是不大于2*10^9的非负整数

Source

感谢vfleaking提供SPJ

Solution

这个题需要思路....

首先假设有一个一维的区间$[l,r]$,那么假设这个区间中满足$\forall x,x<K$,那么且这个区间的和$>=K$,那么答案肯定存在在这个区间中。

证明:

因为这个区间中满足$\forall x,x<K$,所以区间和每加上一个数,区间和的变化量一定是$<K$的;

所以,并不会存在一个数使得一个子区间(连续的)和加上他得到的新区间和直接从$(-\infty,K]$跳过$[K,2*K]$变成$[2*K,+\infty)$.

所以,只要从这个一维的区间的左/右端开始一一删除,就可以得到满足条件的区间。

但是这里的$N*N$的矩阵,所以要利用这个结论就必须扩展到多维区间块上面,但是这个结论是可以拓展的。

这样就是一个子矩阵满足$\forall x,x<K$,且子矩阵和$>=K$,那么这个子矩阵中存在答案。

证明类比上面的证明,这里分类讨论一下,可以利用上面的方法,先一行一行的删除,删成满足条件的,或者只剩一行,转成上述,再一个一个删.

然后就是找出这些需要搞得子矩形的方法了,把$x>2*K$的点认为是障碍,做一遍悬线法,就可以得到所有的极大子矩形,然后一一判断。

当然一开始读入的时候,如果存在一个$1*1$的位置$x$直接满足$x \in [K,2*K]$那么可以直接输出。

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define LL long long
inline int read()
{int x=0,f=1; char ch=getchar();while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}return x*f;
}
int K,N,l[2010][2010],r[2010][2010],h[2010][2010];
LL sum[2010][2010],a[2010][2010];
inline LL Sum(int x1,int y1,int x2,int y2) {return sum[x2][y2]+sum[x1-1][y1-1]-sum[x2][y1-1]-sum[x1-1][y2];}
inline void Cut(int x1,int y1,int x2,int y2)
{while (Sum(x1,y1,x2,y2)>2*K){if (x1==x2) {y2--; continue;}if (Sum(x1,y1,x2-1,y2)>=K) {x2--; continue;}if (Sum(x1+1,y1,x2,y2)>=K) {x1++; continue;}}printf("%d %d %d %d\n",y1,x1,y2,x2);exit(0);
}
int main()
{K=read(),N=read();for (int i=1; i<=N; i++)for (int j=1; j<=N; j++)a[i][j]=read(),sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j];for (int i=1; i<=N; i++)for (int j=1; j<=N; j++)if (a[i][j]>=K && a[i][j]<=2*K) {printf("%d %d %d %d\n",j,i,j,i); return 0;}for (int i=1; i<=N; i++){for (int j=1,x=0; j<=N; j++)if (a[i][j]<=2*K) l[i][j]=x; else l[i][j]=0,x=j;for (int j=N,x=N+1; j>=1; j--)if (a[i][j]<=2*K) r[i][j]=x; else r[i][j]=N+1,x=j;}for (int i=1; i<=N+1; i++) r[0][i]=N+1;for (int i=1; i<=N; i++)for (int j=1; j<=N; j++)if (a[i][j]<=2*K)h[i][j]=h[i-1][j]+1,l[i][j]=max(l[i][j]+1,l[i-1][j]),r[i][j]=min(r[i][j]-1,r[i-1][j]);//    puts("==========================");
//    for (int i=1; i<=N; i++,puts(""))
//        for (int j=1; j<=N; j++)
//            printf("%d  ",h[i][j]);
//    puts("==========================");
//    for (int i=1; i<=N; i++,puts(""))
//        for (int j=1; j<=N; j++)
//            printf("%d  ",l[i][j]);
//    puts("==========================");
//    for (int i=1; i<=N; i++,puts(""))
//        for (int j=1; j<=N; j++)
//            printf("%d  ",r[i][j]);
//    puts("==========================");for (int i=1; i<=N; i++)for (int j=1; j<=N; j++)if (a[i][j]<=2*K){
//                printf("%d    %d    %d    %d\n",i-h[i][j]+1,l[i][j],i,r[i][j]);if (Sum(i-h[i][j]+1,l[i][j],i,r[i][j])>=K) Cut(i-h[i][j]+1,l[i][j],i,r[i][j]);}puts("NIE");return 0;
}
/*
2 3
3  25 7
6  1  2
16 11 20
*/

转载于:https://www.cnblogs.com/DaD3zZ-Beyonder/p/5997325.html

【BZOJ-1127】KUP 悬线法 + 贪心相关推荐

  1. BZOJ 3039: 玉蟾宫( 悬线法 )

    最大子矩阵...悬线法..时间复杂度O(nm) 悬线法就是记录一个H向上延伸的最大长度(悬线), L, R向左向右延伸的最大长度, 然后通过递推来得到. ----------------------- ...

  2. bzoj 1057: 棋盘制作(悬线法)

    1057: [ZJOI2007]棋盘制作 Time Limit: 20 Sec  Memory Limit: 162 MB Submit: 2311  Solved: 1146 [Submit][St ...

  3. BZOJ[3039]玉蟾宫 悬线法

    题目链接http://www.lydsy.com/JudgeOnline/problem.php?id=3039 Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山 ...

  4. [bzoj1127][悬线法]KUP

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

  5. 【BZOJ-30391057】玉蟾宫棋盘制作 悬线法

    3039: 玉蟾宫 Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 753  Solved: 444 [Submit][Status][Discuss] ...

  6. [ZJOI2007]棋盘制作 悬线法dp 求限制下的最大子矩阵

    https://www.luogu.org/problemnew/show/P1169 第一次听说到这种dp的名称叫做悬线法,听起来好厉害 题意是求一个矩阵内的最大01交错子矩阵,开始想的是dp[20 ...

  7. [ZJOI2007] 棋盘制作(单调栈 / DP悬线法)

    problem 洛谷链接 solution1-单调栈 很容易想到,预处理出每个点向上最大能延伸的长度,然后对每个点求一个矩阵面积. 然后思考优化,不难想到每次对一行进行求解. 每一行的所有列一起构成了 ...

  8. 【UVALive】3029 City Game(悬线法)

    题目 传送门:QWQ 分析 以前见到过差不多的这题. xhk说是单调栈水题,但我又不会单调栈,于是当时就放下了. 这么久过去了我还是不会用单调栈做这题,用的是悬线法. 非常好写 代码 #include ...

  9. 【BZOJ1057】【codevs1428】棋盘制作,悬线法

    传送门1 传送门2 思路: 比较简单的悬线法 相关资料自行百度 看一会就能明白的 反正这个就是模板题啦(敲桌) 虽然说好不发水题了,但这次发上来也就是给大家也给自己当个板子使-- 代码: #inclu ...

最新文章

  1. ThreadGroup
  2. [Java] 初始化与清理
  3. 剑指offer(19)顺时针打印矩阵
  4. java简单课程设计_!高分跪求帮忙写一个简单小程序的JAVA课程设计报告(内详!!)...
  5. php基础教程 第四步 学习运算符
  6. 【LeetCode - 33】搜索旋转排序数组(二分)
  7. cmd命令 - vue项目:单独安装vue-router
  8. (102)FPGA面试题-如何选择FPGA型号?
  9. 求求你给你的微信头像戴个圣诞帽吧!
  10. ttk.treeview鼠标悬浮文字_电竞新选择,罗技G键盘、鼠标、耳机三件套给力体验...
  11. 如何下载乌龟svn中文版
  12. 测评盘点2021十大淘宝购物优惠券app,高省是一个怎样的角色?
  13. IE浏览器弹框提示脚本发生错误
  14. 在线招聘风起,周伯通怎么玩社区招聘?
  15. Mode首席执行官Paul Dawes:从销售工程师到科技领导者
  16. Excel如何隔行插入图片?
  17. 大数据竞赛-----DC竞赛ANC
  18. Java Web之Ajax
  19. 线性稳压器和开关稳压器比较
  20. php5漏洞汇总,ThinkPHP 5.x RCE 漏洞分析与利用总结

热门文章

  1. Python 编码风格参考
  2. Oracle数据库之SQL基础(一)
  3. 也谈大公司病1——正确是最大的错误
  4. Dynamics AX 2009 启动时提示“…the application files in exclusive mode”的解决
  5. mongodb 分片群集配置 及数据迁移
  6. 抗震求灾捐款,我们公司总额为:14222
  7. Could not create JarEntryRevision
  8. android requestFocus的使用
  9. java动态添加view
  10. Java PECS