题面

先把题目意思讲一下吧:

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

那么首先,可以想到,如果\(a[i][j]\)(格子的价格,下同)位于\([k,2k]\),直接输出就好.

而对于\(a[i][j]\)>\(2k\)的格子,它是不可能被选的,那么可以把它视为障碍物,

然后,剩下的格子的价格就一定小于\(k\).

那么,根据悬线法,

如果我们找到了一个极大子矩阵,且矩阵和(设为\(sum\))>=\(k\)(小于肯定是不行的),

如果\(sum\)<=\(2k\),就直接输出答案,

否则,判断第一行的和\(sum_{1}\),

若\(sum_{1}\)>=\(k\),那在第一行中肯定有解,

因为每个元素都小于\(k\)(前面说过了),

那么不存在一个格子能使矩阵和从大于\(2k\)一下变到小于\(k\),

因此只需要一个个删掉第一行的元素,直到符合要求即可.

而当\(sum_{1}\)<\(k\)时,

因为\(sum\)>\(2k\),

所以可以删掉第一行,再继续判断剩下的矩阵.

这一部分的实现方式:

  1. inline void print_t(int x1,int y1,int x2,int y2)/*以(x1,y1)为左上角,(x2,y2)为右下角*/{
  2. while(sum(x1,y1,x2,y2)/*矩阵和*/>m*2){
  3. if(x1==x2) y2--;
  4. else if(sum(x1,y1,x1,y2)>=m) x2=x1;
  5. else x1++;
  6. }
  7. printf("%d %d %d %d\n",y1,x1,y2,x2);
  8. exit(0);//终止程序
  9. }

最后注意:找到答案后直接终止程序!

上完整代码:

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4. inline int read(){
  5. int sum=0,f=1;char ch=getchar();
  6. while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
  7. while(ch>='0' && ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
  8. return f*sum;
  9. }
  10. int n,m;
  11. ll a[2001][2001];//价格
  12. ll s[2001][2001];//二维前缀和
  13. int h[2001][2001]/*悬线*/,l[2001][2001]/*向左展开的位置*/,r[2001][2001]/*向右展开的位置*/;
  14. inline ll sum(int x1,int y1,int x2,int y2)/*矩阵和*/{
  15. return s[x2][y2]+s[x1-1][y1-1]-s[x1-1][y2]-s[x2][y1-1];
  16. }
  17. inline void print_t(int x1,int y1,int x2,int y2){
  18. while(sum(x1,y1,x2,y2)>m*2){
  19. if(x1==x2) y2--;
  20. else if(sum(x1,y1,x1,y2)>=m) x2=x1;
  21. else x1++;
  22. }
  23. printf("%d %d %d %d\n",y1,x1,y2,x2);
  24. exit(0);
  25. }
  26. int main(){
  27. // freopen("kup.in","r",stdin);
  28. // freopen("kup.out","w",stdout);
  29. m=read();n=read();//m就是k,只是看上去顺眼一些而已[滑稽]
  30. for(int i=1;i<=n;i++)
  31. for(int j=1;j<=n;j++){
  32. a[i][j]=read();
  33. s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];
  34. if(a[i][j]<m||a[i][j]>2*m) continue;
  35. printf("%d %d %d %d\n",j,i,j,i);
  36. return 0;
  37. }
  38. for(int i=1;i<=n;i++) r[0][i]=n+1;
  39. for(int i=1;i<=n;i++)
  40. for(int j=1;j<=n;j++) h[i][j]= a[i][j]>2*m? 0:h[i-1][j]+1;
  41. for(int i=1;i<=n;i++){
  42. int ret=0;
  43. for(int j=1;j<=n;j++){
  44. if(h[i][j]) l[i][j]=max(l[i-1][j],ret);
  45. else ret=j,l[i][j]=0;
  46. }
  47. ret=n+1;
  48. for(int j=n;j;j--){
  49. if(h[i][j]) r[i][j]=min(r[i-1][j],ret);
  50. else ret=j,r[i][j]=n+1;
  51. }
  52. }
  53. for(int i=1;i<=n;i++){
  54. for(int j=1;j<=n;j++){
  55. if(!h[i][j]) continue;
  56. int x1=i-h[i][j]+1;
  57. int y1=l[i][j]+1,y2=r[i][j]-1;
  58. if(sum(x1,y1,i,y2)<m) continue;
  59. print_t(x1,y1,i,y2);
  60. }
  61. }
  62. puts("NIE");
  63. return 0;
  64. }

题解 【POI2008】KUP-Plot purchase的更多相关文章

  1. 1127: [POI2008]KUP

    1127: [POI2008]KUP https://lydsy.com/JudgeOnline/problem.php?id=1127 分析: 如果存在一个点大于等于k,小于等于2k的话,直接输出. ...

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

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

  3. bzoj1127: [POI2008]KUP

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

  4. bzoj1127[POI2008]KUP 悬线法

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

  5. 解题:POI 2008 Plot purchase

    题面 原来看过然后没做,结果板板把这道题改了改考掉了,血亏=.= 首先看看有没有符合条件的点.如果没有开始寻找解,先把所有的大于$2*k$的点设为坏点,然后求最大子矩形,只要一个最大子矩形的权值和超过 ...

  6. [BZOJ] 1127: [POI2008]KUP

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

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

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

  8. [POI2008]KUP

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

  9. 【BZOJ-1127】KUP 悬线法 + 贪心

    1127: [POI2008]KUP Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 317  Solved: 11 ...

随机推荐

  1. MySQL如何利用索引优化ORDER BY排序语

    MySQL索引通常是被用于提高WHERE条件的数据行匹配或者执行联结操作时匹配其它表的数据行的搜索速度. MySQL也能利用索引来快速地执行ORDER BY和GROUP BY语句的排序和分组操作. 通 ...

  2. Redis主从及哨兵

    Redis主从用法 像MySQL一样,redis是支持主从同步的,而且也支持一主多从以及多级从结构. 主从结构,一是为了纯粹的冗余备份,二是为了提升读性能,比如很消耗性能的SORT就可以由从服务器来承 ...

  3. frp基础操作

    [common]privilege_mode = true privilege_token = ****bind_port = 7000 dashboard_user = 444444dashboar ...

  4. Maven 之 profile 与Spring boot 的 profile

    一.概述 不同的环境(测试环境.开发环境)有不同的配置,目前希望在打包的时候,就直接打出针对不同环境的包(内含有某个环境的配置).Maven本身在 pom.xml 中就提供了 profile 标签进行 ...

  5. NET Core:搭建私有Nuget服务器以及打包发布Nuget包

    docker 安装 https://www.cnblogs.com/liuxiaoji/p/11014329.html 1.使用docker搭建私有Nuget服务器 docker run -d -p ...

  6. SQL基础:语句执行顺序

    SQL入门 select * from table; SQL实战题目 有下面一个表 t ,存储了每个商品类别的成交明细,我们需要通过下面这张表获取订单量大于10对应的类别,并从中取出订单量前3的商品类 ...

  7. linux递归查找目录下所有文件夹以及文件

    相对于ls或者ll,可能find在这个时候更加给力 先看我的目录结构 tree命令是查看目录的结构,而且最后会列出所有的directory的数目以及文件夹的数目...好像我们接下来要做的就没有必要了, ...

  8. python之时间日期time

    常用的时间函数如下获取当前日期:time.time()获取元组形式的时间戳:time.local(time.time())格式化日期的函数(基于元组的形式进行格式化):time.asctime(tim ...

  9. 【死磕 Java 集合】— ConcurrentSkipListMap源码分析

    转自:http://cmsblogs.com/?p=4773 [隐藏目录] 前情提要 简介 存储结构 源码分析 主要内部类 构造方法 添加元素 添加元素举例 删除元素 删除元素举例 查找元素 查找元素 ...

  10. laravel5.8 IoC 容器

    网上 对容器的解释有很多,这里只是记录,搬运! 1.简单理解: 2019-10-10 11:24:09 解析 lavarel 容器 IoC 容器 作用 就是 “解耦” .“依赖注入(DI) IoC 容 ...