bzoj4237】的更多相关文章

[BZOJ4237]稻草人(CDQ分治,单调栈) 题面 BZOJ 题解 \(CDQ\)分治好题呀 假设固定一个左下角的点 那么,我们可以找到的右下角长什么样子??? 发现什么? 在右侧是一个单调递减的东西 那么,对于每一个已经固定好的左下角 我们可以通过单调栈来维护答案 既然只有左下角对右上角会产生贡献 那么,按照\(x\)轴排序之后可以\(CDQ\)分治 \(CDQ\)分治怎么搞? 如果在上面的基础上多了几个点.. 那几根棕色的线链接的连是不能贡献答案的 我们来看看: 这些点的\(y\)轴都在…
原文链接https://www.cnblogs.com/zhouzhendong/p/8682572.html 题目传送门 - BZOJ4237 题意 平面上有$n(n\leq 2\times 10^5)$个整点(坐标范围在$[0,10^9]$之间). 第$i$个点$p_i$的坐标是$(x_i,y_i)$. 如果有一对点$p_i$和$p_j$,满足$x_i<x_j,y_i<y_j$,而且以这两个点为左下角和右上角所围城的矩形内不包含任何整点(边界上面不算),那么他们对答案的贡献为1. 求答案.…
目录 题目链接 题解 代码 题目链接 bzoj4237: 稻草人 题解 暴力统计是n^2的 考虑统计一段区间对另一端的贡献 对于y值cdq分治,降调一维 对于当前两个分治区间统计上面那部分对下面那部分的贡献 对当前两区间x排序后,对上部分维护单增单调栈,得到距离当前点最近的比她低的点p 对于下面的区间维护一个上凸壳 ,直接在凸壳上二分p统计答案 代码 #include<set> #include<cstdio> #include<cstring> #include<…
[BZOJ4237]稻草人/[JOISC2014]かかし 题目大意: 平面上\(n(n\le2\times10^5)\)个点,若一个矩形各边与坐标轴平行,左下角和右上角都在\(n\)个点之中,且内部不包含其它的点,则这个矩形是合法的.问给定的点中包含多少合法的矩形? 思路: 将点按照\(x\)排序,使用CDQ分治.分治的两边分别按照\(y\)排序,左右两遍分别维护一个单调栈.左边的单调栈按照\(x\)单调递减,右边的单调栈按照\(x\)单调递增.右边的栈中的点作为右上角,用树状数组维护左边的单调…
先按y排序,二分,两边递归下去,然后处理下半部分对上半部分的贡献,即左下点在下半部分,右上点在上半部分的合法矩形个数. 两个部分均按x排序,枚举右上点p,则左下点需要满足: 1.横坐标大于上半部分纵坐标比p小的点的最大横坐标k. 2.不存在下半部分点满足纵坐标在两点之间,横坐标也在两点之间. 这样,我们对上半部分维护一个纵坐标单减的单调栈,下半部分维护纵坐标单增的单调栈. 每次枚举p时,将下半部分所有横坐标小于p的点加入栈中,再在栈中二分k即可. #include<cstdio> #inclu…
如果要询问的某个纵坐标为inf的点左边是否有点能与其构成所要求的矩形,只要用个单调栈就可以了.可以想到用分治来制造单调性. 按横坐标排序,每次考虑跨过分治中心的矩形.考虑右边的每个点能与左边的哪些点构成矩形.首先这受到右边点的限制,对于每个点用set求出这个范围.然后对所有点按纵坐标从大到小排序,维护一个树状数组,如果是右边的点直接在树状数组上的该范围查询,左边的点则将其加入单调栈并在树状数组上修改. 常数过大,在darkbzoj上跑了30s,bzoj上T掉了. #include<iostrea…
[BZOJ4237]稻草人 Description JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要满足以下条件: 田地的形状是边平行于坐标轴的长方形: 左下角和右上角各有一个稻草人: 田地的内部(不包括边界)没有稻草人. 给出每个稻草人的坐标,请你求出有多少遵从启示的田地的个数 Input 第一行一个正整数N,代表稻草人的个数 接下来N行,第i行(1<=i<=N)包…
我是萌萌的传送门 题意不难理解吧-- 一开始看到这道题的时候lrd告诉我这题要分治,还给我讲了讲分治要怎么写,好像是CDQ+树状数组来着--(好吧我已经忘了--)然而我第一眼看完题之后的思路是数据结构直接搞,本着"我就不信这个邪了"的念头,就搞出了这么一个树状数组套平衡树维护斜线的奇葩写法. 话说lrd说这题卡常,然而限时40s,我23.8s并没有什么压力,不过运行速度倒数也是感人肺腑-- (我后面就这么几个了--数据结构果然比不上CDQ--QAQ) 言归正传. 如果不用分治的话就需要…
题面 传送门 Sol \(CDQ\)分治 先对\(x\)排序,对\(y\)在\(CDQ\)分治是从大到小排序 从大到小加入,右边用单调栈维护\(x\)递增,\(y\)递减的序列 左边就是找到\(x\)比它大,最小的\(y\)(树状数组解决) 再在右边找到最后一个小于这个\(y\)的位置,那么栈顶到这个位置都是答案 # include <bits/stdc++.h> # define RG register # define IL inline # define Fill(a, b) memse…
传送门 题意:给出平面上$N$个点,求满足以下两个条件的矩形:①左下角与右上角各有一个点:②矩形内部没有点.$N \leq 2 \times 10^5$,所有数字大于等于$0$,保证坐标两两不同 最开始想到的是类似于楼房重建的算法,然后打炸了qwq 在多维问题上考虑分治可以降低一维限制,很多时候都会用到(比如三维偏序). 我们先对$y$值从小到大排序,在分治内部对$x$值从小到大排序,然后考虑左边一半对右边的贡献. 可以知道对于左边一半的两个点$a,b(a<b)$,如果$y_a<y_b$,那么…