思路:单调栈

提交:>5次

错因:单调栈写法有问题+前缀和写错

题解:

若有\(>=k\ \&\&\ <=2\times k\)的点,显然直接选他就行了。

否则,我们需要找到一个矩形(不一定只有一个),并且这个矩形只包含\(<k\)的点且总权值和\(>=2k\)。

这样,我们可以尝试去切掉他的行来不断减少他的权值和。

如果发现某一行 \(>=2k\) ,我们应该去且他而不是切剩下的矩形(剩下的可能过小)。

当然如果你切着切着发现出现了一个矩形他的权值和\(>=k\ \&\&\ <=2\times k\) ,直接输出就好。

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. #define R register int
  4. using namespace std;
  5. namespace Luitaryi {
  6. template<class I> inline I g(I& x) { x=0; register I f=1;
  7. register char ch; while(!isdigit(ch=getchar())) f=ch=='-'?-1:f;
  8. do x=x*10+(ch^48); while(isdigit(ch=getchar())); return x*=f;
  9. } const int N=2010;
  10. int n,k,k2,x1,x2,y1,y2;
  11. int up[N][N],l[N],r[N],stk[N],top;
  12. ll a[N][N],s[N][N],mx;
  13. inline void change(int up,int dn,int l,int r) {
  14. R sum=s[dn][r]-s[up-1][r]-s[dn][l-1]+s[up-1][l-1];
  15. if(sum>=k&&sum<=k2) {
  16. printf("%d %d %d %d\n",l,up,r,dn); exit(0);
  17. }
  18. if(sum>mx) mx=sum,x1=up,x2=dn,y1=l,y2=r;
  19. }
  20. inline void solve() {
  21. for(R i=x2;i>=x1;--i) {
  22. register ll sum=s[i][y2]-s[i-1][y2]-s[i][y1-1]+s[i-1][y1-1];
  23. if(sum>=k&&sum<=k2) return (void) printf("%d %d %d %d\n",y1,i,y2,i);
  24. if(sum>k2) {
  25. for(R p=y2;p>=y1;--p) {
  26. sum-=a[i][p];
  27. if(sum>=k&&sum<=k2) return (void) printf("%d %d %d %d\n",y1,i,p-1,i);
  28. }
  29. } mx-=sum;
  30. if(mx>=k&&mx<=k2) return (void) printf("%d %d %d %d\n",y1,i+1,y2,x2);
  31. }
  32. }
  33. inline void main() { freopen("in.in","r",stdin);
  34. g(k),k2=k<<1,g(n); for(R i=1;i<=n;++i) for(R j=1;j<=n;++j) {
  35. s[i][j]=g(a[i][j])+s[i][j-1]; if(a[i][j]>=k&&a[i][j]<=k2)
  36. return (void)printf("%d %d %d %d\n",i,j,i,j);
  37. } for(R i=1;i<=n;++i) for(R j=1;j<=n;++j) s[i][j]+=s[i-1][j];
  38. for(R i=1;i<=n;++i) {
  39. for(R j=1;j<=n;++j) if(a[i][j]<k) up[i][j]=up[i-1][j]+1;
  40. stk[top=1]=0,up[i][0]=-1; for(R j=1;j<=n;++j) {
  41. while(top&&up[i][stk[top]]>=up[i][j]) --top;
  42. l[j]=stk[top]+1,stk[++top]=j;
  43. } stk[top=1]=n+1,up[i][n+1]=-1;
  44. for(R j=n;j;--j) {
  45. while(top&&up[i][stk[top]]>=up[i][j]) --top;
  46. r[j]=stk[top]-1,stk[++top]=j;
  47. if(up[i][j]) change(i-up[i][j]+1,i,l[j],r[j]);
  48. }
  49. }
  50. if(mx<k) return (void) puts("NIE"); solve();
  51. }
  52. } signed main() {Luitaryi::main(); return 0;}

2019.09.03

66

P3474 [POI2008]KUP-Plot purchase的更多相关文章

  1. 1127: [POI2008]KUP

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

  2. 题解 【POI2008】KUP-Plot purchase

    题面 先把题目意思讲一下吧: 给一个 \(n*n\) 的地图,每个格子有一个价格,找一个矩形区域,使其价格总和位于\([k,2k]\). 那么首先,可以想到,如果\(a[i][j]\)(格子的价格,下 ...

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

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

  4. bzoj1127: [POI2008]KUP

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

  5. bzoj1127[POI2008]KUP 悬线法

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

  6. 解题:POI 2008 Plot purchase

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

  7. [BZOJ] 1127: [POI2008]KUP

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

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

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

  9. [POI2008]KUP

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

随机推荐

  1. python学习-17 列表list 2

    # 1. 选择嵌套列表里的元素(内部进行了for循环) li = [1,2,",45]],"abc",True] a = li[3][2][1] print(a) 运行结 ...

  2. ActiveMQ 简单应用

    ActiveMQ简单应用到复杂的订单模块,提高前台的访问速度. 一.当提交订单后,发送消息给ActiveMQ. @Service public class JmsSend { private stat ...

  3. 怎样理解prototype对象的constructor属性

    function Person(name){ this.name = name; } var lilei = new Person("Lilei"); lilei.construc ...

  4. arcgis for android100.x 禁止地图旋转

    by 蔡建良2019-5-16 关键类: com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener DefaultMapVie ...

  5. (十四)Hibernate中的多表操作(4):单向一对一

    案例一: 注解方式实现一对一 UserBean.java package bean; import java.io.Serializable; import javax.persistence.Col ...

  6. Uwl.Admin开源框架(一)

    1.前言 作为一个忠实的软粉,一直期待微软出跨平台,一直在等待.Net Core,因为刚毕业对于.Net的很多东西不是很熟知,就开始了.Net Core的摸索,一路上坎坎坷坷,对于新技术一直很期待,就 ...

  7. Docker启动Elasticsearch报错java.nio.file.AccessDeniedException

    报错信息 Caused by: java.nio.file.AccessDeniedException: /usr/share/elasticsearch/data/nodes 问题分析 表面上是说容 ...

  8. Vue子父组件方法互调

    讲干货,不啰嗦,大家在做vue开发过程中经常遇到父组件需要调用子组件方法或者子组件需要调用父组件的方法的情况,现做一下总结,希望对大家有所帮助. 父组件调用子组件方法: 1.设置子组件的ref,父组件 ...

  9. 【转载】salesforce 零基础开发入门学习(六)简单的数据增删改查页面的构建

    salesforce 零基础开发入门学习(六)简单的数据增删改查页面的构建   VisualForce封装了很多的标签用来进行页面设计,本篇主要讲述简单的页面增删改查.使用的内容和设计到前台页面使用的 ...

  10. 实现Vue的双向绑定

    一.概述 之前有讲到过vue实现整体的整体流程,讲到过数据的响应式,是通过Object.defineProperity来实现的,当时只是举了一个小小的例子,那么再真正的vue框架里是如何实现数据的双向 ...