bzoj4237 稻草人——分治

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4237

分治;

先把所有点按 y 排序,然后二分递归;

对于每个 mid ,计算经过它的矩形的个数,把上面的每个点当做右上角,考虑下面多少点可以作为左下角;

上面的限制只有前面的 y 大于等于自己的 y,所以维护递增的单调栈;

下面的限制是后面的 y 小于等于自己的 y,所以维护递减的单调栈;

还要注意 x 的限制,二分找到栈内满足条件的最前面的点,到栈顶的元素个数就是对答案的贡献。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int const maxn=2e5+5;
int n,tpa,tpb,sta[maxn],stb[maxn];
long long ans;
struct N{int x,y;}s[maxn];
bool cmp(N a,N b){return a.y<b.y;}
bool cmpx(N a,N b){return a.x<b.x;}
void cdq(int l,int r)
{
    if(l==r)return;
    int mid=((l+r)>>1);
    cdq(l,mid); cdq(mid+1,r);
    sort(s+l,s+mid+1,cmpx); sort(s+mid+1,s+r+1,cmpx);//请不要写成 s+1
    int p=l; tpa=tpb=0;
    for(int i=mid+1;i<=r;i++)
    {
        while(s[sta[tpa]].y>=s[i].y && tpa)tpa--;
        int pos=s[sta[tpa]].x; sta[++tpa]=i;
        while(p<=mid && s[p].x<s[i].x)
        {
            while(s[stb[tpb]].y<=s[p].y && tpb)tpb--;
            stb[++tpb]=p; p++;
        }
        int L=1,R=tpb,res=-1;
        while(L<=R)
        {
            int Mid=((L+R)>>1);
            if(s[stb[Mid]].x>pos)res=Mid,R=Mid-1;
            else L=Mid+1;
        }
        if(res!=-1)ans+=tpb-res+1;
    }
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d%d",&s[i].x,&s[i].y);
    s[0].x=s[0].y=-1;//
    sort(s+1,s+n+1,cmp);
    cdq(1,n);
    printf("%lld\n",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/Zinn/p/9231373.html

时间: 2024-10-28 05:01:59

bzoj4237 稻草人——分治的相关文章

bzoj4237: 稻草人 cdq分治 单调栈

目录 题目链接 题解 代码 题目链接 bzoj4237: 稻草人 题解 暴力统计是n^2的 考虑统计一段区间对另一端的贡献 对于y值cdq分治,降调一维 对于当前两个分治区间统计上面那部分对下面那部分的贡献 对当前两区间x排序后,对上部分维护单增单调栈,得到距离当前点最近的比她低的点p 对于下面的区间维护一个上凸壳 ,直接在凸壳上二分p统计答案 代码 #include<set> #include<cstdio> #include<cstring> #include<

bzoj4237 稻草人

Description JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要满足以下条件: 田地的形状是边平行于坐标轴的长方形: 左下角和右上角各有一个稻草人: 田地的内部(不包括边界)没有稻草人. 给出每个稻草人的坐标,请你求出有多少遵从启示的田地的个数 Input 第一行一个正整数N,代表稻草人的个数 接下来N行,第i行(1<=i<=N)包含2个由空格分隔的整数Xi和

bzoj4237稻草人

题意:给你一个田地,问左下角和右上角有稻草人并且内部除了边界都没有稻草人的矩形数. 标程: 1 #include<bits/stdc++.h> 2 using namespace std; 3 int read() 4 { 5 int x=0,f=1;char ch=getchar(); 6 while (ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();} 7 while (ch>='0'&&ch<='9'

NOIWC2018游记

NOIWC2018游记 接着PKUWC就是NOIWC了.感觉时间很紧呀,但越是紧张呢,就越让人心里觉得充实. 能够去NOIWC,应该是一次非常充实的体验吧. 这一篇游记是接着上一篇写的,时间点上完全都能够接起来.这是一个传送门 PKUWC2018游记 by租酥雨 如果没有什么不可抗因素阻碍的话应该能够保证日更吧... 记得当初PKUWC赛程公布的时候,SYC很惊讶地问我: 为什么不上课呀? 真是个好问题. 那么NOIWC有课上了萝卜他一定会很开心吧(雾 大致地看了一下课程安排:线段树?概率期望?

bzoj 4237: 稻草人 -- CDQ分治

4237: 稻草人 Time Limit: 40 Sec  Memory Limit: 256 MB Description JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要满足以下条件: 田地的形状是边平行于坐标轴的长方形: 左下角和右上角各有一个稻草人: 田地的内部(不包括边界)没有稻草人. 给出每个稻草人的坐标,请你求出有多少遵从启示的田地的个数 Input 第一

CDQ分治与整体二分小结

前言 这是一波强行总结. 下面是一波瞎比比. 这几天做了几道CDQ/整体二分,感觉自己做题速度好慢啊. 很多很显然的东西都看不出来 分治分不出来 打不出来 调不对 上午下午晚上的效率完全不一样啊. 完蛋.jpg 绝望.jpg. 关于CDQ分治 CDQ分治,求的是三维偏序问题都知道的. 求法呢,就是在分治外面先把一维变成有序 然后分治下去,左边(l,mid)关于右边(mid+1,r)就不存在某一维的逆序了,所以只有两维偏序了. 这个时候来一波"树状数组求逆序对"的操作搞一下二维偏序 就可

BZOJ 4237: 稻草人

4237: 稻草人 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 661  Solved: 286[Submit][Status][Discuss] Description JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要满足以下条件: 田地的形状是边平行于坐标轴的长方形: 左下角和右上角各有一个稻草人: 田地的内部(不

4237: 稻草人

4237: 稻草人 https://www.lydsy.com/JudgeOnline/problem.php?id=4237 分析: CDQ分治+单调栈. 首先按照x排序,每次分治,考虑左边对右边的贡献.CDQ的过程中,按照y从大到小排序. 代码: 1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #include<cmath> 5 #include<iostream>

《巨婴国》:差评。伪科学/非科学,逻辑比较差,以偏概全,解释牵强,竖起一个稻草人打得挺嗨。1星

读后感觉比较差.只能给1星.相当于负分的水平. 作者认为中国人大部分是没长大的婴儿,不能正确处理人际关系,隐含地推论常见的心理疾病.变态人格.不正常情商都是巨婴病的表现,明确地推论巨婴理论可以解释许多世界历史和国际政治上的事情. 差评理由有下面几个: 1:“巨婴国”的学说到底是不是一个严肃的学术上的推论?我认为不是.我认为可以归入伪科学或非科学的范畴.作者虽然是北大心理学系的本科和硕士毕业,但是全书是浓郁的江湖派的风格.作者提到了一个惊世骇俗的“巨婴学说”,并且断定中国人大部分是“巨婴”,因此中