题意:给你一个田地,问左下角和右上角有稻草人并且内部除了边界都没有稻草人的矩形数。

标程:

 #include<bits/stdc++.h>
using namespace std;
int read()
{
int x=,f=;char ch=getchar();
while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
while (ch>=''&&ch<='') x=(x<<)+(x<<)+ch-'',ch=getchar();
return x*f;
}
const int N=;
int n,q1[N],q2[N];
long long ans;
struct node{int x,y;}a[N],tmp[N];
bool cmp(const node &A,const node &B) {return A.y<B.y;}
int find(int x,int l,int r)
{
while (l+<r)
{
int mid=(l+r)/;
if (a[q2[mid]].x<x) l=mid;else r=mid;//边界上的点不算
}
return l;
}
void solve(int l,int r)
{
if (l==r) return;
int mid=((l+r)>>);
solve(l,mid);solve(mid+,r);
int top1=,top2=;
for (int i=mid+,j=l;i<=r;i++)
{
while (top1&&a[i].y<a[q1[top1]].y) top1--;
for (;j<=mid&&a[j].x<a[i].x;j++)//勿取等号,一条线不算矩形
{
while (top2&&a[j].y>a[q2[top2]].y) top2--;
q2[++top2]=j;
}
ans+=top2-find(a[q1[top1]].x,,top2+);//二分边界注意
q1[++top1]=i;
}
int L=l,R=mid+;
for (int i=l;i<=r;i++)
if (R>r||a[L].x<a[R].x&&L<=mid) tmp[i]=a[L++];else tmp[i]=a[R++];
for (int i=l;i<=r;i++) a[i]=tmp[i];
}
int main()
{
n=read();
for (int i=;i<=n;i++) a[i].x=read(),a[i].y=read();
sort(a+,a+n+,cmp);
solve(,n);
printf("%lld\n",ans);
return ;
}

题解:cdq分治+单调栈+二分

第一感觉李超树也能做吧。维护折点个数。

那么同理上次一道李超树考试题也可以用cdq分治,二分之前预处理前缀和。

将稻草人平面分成上下两块,按照x坐标排序,枚举上部的一个点作为右上角,在下半部分统计有多少个y坐标依次递减的左下角,并且满足比上部离右上角最近的点x坐标更大。上下都用单调栈维护,最后二分可行的左下角。

时间复杂度O(nlog^2(n))。

注意二分的时候边界条件,从0~top2+1。

bzoj4237稻草人的更多相关文章

  1. bzoj4237: 稻草人 cdq分治 单调栈

    目录 题目链接 题解 代码 题目链接 bzoj4237: 稻草人 题解 暴力统计是n^2的 考虑统计一段区间对另一端的贡献 对于y值cdq分治,降调一维 对于当前两个分治区间统计上面那部分对下面那部分 ...

  2. [BZOJ4237]稻草人/[JOISC2014]かかし

    [BZOJ4237]稻草人/[JOISC2014]かかし 题目大意: 平面上\(n(n\le2\times10^5)\)个点,若一个矩形各边与坐标轴平行,左下角和右上角都在\(n\)个点之中,且内部不 ...

  3. BZOJ4237 稻草人 分治 单调栈

    原文链接https://www.cnblogs.com/zhouzhendong/p/8682572.html 题目传送门 - BZOJ4237 题意 平面上有$n(n\leq 2\times 10^ ...

  4. [BZOJ4237]稻草人(CDQ分治)

    先按y排序,二分,两边递归下去,然后处理下半部分对上半部分的贡献,即左下点在下半部分,右上点在上半部分的合法矩形个数. 两个部分均按x排序,枚举右上点p,则左下点需要满足: 1.横坐标大于上半部分纵坐 ...

  5. BZOJ4237 稻草人 【CDQ分治】

    Description JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要 ...

  6. BZOJ4237 稻草人(分治+树状数组+单调栈)

    如果要询问的某个纵坐标为inf的点左边是否有点能与其构成所要求的矩形,只要用个单调栈就可以了.可以想到用分治来制造单调性. 按横坐标排序,每次考虑跨过分治中心的矩形.考虑右边的每个点能与左边的哪些点构 ...

  7. BZOJ4237稻草人——单调栈+CDQ分治

    题目描述 JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要满足以下条件: ...

  8. bzoj4237 稻草人

    我是萌萌的传送门 题意不难理解吧-- 一开始看到这道题的时候lrd告诉我这题要分治,还给我讲了讲分治要怎么写,好像是CDQ+树状数组来着--(好吧我已经忘了--)然而我第一眼看完题之后的思路是数据结构 ...

  9. bzoj4237 稻草人——分治

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4237 分治: 先把所有点按 y 排序,然后二分递归: 对于每个 mid ,计算经过它的矩形的 ...

随机推荐

  1. 18.synchronized

    同步的前提:  必须要有两个或者两个以上的线程  必须是多个线程使用同一个锁  必须保证同步中只能有一个线程在运行  好处:解决了多线程的安全问题  弊端:多个线程需要判断锁,较为消耗资源.抢锁的资源 ...

  2. python3.x current_question

    扩散四维过程遇到的问题,暂不能解决,但先收集起来. ''' list_str=['test', None, '', 'str', ' ', 'END'] data = filter(lambda st ...

  3. Inno Setup Conpiler 使用方法

    Inno Setup Conpiler 使用方法: 首先创建一个空白的脚本文件,点击NEXT 然后会进入到这个界面,提示你详细说明一下软件的基本信息 Application name: 应用程序名称 ...

  4. Quartz.Net 任务调度之传递参数(2)

    1.jobDetail //添加 //Key:Value jobDetail.JobDataMap.Add("张翼德", "张翼德"); jobDetail.J ...

  5. Python--基础之socket编程

    一 客户端/服务器架构 即C/S架构,包括 1.硬件C/S架构(打印机) 2.软件C/S架构(web服务) 美好的愿望: 最常用的软件服务器是 Web 服务器.一台机器里放一些网页或 Web 应用程序 ...

  6. SQL中循环的实现方式

    一.第一种方法,游标 定义游标 DECLARE cur_ClubHeadCash CURSOR FAST_FORWARD READ_ONLY FOR,循环每行 FETCH NEXT FROM cur_ ...

  7. Linux常用命令的使用方法

    Linux 命令大全 Linux 命令大全 1.文件管理 cat chattr chgrp chmod chown cksum cmp diff diffstat file find git gitv ...

  8. php开发面试题---PHP为什么不安全,主要有那些安全问题(整理)

    php开发面试题---PHP为什么不安全及常见的攻击方式(整理) 一.总结 一句话总结: 其实安全和语言关系不大,主要和程序员关系比较大,php也就是因为是弱类型语言,所以不如java健壮,php会遇 ...

  9. 机器学习算法--Elastic Net

    1) alpha : float, optional Constant that multiplies the penalty terms. Defaults to 1.0. See the note ...

  10. 屏蔽浏览器默认样式 user agent stylesheet

    user agent stylesheet <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &q ...