[Code+#3]寻找车位

[Code+#3]寻找车位 

挺厉害的线段树题


m<=n,所以n<=2000,并且只有1000次修改询问,mqlogn的复杂度可以接受!

 求全局?

对行(n)建一个线段树。

线段树中维护的东西,一定可以包含所有“完全包含在”这个横条中的最大正方形。

只在mid左、右的可以递归下去再取max,跨越中间的?

大小为1000的两个数组,维护区间两端的1000个位置的从左从右开始最长1的个数

线段树pushup的时候 考虑跨过mid的正方形

不妨考虑长方形 宽<=长 纵向下来的是宽,双指针l,r 横向的是长 不断往后走r 如果r-l+1>lsmin(l,r)+rsmin(l,r) 那么++l 保证宽小于等于长

(宽大于长的会在宽小的时候统计到) 相当于枚举对于r的时候,最靠上的宽小于等于长的位置l (因为ans取决于短边,也就是宽) 一定有单调性,所以l直接++即可 lsmin(l,r)+rsmin(l,r)额外用单调队列维护

子矩形?

先通过线段树把子矩形劈成logn段,就暂时消除了行宽的限制

直接做的话,对于完整的一个线段树区域,还要暴力枚举每个行中线的,就O(q*n^2logn)了

然鹅

对于每一个中线mid,设之前单调队列找到的边长是r[x][i],那么就是min(r[x][i],i-U+1)来贡献答案。(U,D是列的限制)

都是对i-U+1取min,那么r[x][i]一定就是选择最大的那一个。

所以,

每个区间再维护一个R[i],所有r[i]的max

这样保证了子矩形分到完整的区间的时候,可以直接做完return了。复杂度就能正确

对于query时往两侧都分治的区间,要再统计跨区间的最大正方形

这时最大1的长度就要和行的限制取min了。

queue用个pair存

 

代码:

(动态分内存)

#include<bits/stdc++.h>
#define reg register int
#define il inline
#define numb (ch^'0')
#define mid ((l+r)>>1)
#define ls (x<<1)
#define rs (x<<1|1)
#define fi first
#define se second
using namespace std;
typedef long long ll;
il void rd(int &x){char ch;x=0;bool fl=false;while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);for(x=numb;isdigit(ch=getchar());x=x*10+numb);(fl==true)&&(x=-x);
}
namespace Miracle{
const int N=4e6+10;
int n,m,q;
int *lmx[4*N],*rmx[4*N],*ans[4*N];
int Pool[14*N],*cur=Pool,*mp[N];
struct que{int l,r;pair<int,int>q[N];
//    void p_f(int L){
//        while(l<=r&&q[l]<L) ++l;
//    }void push(int id,int v){while(l<=r&&q[r].se>v) --r;q[++r]=make_pair(id,v);}int get(int L){while(l<=r&&q[l].fi<L) ++l;if(l<=r) return q[l].se;else return -1;}void clear(){l=1,r=0;}
}Q1,Q2;
void pushup(int x,int l,int r){Q1.clear();Q2.clear();int j=1;for(reg i=1;i<=m;++i){Q1.push(i,rmx[ls][i]);Q2.push(i,lmx[rs][i]);while(i>=j&&Q1.get(j)+Q2.get(j)<i-j+1){++j;}ans[x][i]=i-j+1;}for(reg i=1;i<=m;++i){ans[x][i]=max(ans[x][i],max(ans[ls][i],ans[rs][i]));lmx[x][i]=(lmx[ls][i]==mid-l+1)?lmx[ls][i]+lmx[rs][i]:lmx[ls][i];rmx[x][i]=(rmx[rs][i]==r-mid)?rmx[rs][i]+rmx[ls][i]:rmx[rs][i];}
}
void build(int x,int l,int r){lmx[x]=cur;cur+=m+1;rmx[x]=cur;cur+=m+1;ans[x]=cur;cur+=m+1;if(l==r){for(reg i=1;i<=m;++i){ans[x][i]=rmx[x][i]=lmx[x][i]=mp[l][i];}return;}build(x<<1,l,mid);build(x<<1|1,mid+1,r);pushup(x,l,r);
}
void upda(int x,int l,int r,int p,int t,int c){if(l==r){ans[x][t]=rmx[x][t]=lmx[x][t]=c;return;}if(p<=mid) upda(x<<1,l,mid,p,t,c);else upda(x<<1|1,mid+1,r,p,t,c);pushup(x,l,r);
}
int mx;
void merge(int x,int l,int r,int L,int R,int U,int D){Q1.clear();Q2.clear();int j=U;for(reg i=U;i<=D;++i){Q1.push(i,min(mid-L+1,rmx[ls][i]));Q2.push(i,min(R-mid,lmx[rs][i]));while(i>=j&&Q1.get(j)+Q2.get(j)<i-j+1){++j;}mx=max(mx,i-j+1);}
}
void query(int x,int l,int r,int L,int R,int U,int D){if(L<=l&&r<=R){for(reg i=U;i<=D;++i){mx=max(mx,min(ans[x][i],i-U+1));}return;}if(L<=mid&&mid<R) {query(x<<1,l,mid,L,R,U,D);query(x<<1|1,mid+1,r,L,R,U,D);merge(x,l,r,L,R,U,D);}else if(L<=mid){query(x<<1,l,mid,L,R,U,D);}else{query(x<<1|1,mid+1,r,L,R,U,D);}
}int main(){rd(n);rd(m);rd(q);Q1.clear();Q2.clear();for(reg i=1;i<=n;++i){mp[i]=cur;cur+=m+1;for(reg j=1;j<=m;++j){rd(mp[i][j]);}}build(1,1,n);int x,y,l,s,r,t;int op;while(q--){rd(op);if(op==0){rd(x);rd(y);mp[x][y]^=1;upda(1,1,n,x,y,mp[x][y]);}else{mx=0;rd(l);rd(s);rd(r);rd(t);query(1,1,n,l,r,s,t);printf("%d\n",mx);}}return 0;
}}
signed main(){Miracle::main();return 0;
}/*Author: *Miracle*Date: 2019/2/13 21:22:39
*/

总结:
抓住m<=n性质,对长的n建线段树,区间维护信息时候,处理跨域mid的最大正方形。

灵活运用单调队列。

转载于:https://www.cnblogs.com/Miracevin/p/10372696.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/363910.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ActiveMQ –经纪人网络解释–第2部分

在此博客中&#xff0c;我们将看到双工网络连接器如何工作。 在上一部分中&#xff0c;我们从broker-1和broker-2创建了一个网络连接器。 我们能够看到当代理2上有一个使用者使用队列“ foo.bar”时&#xff0c;代理1上的队列“ foo.bar”的消息如何转发到代理2上的队列“ foo…

JQ实现情人节表白程序

JQ实现情人节表白页面 效果图&#xff1a; 表白利页&#xff0c;你值得拥有哦&#xff01; 代码如下&#xff0c;复制即可使用&#xff1a; <!doctype html> <html> <head> <meta charset"utf-8"> <title>JQ实现情人节表白程序<…

php 内部异步执行顺序,event_loop中不同异步操作的执行顺序

关于js的单线程、怎么创建一个异步任务都是老生常谈的话题了&#xff0c;我们今天就总结一下js不同的异步操作到底执行顺序如何。首先我们要明白js两种任务类型&#xff0c;一个是macrotask(宏任务)&#xff0c;一个是 microtask(微任务)。一个宏任务就是一个事件循环&#xff…

OpenGPU.org域名已经被劫持

这个域名被指向了上海黄浦区某地。 此时此刻&#xff0c;我的心情无比激动&#xff0c;“这年头&#xff0c;你要是不被‘墙’了&#xff0c;都不好意思出门”。 This domain name had been redirected to Shanghai, PRC. At this moment, I’m really excited that it’s my h…

Java 8日期时间API教程:LocalDateTime

该博文是Java 8中引入的有关Date Time API的系列教程的一部分。在本博文中&#xff0c;我将介绍LocalDateTime类中可用的一些方法。 LocalDateTime是一个不可更改的线程安全对象&#xff0c;它表示ISO-8601日历系统中没有时区的日期时间&#xff0c;例如2014-03-30T02&#xf…

消息队列使用的四种场景介绍(转)

消息队列中间件是分布式系统中重要的组件&#xff0c;主要解决应用耦合&#xff0c;异步消息&#xff0c;流量削锋等问题 实现高性能&#xff0c;高可用&#xff0c;可伸缩和最终一致性架构 使用较多的消息队列有ActiveMQ&#xff0c;RabbitMQ&#xff0c;ZeroMQ&#xff0c;Ka…

一步一步SharePoint 2007之三十一:实现文档Event Handler(3)——附加Handler程序

摘要  本篇文章将介绍实现文档Event Handler的第三部分——附加Handler程序。正文  下面将记录每一步的操作过程。  1、首先打开我的网站&#xff0c;依次点击Document Center、Documents&#xff0c;进入Documents列表页面。  2、在Documents列表界面中点击Settings&a…

oracle数据库swap占用率高,物理内存空余很多,swap被持续占用的问题

本帖最后由 wyanghu 于 2012-8-18 10:21 编辑这套生产环境跑在vmware esx虚拟机上&#xff0c;现在遇到的问题是&#xff1a;操作系统内存空余很大&#xff0c;但swap被持续占用&#xff0c;直到swap被占完&#xff0c;估计系统就崩溃了。下面是我的操作系统参数及oracle参数&a…

Day2 HTML基本标签元素

Day2 HTML基本标签元素 HTML: 超文本标记语言(HyperText Mark-up Language ) 1.作用&#xff1a;写网页结构    2.HTML不区分大小写&#xff0c;建议小写   3.文件后缀 .html 或者 .htm   4.html由浏览器解析执行. 由上往下&#xff0c;由左往右 1) HTML标…

C# 如何跨平台调用C++的函数指针!

函数指针搞C的人应该都知道&#xff0c;效率高&#xff0c;易用性强&#xff0c;隐蔽代码等。在C里面调用C写的dll的函数指针那是在容易不过了。使用C#就稍微麻烦点了&#xff01;那怎么掉呢&#xff1f;通过上面的第一篇文章我们知道应该使用委托 delegate。如果再高级点&…

Java hashCode() 和 equals()的若干问题解答

本章的内容主要解决下面几个问题&#xff1a; 1 equals() 的作用是什么&#xff1f; 2 equals() 与 的区别是什么&#xff1f; 3 hashCode() 的作用是什么&#xff1f; 4 hashCode() 和 equals() 之间有什么联系&#xff1f; https://www.cnblogs.com/skywang12345/p/3324958.…

Builder模式和Spring框架

介绍 每当对象同时具有强制属性和可选属性时&#xff0c;我都喜欢使用构建器模式 。 但是构建对象通常是Spring框架的责任&#xff0c;因此让我们看看如何同时使用基于Java和XML的Spring配置来使用它。 建造者的例子 让我们从下面的Builder类开始。 public final class Confi…

php数据库中统计人数用什么方法,在PHP中处理用户统计信息的最佳方法是什么

我如何处理 PHP中的用户统计信息&#xff1f;我可以选择两种明显的方法.两者都有缺陷.>必要时选择MySQL COUNT.这里的缺陷是,如果你要计算很多行,那么它可能会很慢,特别是当你必须在看似每个页面加载时这样做.好处是计数总是正确的.>将用户统计信息存储在统计信息表中.这…

作用域、执行环境、闭包(四)

本文也同步发表在我的公众号“我的天空” 上一期我们已经介绍了闭包&#xff0c;由于闭包可以延长函数内部的变量的生存周期&#xff0c;因此我们可以将不需要暴露在全局的变量封装成函数的内部变量&#xff0c;从而避免代码污染。 譬如要实现一个简单的累加器&#xff0c;为了…

今天发布了一个新的网站矩阵www.wimatrix.cn

关于科技生活新知的&#xff0c;digg类型&#xff0c;欢迎朋友们来访问&#xff0c;并提出宝贵的意见网址是 http://www.wimatrix.cn 转载于:https://www.cnblogs.com/liugod/archive/2007/09/29/910637.html

[Bzoj2243][SDOI2011]染色(线段树树剖)

题目链接&#xff1a;https://www.lydsy.com/JudgeOnline/problem.php?id2243 线段树树链剖分&#xff0c;在线段树需要每次用lt和rt两个数组记录当前区间的左右边界的颜色&#xff0c;向上更新时需要判断左区间的右边界是否和右区间的左边界相等。在剖分求LCA的过程中需要在求…

php static_castunsigned int,C++ static_cast、dynamic_cast、const_cast和reinterpret_cast(四种类型转换运算符)...

上节讲到&#xff0c;隐式类型转换是安全的&#xff0c;显式类型转换是有风险的&#xff0c;C语言之所以增加强制类型转换的语法&#xff0c;就是为了强调风险&#xff0c;让程序员意识到自己在做什么。但是&#xff0c;这种强调风险的方式还是比较粗放&#xff0c;粒度比较大&…

NetBeans IDE 8.0和Java 8的新功能

NetBeans IDE 8.0已发布&#xff0c;还为Java 8技术提供了新功能。 它具有用于与Java SE 8&#xff0c;Java SE Embedded 8和Java ME Embedded 8配合使用的代码分析器和编辑器。IDE还具有新的增强功能&#xff0c;这些功能进一步改善了其对使用PrimeFaces对Maven和Java EE的支持…

AngularJS(九):路由

本文也同步发表在我的公众号“我的天空” AngularJS路由 AngularJS路由可以让我们通过不同的URL访问不同页面&#xff08;似乎是废话&#xff09;&#xff0c;其价值主要体现在单页面的web应用中&#xff08;single page web application&#xff0c;SPA&#xff09;&#xff0…

(转)Oracle中实现行列转换的方法

(转自)http://blog.csdn.net/Torrice/archive/2006/01/25/587986.aspx 我们在写SQL语句的时候经常需要用到行与列的转换问题&#xff0c;对于一个新手来说可能比较困难&#xff0c;其实你只要能够熟练运用Decode和Sum函数&#xff0c;这个问题就迎刃而解. Create table tes…