[BZOJ4237]稻草人 题解
我们考虑分治一下
按\(x\)坐标排序 然后对于每一段的两部分都按\(y\)排序
左右两边都维护一个单调栈
然后考虑右边对左边的贡献就行了
#include <bits/stdc++.h>
#define int long long
using namespace std ;
const int MAXN = 2e5 + 5 ;
int n ;
struct Node {
int x , y ;
} d[ MAXN ] ;
int ans ;
inline bool cmp ( Node a , Node b ) { return a.x < b.x ; }
inline bool cmp1 ( Node a , Node b ) { return a.y > b.y ; }
int st1[ MAXN ] , st2[ MAXN ] , top1 , top2 ;
inline int read () {
int tot = 0 , f = 1 ; char c = getchar () ;
while ( c < '0' || c > '9' ) { if ( c == '-' ) f = -1 ; c = getchar () ; }
while ( c >= '0' && c <= '9' ) { tot = tot * 10 + c - '0' ; c = getchar () ; }
return tot * f ;
}
inline void cdq ( int l , int r ) {
if ( l >= r ) return ;
int mid = ( l + r ) >> 1 ;
sort ( d + l , d + mid + 1 , cmp1 ) ;
sort ( d + mid + 1 , d + r + 1 , cmp1 ) ;
int tot = mid + 1 ; top1 = top2 = 0 ;
for ( int i = l ; i <= mid ; i ++ ) {
while ( top1 && d[ st1[ top1 ] ].x < d[ i ].x ) top1 -- ;
st1[ ++ top1 ] = i ;
while ( tot <= r && d[ tot ].y >= d[ i ].y ) {
while ( top2 && d[ st2[ top2 ] ].x > d[ tot ].x ) top2 -- ;
st2[ ++ top2 ] = tot ;
tot ++ ;
}
if ( top1 == 1 ) { ans += top2 ; continue ; }
int t = d[ st1[ top1 - 1 ] ].y ;
int lx = 1 , rx = top2 , ans1 = 0 ;
while ( lx <= rx ) {
int midx = ( lx + rx ) >> 1 ;
if ( d[ st2[ midx ] ].y <= t ) ans1 = midx , rx = midx - 1 ;
else lx = midx + 1 ;
}
if ( ans1 && ans1 <= top2 ) ans += ( top2 - ans1 + 1 ) ;
}
sort ( d + l , d + r + 1 , cmp ) ;
cdq ( l , mid ) ;
cdq ( mid + 1 , r ) ;
}
signed main () {
n = read () ;
for ( int i = 1 ; i <= n ; i ++ ) d[ i ].x = read () , d[ i ].y = read () ;
sort ( d + 1 , d + 1 + n , cmp ) ;
ans = 0 ;
cdq ( 1 , n ) ;
printf ( "%lld\n" , ans ) ;
return 0 ;
}
[BZOJ4237]稻草人 题解的更多相关文章
- bzoj4237: 稻草人 cdq分治 单调栈
目录 题目链接 题解 代码 题目链接 bzoj4237: 稻草人 题解 暴力统计是n^2的 考虑统计一段区间对另一端的贡献 对于y值cdq分治,降调一维 对于当前两个分治区间统计上面那部分对下面那部分 ...
- [BZOJ4237]稻草人/[JOISC2014]かかし
[BZOJ4237]稻草人/[JOISC2014]かかし 题目大意: 平面上\(n(n\le2\times10^5)\)个点,若一个矩形各边与坐标轴平行,左下角和右上角都在\(n\)个点之中,且内部不 ...
- BZOJ4237 稻草人 分治 单调栈
原文链接https://www.cnblogs.com/zhouzhendong/p/8682572.html 题目传送门 - BZOJ4237 题意 平面上有$n(n\leq 2\times 10^ ...
- bzoj4237稻草人
题意:给你一个田地,问左下角和右上角有稻草人并且内部除了边界都没有稻草人的矩形数. 标程: #include<bits/stdc++.h> using namespace std; int ...
- [BZOJ4237]稻草人(CDQ分治)
先按y排序,二分,两边递归下去,然后处理下半部分对上半部分的贡献,即左下点在下半部分,右上点在上半部分的合法矩形个数. 两个部分均按x排序,枚举右上点p,则左下点需要满足: 1.横坐标大于上半部分纵坐 ...
- BZOJ4237 稻草人 【CDQ分治】
Description JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要 ...
- BZOJ4237 稻草人(分治+树状数组+单调栈)
如果要询问的某个纵坐标为inf的点左边是否有点能与其构成所要求的矩形,只要用个单调栈就可以了.可以想到用分治来制造单调性. 按横坐标排序,每次考虑跨过分治中心的矩形.考虑右边的每个点能与左边的哪些点构 ...
- BZOJ4237稻草人——单调栈+CDQ分治
题目描述 JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要满足以下条件: ...
- bzoj4237 稻草人
我是萌萌的传送门 题意不难理解吧-- 一开始看到这道题的时候lrd告诉我这题要分治,还给我讲了讲分治要怎么写,好像是CDQ+树状数组来着--(好吧我已经忘了--)然而我第一眼看完题之后的思路是数据结构 ...
随机推荐
- toad for oracle 小技巧
在SQL*LOADER 工具上(或者称为SQLLDR,读为:“sequel loader”),因为它仍然是装载数据的主要方法,SQLLDR 能够在极短的时间内装 载庞大数量的数据. 我也是初使用,理解 ...
- Ethical Hacking - GAINING ACCESS(15)
CLIENT SIDE ATTACKS Social Engineering Gather info about the user(s). Build a strategy based on the ...
- Ethical Hacking - NETWORK PENETRATION TESTING(21)
MITM - Code Injection Inject javascript or HTML code into pages. Code gets executed on target machin ...
- 详解UDP协议
运输层位于网络层之上,网络层提供了主机之间的逻辑通信:而运输层为运行在不同主机上的应用进程之间提供了逻辑通信.从应用程序角度看,通过逻辑通信,运行不同进程的主机好像直接相连一样.应用进程使用运输层提供 ...
- Python 如何生成 200 个激活码
请用 Python 如何生成 200 个激活码. 激活码的格式为asqE-9xRK-lqWU-QkMT 要求1: 使用随机生成时,生成数字概率为1/5,大写字母和小写字母概率各为2/5 要求2: 这2 ...
- NameBeta - 多家比价以节省咱的域名注册成本
共收录 1584 种顶级域名,汇集互联网上 29 家知名域名注册商,每日更新价格信息 有的域名还可以查出到期时间点我前往官网 NameSilo1美元优惠码:whatz
- 如何将 Bitbucket 的 pull request 签出到本地 review
将 pull request 签出到本地进行 review, 最大的好处是可以通过 IDE 来查找各种变量和方法的上下文引用,以便充分发挥我们杠精的本领,将 pull request 中的各种合理和不 ...
- Mysql5.7前后修改用户密码变化
本文主要强调修改密码的sql语句变化.如果是root密码忘记了,请参考Mysql忘记root密码怎么解决 Mysql 5.7以前修改密码 update mysql.user set password= ...
- web自动化 -- HTMLreport(一)测试报告自定义测试用例名,重写ddt
一.需求痛点 1.HTMLreport测试报告的用例名不明确 2.希望可以自定义HTMLreport测试报告的用例名 3.痛点截图 二.解决办法 1.原因分析 HTMLreport测试报告中的用例名是 ...
- SpringBoot2 整合MinIO中间件,实现文件便捷管理
本文源码:GitHub·点这里 || GitEE·点这里 一.MinIO简介 1.基础描述 MinIO是一个开源的对象存储服务.适合于存储大容量非结构化的数据,例如图片.视频.日志文件.备份数据和容器 ...