北京中学国庆模拟赛 #2
《北京中学国庆模拟赛 #2》这篇在博客园热度很高,讲的正是大家天天碰到的事。下面帮你把要点捋出来,结尾有能直接抄的结论。
T0 sub 待更新。 [代码示例略] T1 square 题目大意 给定 \(n\) 个轴对齐矩形,第 \(i\) 个矩形为 \([xa_i, xb_i] \times [ya_i, yb_i]\) 。支持 \(q\) 次操作: Q l r :询问 \([l,r]\) 号矩形是否存在公共点。 C l r x y :将 \([l,r]\) 号矩形整体平移 \((x,y)\) ,即 \(xa,xb\) 都加 \(x\) , \(ya,yb\) 都加 \(y\) 。 核心思路 一组矩形的交集非空,当且仅当它们 横坐标区间有公共部分 且 纵坐标区间有公共部分 。 横坐标区间 \([xa_i, xb_i]\) ( \(i\in[l,r]\) )有公共部分的充要条件是: \[\max_{i\in[l,r]} xa_i \le \min_{i\in[l,r]} xb_i \] 这是因为所有区间交起来是 \([\max xa,\ \min xb]\) ,它非空当且仅当左端点 \(\le\) 右端点(等号时它们只在边界上接触,仍算有公共点)。纵坐标同理: \[\max_{i\in[l,r]} ya_i \le \min_{i\in[l,r]} yb_i \] 于是问题转化为:对任意区间 \([l,r]\) ,快速求四个量 \(\max xa,\ \min xb,\ \max ya,\ \min yb\) 。 对于修改 C l r x y :区间内每个矩形的 \(xa,xb\) 同时加 \(x\) ,所以 \(\max xa\) 和 \(\min xb\) 都加 \(x\) ;同理 \(\max ya,\min yb\) 都加 \(y\) 。这恰好是线段树的 区间加 。
T0 sub 待更新。 [代码示例略] T1 square 题目大意 给定 \(n\) 个轴对齐矩形,第 \(i\) 个矩形为 \([xa_i, xb_i] \times [ya_i, yb_i]\) 。支持 \(q\) 次操作: Q l r :询问 \([l,r]\) 号矩形是否存在公共点。 C l r x y :将 \([l,r]\) 号矩形整体平移 \((x,y)\) ,即 \(xa,xb\) 都加 \(x\) , \(ya,yb\) 都加 \(y\) 。 核心思路 一组矩形的交集非空,当且仅当它们 横坐标区间有公共部分 且 纵坐标区间有公共部分 。 横坐标区间 \([xa_i, xb_i]\) ( \(i\in[l,r]\) )有公共部分的充要条件是: \[\max_{i\in[l,r]} xa_i \le \min_{i\in[l,r]} xb_i \] 这是因为所有区间交起来是 \([\max xa,\ \min xb]\) ,它非空当且仅当左端点 \(\le\) 右端点(等号时它们只在边界上接触,仍算有公共点)。纵坐标同理: \[\max_{i\in[l,r]} ya_i \le \min_{i\in[l,r]} yb_i \] 于是问题转化为:对任意区间 \([l,r]\) ,快速求四个量 \(\max xa,\ \min xb,\ \max ya,\ \min yb\) 。 对于修改 C l r x y :区间内每个矩形的 \(xa,xb\) 同时加 \(x\) ,所以 \(\max xa\) 和 \(\min xb\) 都加 \(x\) ;同理 \(\max ya,\min yb\) 都加 \(y\) 。这恰好是线段树的 区间加 。 线段树维护 开两棵线段树(横、纵各一棵),每棵结点存两个值和懒标记: 横向树: \(mx\) 表示区间 \(\max xa\) , \(mn\) 表示区间 \(\min xb\) , \(tag\) 为懒标记。
T0 sub 待更新。 [代码示例略] T1 square 题目大意 给定 \(n\) 个轴对齐矩形,第 \(i\) 个矩形为 \([xa_i, xb_i] \times [ya_i, yb_i]\) 。支持 \(q\) 次操作: Q l r :询问 \([l,r]\) 号矩形是否存在公共点。 C l r x y :将 \([l,r]\) 号矩形整体平移 \((x,y)\) ,即 \(xa,xb\) 都加 \(x\) , \(ya,yb\) 都加 \(y\) 。 核心思路 一组矩形的交集非空,当且仅当它们 横坐标区间有公共部分 且 纵坐标区间有公共部分 。 横坐标区间 \([xa_i, xb_i]\) ( \(i\in[l,r]\) )有公共部分的充要条件是: \[\max_{i\in[l,r]} xa_i \le \min_{i\in[l,r]} xb_i \] 这是因为所有区间交起来是 \([\max xa,\ \min xb]\) ,它非空当且仅当左端点 \(\le\) 右端点(等号时它们只在边界上接触,仍算有公共点)。纵坐标同理: \[\max_{i\in[l,r]} ya_i \le \min_{i\in[l,r]} yb_i \] 于是问题转化为:对任意区间 \([l,r]\) ,快速求四个量 \(\max xa,\ \min xb,\ \max ya,\ \min yb\) 。 对于修改 C l r x y :区间内每个矩形的 \(xa,xb\) 同时加 \(x\) ,所以 \(\max xa\) 和 \(\min xb\) 都加 \(x\) ;同理 \(\max ya,\min yb\) 都加 \(y\) 。这恰好是线段树的 区间加 。 线段树维护 开两棵线段树(横、纵各一棵),每棵结点存两个值和懒标记: 横向树: \(mx\) 表示区间 \(\max xa\) , \(mn\) 表示区间 \(\min xb\) , \(tag\) 为懒标记。 纵向树: \(my\) 表示区间 \(\max ya\) , \(ny\) 表示区间 \(\min yb\) , \(tag\) 为懒标记。
T0 sub 待更新。 [代码示例略] T1 square 题目大意 给定 \(n\) 个轴对齐矩形,第 \(i\) 个矩形为 \([xa_i, xb_i] \times [ya_i, yb_i]\) 。支持 \(q\) 次操作: Q l r :询问 \([l,r]\) 号矩形是否存在公共点。 C l r x y :将 \([l,r]\) 号矩形整体平移 \((x,y)\) ,即 \(xa,xb\) 都加 \(x\) , \(ya,yb\) 都加 \(y\) 。 核心思路 一组矩形的交集非空,当且仅当它们 横坐标区间有公共部分 且 纵坐标区间有公共部分 。 横坐标区间 \([xa_i, xb_i]\) ( \(i\in[l,r]\) )有公共部分的充要条件是: \[\max_{i\in[l,r]} xa_i \le \min_{i\in[l,r]} xb_i \] 这是因为所有区间交起来是 \([\max xa,\ \min xb]\) ,它非空当且仅当左端点 \(\le\) 右端点(等号时它们只在边界上接触,仍算有公共点)。纵坐标同理: \[\max_{i\in[l,r]} ya_i \le \min_{i\in[l,r]} yb_i \] 于是问题转化为:对任意区间 \([l,r]\) ,快速求四个量 \(\max xa,\ \min xb,\ \max ya,\ \min yb\) 。 对于修改 C l r x y :区间内每个矩形的 \(xa,xb\) 同时加 \(x\) ,所以 \(\max xa\) 和 \(\min xb\) 都加 \(x\) ;同理 \(\max ya,\min yb\) 都加 \(y\) 。这恰好是线段树的 区间加 。 线段树维护 开两棵线段树(横、纵各一棵),每棵结点存两个值和懒标记: 横向树: \(mx\) 表示区间 \(\max xa\) , \(mn\) 表示区间 \(\min xb\) , \(tag\) 为懒标记。 纵向树: \(my\) 表示区间 \(\max ya\) , \(ny\) 表示区间 \(\min yb\) , \(tag\) 为懒标记。 由于同一棵树里两个值共享同一个加法标记,每次区间加只需把 \(mx,mn\) 一起加 \(v\) 。
T0 sub 待更新。 [代码示例略] T1 square 题目大意 给定 \(n\) 个轴对齐矩形,第 \(i\) 个矩形为 \([xa_i, xb_i] \times [ya_i, yb_i]\) 。支持 \(q\) 次操作: Q l r :询问 \([l,r]\) 号矩形是否存在公共点。 C l r x y :将 \([l,r]\) 号矩形整体平移 \((x,y)\) ,即 \(xa,xb\) 都加 \(x\) , \(ya,yb\) 都加 \(y\) 。 核心思路 一组矩形的交集非空,当且仅当它们 横坐标区间有公共部分 且 纵坐标区间有公共部分 。 横坐标区间 \([xa_i, xb_i]\) ( \(i\in[l,r]\) )有公共部分的充要条件是: \[\max_{i\in[l,r]} xa_i \le \min_{i\in[l,r]} xb_i \] 这是因为所有区间交起来是 \([\max xa,\ \min xb]\) ,它非空当且仅当左端点 \(\le\) 右端点(等号时它们只在边界上接触,仍算有公共点)。纵坐标同理: \[\max_{i\in[l,r]} ya_i \le \min_{i\in[l,r]} yb_i \] 于是问题转化为:对任意区间 \([l,r]\) ,快速求四个量 \(\max xa,\ \min xb,\ \max ya,\ \min yb\) 。 对于修改 C l r x y :区间内每个矩形的 \(xa,xb\) 同时加 \(x\) ,所以 \(\max xa\) 和 \(\min xb\) 都加 \(x\) ;同理 \(\max ya,\min yb\) 都加 \(y\) 。这恰好是线段树的 区间加 。 线段树维护 开两棵线段树(横、纵各一棵),每棵结点存两个值和懒标记: 横向树: \(mx\) 表示区间 \(\max xa\) , \(mn\) 表示区间 \(\min xb\) , \(tag\) 为懒标记。 纵向树: \(my\) 表示区间 \(\max ya\) , \(ny\) 表示区间 \(\min yb\) , \(tag\) 为懒标记。 由于同一棵树里两个值共享同一个加法标记,每次区间加只需把 \(mx,mn\) 一起加 \(v\) 。 建树时把 \(xa\) 放进 \(mx\) 、 \(xb\) 放进 \(mn\) (纵向树放 \(ya,yb\) ),然后按操作执行。
建议先收藏再实操:挑其中一个点今天就试试,跑通了再看下一个。知识只有过手才是你的,你准备先试哪一点? 来源|博客园《北京中学国庆模拟赛 #2》,https://www.cnblogs.com/zhenghaoqi/p/23204041.html
评论(0)
暂无评论,来抢第一条。