1.$B>0$

二分答案,然后扫描线,线段树维护某个点作为左下角时的费用的最小值,支持区间加。

时间复杂度$O(n\log^2n)$。

2.$B=0$

枚举左边界,则最优右边界可以通过双指针求出。

用线段树维护左右边界之间最长的竖着的空的连续段的长度。

找到最大的连续段长度$\geq$左右边界距离的位置,此时的距离就是答案。

时间复杂度$O(n\log n)$。

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. int n,m,B,P;
  5. inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
  6. namespace BinarySearch{
  7. const int N=30010,M=2100000;
  8. int i,j,l,r,mid,ans,ce,v[M],tag[M];
  9. struct O{int a,b,c,d,p;}a[N];
  10. struct E{int x,l,r,p;E(){}E(int _x,int _l,int _r,int _p){x=_x,l=_l,r=_r,p=_p;}}e[N*2];
  11. inline bool cmp(const E&a,const E&b){return a.x<b.x;}
  12. void build(int x,int a,int b){
  13. v[x]=tag[x]=0;
  14. if(a==b)return;
  15. int mid=(a+b)>>1;
  16. build(x<<1,a,mid),build(x<<1|1,mid+1,b);
  17. }
  18. inline void add1(int x,int p){v[x]+=p;tag[x]+=p;}
  19. void add(int x,int a,int b,int c,int d,int p){
  20. if(c<=a&&b<=d){add1(x,p);return;}
  21. if(tag[x])add1(x<<1,tag[x]),add1(x<<1|1,tag[x]),tag[x]=0;
  22. int mid=(a+b)>>1;
  23. if(c<=mid)add(x<<1,a,mid,c,d,p);
  24. if(d>mid)add(x<<1|1,mid+1,b,c,d,p);
  25. v[x]=min(v[x<<1],v[x<<1|1]);
  26. }
  27. inline bool check(int mid){
  28. for(ce=0,i=1;i<=P;i++){
  29. int A=a[i].a-mid+1,B=a[i].b-mid+1,C=a[i].c,D=a[i].d;
  30. A=max(A,1),B=max(B,1),C=min(C,n-mid+1),D=min(D,m-mid+1);
  31. if(A<=C&&B<=D)e[++ce]=E(A,B,D,a[i].p),e[++ce]=E(C+1,B,D,-a[i].p);
  32. }
  33. sort(e+1,e+ce+1,cmp);
  34. build(1,1,m-mid+1);
  35. for(i=j=1;i<=n-mid+1;i++){
  36. while(j<=ce&&e[j].x<=i)add(1,1,m-mid+1,e[j].l,e[j].r,e[j].p),j++;
  37. if(v[1]<=B)return 1;
  38. }
  39. return 0;
  40. }
  41. void solve(){
  42. for(i=1;i<=P;i++)read(a[i].a),read(a[i].b),read(a[i].c),read(a[i].d),read(a[i].p);
  43. l=1,r=min(n,m);
  44. while(l<=r)if(check(mid=(l+r)>>1))l=(ans=mid)+1;else r=mid-1;
  45. printf("%d",ans);
  46. }
  47. }
  48. namespace Sweep{
  49. const int N=1000010,M=2100000;
  50. int A,B,C,D,i,j,k,ans,gi[N],gd[N],v[N],w[N],nxt[N],ed;
  51. int tag[M],len[M],vl[M],vr[M],vm[M];
  52. inline void add(int&x,int y,int z){v[++ed]=y;w[ed]=z;nxt[ed]=x;x=ed;}
  53. void build(int x,int a,int b){
  54. len[x]=vl[x]=vr[x]=vm[x]=b-a+1;
  55. if(a==b)return;
  56. int mid=(a+b)>>1;
  57. build(x<<1,a,mid),build(x<<1|1,mid+1,b);
  58. }
  59. inline void up(int x){
  60. if(tag[x]){vl[x]=vr[x]=vm[x]=0;return;}
  61. if(len[x]==1){vl[x]=vr[x]=vm[x]=1;return;}
  62. vl[x]=vl[x<<1];
  63. if(vl[x<<1]==len[x<<1])vl[x]+=vl[x<<1|1];
  64. vr[x]=vr[x<<1|1];
  65. if(vr[x<<1|1]==len[x<<1|1])vr[x]+=vr[x<<1];
  66. vm[x]=max(max(vm[x<<1],vm[x<<1|1]),vr[x<<1]+vl[x<<1|1]);
  67. }
  68. void add(int x,int a,int b,int c,int d,int p){
  69. if(c<=a&&b<=d){tag[x]+=p;up(x);return;}
  70. int mid=(a+b)>>1;
  71. if(c<=mid)add(x<<1,a,mid,c,d,p);
  72. if(d>mid)add(x<<1|1,mid+1,b,c,d,p);
  73. up(x);
  74. }
  75. void solve(){
  76. while(P--)read(A),read(B),read(C),read(D),read(k),add(gi[A],B,D),add(gd[C],B,D);
  77. build(1,1,m);
  78. for(i=1;i<=n;i++){
  79. for(k=gd[i-1];k;k=nxt[k])add(1,1,m,v[k],w[k],-1);
  80. while(vm[1]>=j-i+1&&j<=n)for(k=gi[++j];k;k=nxt[k])add(1,1,m,v[k],w[k],1);
  81. ans=max(ans,j-i);
  82. }
  83. printf("%d",ans);
  84. }
  85. }
  86. int main(){
  87. read(n),read(m),read(B),read(P);
  88. if(B)BinarySearch::solve();else Sweep::solve();
  89. return 0;
  90. }

  

BZOJ1795 : [Ioi2008]Pyramid Base 金字塔地基的更多相关文章

  1. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  2. WC2021 题目清单

    Day2 上午 <IOI题型与趣题分析> 来源 题目 完成情况 备注 IOI2002 Day1T1 Frog 已完成 IOI2002 Day1T2 Utopia IOI2002 Day1T ...

  3. 『计算机视觉』FPN:feature pyramid networks for object detection

    对用卷积神经网络进行目标检测方法的一种改进,通过提取多尺度的特征信息进行融合,进而提高目标检测的精度,特别是在小物体检测上的精度.FPN是ResNet或DenseNet等通用特征提取网络的附加组件,可 ...

  4. Python 图像处理 OpenCV (14):图像金字塔

    前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...

  5. 剖析虚幻渲染体系(06)- UE5特辑Part 1(特性和Nanite)

    目录 6.1 本篇概述 6.1.1 本篇内容 6.1.2 基础概念 6.2 UE5新特性 6.2.1 UE5编辑器 6.2.1.1 下载编辑器及资源 6.2.1.2 启动示例工程 6.2.1.3 编辑 ...

  6. highcharts的表名

    line:直线图 spline:曲线图 area:面积图 areaspline:曲线面积图 arearange:面积范围图 areasplinerange:曲线面积范围图 column:柱状图 col ...

  7. Histogram of Oriented Gridients(HOG) 方向梯度直方图

    Histogram of Oriented Gridients,缩写为HOG,是目前计算机视觉.模式识别领域很常用的一种描述图像局部纹理的特征.这个特征名字起的也很直白,就是说先计算图片某一区域中不同 ...

  8. SVO+PL-SVO+PL-StVO

    PL-SVO是基于点.线特征的半直接法单目视觉里程计,我们先来介绍一下基于点特征的SVO,因为是在这个基础上提出的. [1]References:      SVO: Fast Semi-Direct ...

  9. 整个trick

    数据输入方面:1.image pyramid 图像金字塔.目前代码里是先选取一个scale,然后在每个GPU上按照scale读图片,相应的gt也更改."scales":[440, ...

随机推荐

  1. c_test

    1.int a[][4]={0,0};与int a[3][4] = {0}; 元素不够的就以位模式初始化为0 a[第一维][第二维] 的大小,也就是最多存几个 int a[][3]={1,2,3,4, ...

  2. 51nod1069(nim博弈)

    题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1069 题意: 中文题诶~ 思路: 一开始我以为需要把上一堆到 ...

  3. NYOJ之括号配对问题

    括号配对问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述     现在,有一行括号序列,请你检查这行括号是否配对. 输入     第一行输入一个数N(0<N&l ...

  4. Redis笔记(六)Redis的消息通知

    Redis的消息通知可以使用List类型的LPUSH和RPOP(左进右出),当然更方便的是直接使用Redis的Pub/Sub(发布/订阅)模式. >>使用List实现队列 使用列表类型的L ...

  5. 使用Delphi对象(声明、实例化、构造、释放)

    一.声明和实例化 在使用一个对象之前,用class关键字声明一个对象.可以在一个程序或单元的type部分声明一个对象类型: type TFooObject = class; 除了声明一个对象类型,通常 ...

  6. <转>ORA-12154: TNS: 无法解析指定的连接标识符

    相信作为ORACLE数据库的开发人员没有少碰到“ORA-12154: TNS: 无法解析指定的连接标识符”,今天我也又碰到了类似的情况,将我的解决方法进行小结,希望能对碰到同样问题的友人们提供帮助. ...

  7. B树算法与实现 (C语言实现)

    B树的定义 假设B树的度为t(t>=2),则B树满足如下要求:(参考算法导论) (1)  每个非根节点至少包含t-1个关键字,t个指向子节点的指针:至多包含2t-1个关键字,2t个指向子女的指针 ...

  8. PHPCMS V9 栏目列表调用文章点击量及评论数量方法

    很多朋友在用Phpcms做站时,具体需要在列表页.首页调用文章列表调用文章的点击量和评论排行,那么怎么才能做到在Phpcms v9首页.频道页.列表页.推荐位等页面获取文章浏览量和评论统计呢? 原因起 ...

  9. 跟着鸟哥学Linux系列笔记1

    跟着鸟哥学Linux系列笔记0-扫盲之概念 跟着鸟哥学Linux系列笔记0-如何解决问题 装完linux之后,接下来一步就是进行相关命令的学习了 第五章:首次登录与在线求助man page 1. X ...

  10. HDU 5807 Keep In Touch DP

    Keep In Touch Problem Description   There are n cities numbered with successive integers from 1 to n ...