BZOJ1795 : [Ioi2008]Pyramid Base 金字塔地基
1.$B>0$
二分答案,然后扫描线,线段树维护某个点作为左下角时的费用的最小值,支持区间加。
时间复杂度$O(n\log^2n)$。
2.$B=0$
枚举左边界,则最优右边界可以通过双指针求出。
用线段树维护左右边界之间最长的竖着的空的连续段的长度。
找到最大的连续段长度$\geq$左右边界距离的位置,此时的距离就是答案。
时间复杂度$O(n\log n)$。
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,B,P;
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';}
namespace BinarySearch{
const int N=30010,M=2100000;
int i,j,l,r,mid,ans,ce,v[M],tag[M];
struct O{int a,b,c,d,p;}a[N];
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];
inline bool cmp(const E&a,const E&b){return a.x<b.x;}
void build(int x,int a,int b){
v[x]=tag[x]=0;
if(a==b)return;
int mid=(a+b)>>1;
build(x<<1,a,mid),build(x<<1|1,mid+1,b);
}
inline void add1(int x,int p){v[x]+=p;tag[x]+=p;}
void add(int x,int a,int b,int c,int d,int p){
if(c<=a&&b<=d){add1(x,p);return;}
if(tag[x])add1(x<<1,tag[x]),add1(x<<1|1,tag[x]),tag[x]=0;
int mid=(a+b)>>1;
if(c<=mid)add(x<<1,a,mid,c,d,p);
if(d>mid)add(x<<1|1,mid+1,b,c,d,p);
v[x]=min(v[x<<1],v[x<<1|1]);
}
inline bool check(int mid){
for(ce=0,i=1;i<=P;i++){
int A=a[i].a-mid+1,B=a[i].b-mid+1,C=a[i].c,D=a[i].d;
A=max(A,1),B=max(B,1),C=min(C,n-mid+1),D=min(D,m-mid+1);
if(A<=C&&B<=D)e[++ce]=E(A,B,D,a[i].p),e[++ce]=E(C+1,B,D,-a[i].p);
}
sort(e+1,e+ce+1,cmp);
build(1,1,m-mid+1);
for(i=j=1;i<=n-mid+1;i++){
while(j<=ce&&e[j].x<=i)add(1,1,m-mid+1,e[j].l,e[j].r,e[j].p),j++;
if(v[1]<=B)return 1;
}
return 0;
}
void solve(){
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);
l=1,r=min(n,m);
while(l<=r)if(check(mid=(l+r)>>1))l=(ans=mid)+1;else r=mid-1;
printf("%d",ans);
}
}
namespace Sweep{
const int N=1000010,M=2100000;
int A,B,C,D,i,j,k,ans,gi[N],gd[N],v[N],w[N],nxt[N],ed;
int tag[M],len[M],vl[M],vr[M],vm[M];
inline void add(int&x,int y,int z){v[++ed]=y;w[ed]=z;nxt[ed]=x;x=ed;}
void build(int x,int a,int b){
len[x]=vl[x]=vr[x]=vm[x]=b-a+1;
if(a==b)return;
int mid=(a+b)>>1;
build(x<<1,a,mid),build(x<<1|1,mid+1,b);
}
inline void up(int x){
if(tag[x]){vl[x]=vr[x]=vm[x]=0;return;}
if(len[x]==1){vl[x]=vr[x]=vm[x]=1;return;}
vl[x]=vl[x<<1];
if(vl[x<<1]==len[x<<1])vl[x]+=vl[x<<1|1];
vr[x]=vr[x<<1|1];
if(vr[x<<1|1]==len[x<<1|1])vr[x]+=vr[x<<1];
vm[x]=max(max(vm[x<<1],vm[x<<1|1]),vr[x<<1]+vl[x<<1|1]);
}
void add(int x,int a,int b,int c,int d,int p){
if(c<=a&&b<=d){tag[x]+=p;up(x);return;}
int mid=(a+b)>>1;
if(c<=mid)add(x<<1,a,mid,c,d,p);
if(d>mid)add(x<<1|1,mid+1,b,c,d,p);
up(x);
}
void solve(){
while(P--)read(A),read(B),read(C),read(D),read(k),add(gi[A],B,D),add(gd[C],B,D);
build(1,1,m);
for(i=1;i<=n;i++){
for(k=gd[i-1];k;k=nxt[k])add(1,1,m,v[k],w[k],-1);
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);
ans=max(ans,j-i);
}
printf("%d",ans);
}
}
int main(){
read(n),read(m),read(B),read(P);
if(B)BinarySearch::solve();else Sweep::solve();
return 0;
}
BZOJ1795 : [Ioi2008]Pyramid Base 金字塔地基的更多相关文章
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- WC2021 题目清单
Day2 上午 <IOI题型与趣题分析> 来源 题目 完成情况 备注 IOI2002 Day1T1 Frog 已完成 IOI2002 Day1T2 Utopia IOI2002 Day1T ...
- 『计算机视觉』FPN:feature pyramid networks for object detection
对用卷积神经网络进行目标检测方法的一种改进,通过提取多尺度的特征信息进行融合,进而提高目标检测的精度,特别是在小物体检测上的精度.FPN是ResNet或DenseNet等通用特征提取网络的附加组件,可 ...
- Python 图像处理 OpenCV (14):图像金字塔
前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...
- 剖析虚幻渲染体系(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 编辑 ...
- highcharts的表名
line:直线图 spline:曲线图 area:面积图 areaspline:曲线面积图 arearange:面积范围图 areasplinerange:曲线面积范围图 column:柱状图 col ...
- Histogram of Oriented Gridients(HOG) 方向梯度直方图
Histogram of Oriented Gridients,缩写为HOG,是目前计算机视觉.模式识别领域很常用的一种描述图像局部纹理的特征.这个特征名字起的也很直白,就是说先计算图片某一区域中不同 ...
- SVO+PL-SVO+PL-StVO
PL-SVO是基于点.线特征的半直接法单目视觉里程计,我们先来介绍一下基于点特征的SVO,因为是在这个基础上提出的. [1]References: SVO: Fast Semi-Direct ...
- 整个trick
数据输入方面:1.image pyramid 图像金字塔.目前代码里是先选取一个scale,然后在每个GPU上按照scale读图片,相应的gt也更改."scales":[440, ...
随机推荐
- 128. Longest Consecutive Sequence(leetcode)
Given an unsorted array of integers, find the length of the longest consecutive elements sequence. F ...
- 三、jQuery--jQuery基础--jQuery基础课程--第9章 jQuery 常用插件
1.表单验证插件——validate 该插件自带包含必填.数字.URL在内容的验证规则,即时显示异常信息,此外,还允许自定义验证规则,插件调用方法如下:$(form).validate({option ...
- 设置tomcat内存设定
Linux: 在/usr/local/apache-tomcat-/bin 目录下的catalina.sh添加: JAVA_OPTS='-Xms512m -Xmx1024m'要加"m&quo ...
- c++ 左值右值 函数模板
1.先看一段代码,这就是一种函数模板的用法,但是红色的部分如果把a写成a++或者写成一个常量比如1,都是编译不过的,因为如果是a++的话,实际上首先是取得a的 值0,而0作为一个常量没有地址.写成1也 ...
- Oracle RMAN备份策略
建立增量备份:如果数据库运行于不归档模式下,只能在数据库干净关闭的情况下 ( 以 normal .immediate . transactional 方式关闭 ) 才能进行一致性的增量备份,如果数据库 ...
- ImageSwitcher自定意效果+定时切换图片
Activity实现 1 import android.app.Activity; import android.os.Bundle; import android.view.MotionEvent; ...
- 常见IE浏览器bug及其修复方案(双外边距、3像素偏移、绝对定位)
1. 双外边距浮动bug IE6和更低版本中存在双外边距浮动bug,顾名思义,这个Windows bug使任何浮动元素上的外边距加倍 bug重现: <!DOCTYPE html> < ...
- C[泊车管理系统]
// // main.c // 泊车管理系统 // // Created by 丁小未 on 13-7-14. // Copyright (c) 2013年 dingxiaowei. All ...
- MySQL的中文编码问题
创建表格时,怎么让表格显示中文?注意:不区分大小写 mysql> ALTER TABLE 表格的名字 CONVERT TO CHARACTER SET UTF8; 怎么让默认的数据库支持中文字符 ...
- 智能车学习(二十二)——浅谈速度控制
一.经典PID控制 使用遇限反向PID会比较适合有加减速的车子,使用变速积分适合跑匀速的车子.然后这种方法的条件下,一定要尽可能缩短控制周期.. 二.PID加棒棒控制 针对 ...