Bzoj4237:稻草人
题面
Sol
\(CDQ\)分治
先对\(x\)排序,对\(y\)在\(CDQ\)分治是从大到小排序
从大到小加入,右边用单调栈维护\(x\)递增,\(y\)递减的序列
左边就是找到\(x\)比它大,最小的\(y\)(树状数组解决)
再在右边找到最后一个小于这个\(y\)的位置,那么栈顶到这个位置都是答案
# include <bits/stdc++.h>
# define RG register
# define IL inline
# define Fill(a, b) memset(a, b, sizeof(a))
using namespace std;
typedef long long ll;
const int _(2e5 + 5);
IL ll Input(){
RG ll x = 0, z = 1; RG char c = getchar();
for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1;
for(; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
return x * z;
}
int n, bit[_];
ll ans;
struct Data{
int x, y, id;
IL bool operator <(RG Data B) const{
return x < B.x;
}
} q[_], p[_], S[_];
IL void Modify(RG int x, RG int d){
for(; x <= n; x += x & -x) bit[x] = min(bit[x], d);
}
IL void Clear(RG int x){
for(; x <= n; x += x & -x) bit[x] = bit[0];
}
IL int Query(RG int x){
RG int ret = bit[0];
for(; x; x -= x & -x) ret = min(ret, bit[x]);
return ret;
}
IL void CDQ(RG int l, RG int r){
if(l == r) return;
RG int mid = (l + r) >> 1;
CDQ(l, mid); CDQ(mid + 1, r);
for(RG int i = l, j = mid + 1, k = l; k <= r; ++k)
if(j > r || (i <= mid && p[i].y > p[j].y)) q[k] = p[i++];
else q[k] = p[j++];
for(RG int i = l; i <= r; ++i) p[i] = q[i];
RG int top = 0;
for(RG int i = l; i <= r; ++i)
if(p[i].id <= mid){
RG int v = Query(n - p[i].id + 1);
Modify(n - p[i].id + 1, p[i].y);
RG int ll = 1, rr = top, cnt = 0;
while(ll <= rr){
RG int mmid = (ll + rr) >> 1;
if(S[mmid].y < v) cnt = mmid, rr = mmid - 1;
else ll = mmid + 1;
}
if(cnt) ans += top - cnt + 1;
}
else{
while(top && S[top].x > p[i].x) --top;
S[++top] = p[i];
}
for(RG int i = l; i <= r; ++i)
if(p[i].id <= mid) Clear(n - p[i].id + 1);
}
int main(RG int argc, RG char* argv[]){
n = Input(); Fill(bit, 127);
for(RG int i = 1; i <= n; ++i) p[i].x = Input(), p[i].y = Input();
sort(p + 1, p + n + 1);
for(RG int i = 1; i <= n; ++i) p[i].id = i;
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]稻草人(CDQ分治)
先按y排序,二分,两边递归下去,然后处理下半部分对上半部分的贡献,即左下点在下半部分,右上点在上半部分的合法矩形个数. 两个部分均按x排序,枚举右上点p,则左下点需要满足: 1.横坐标大于上半部分纵坐 ...
- BZOJ4237 稻草人 【CDQ分治】
Description JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要 ...
- BZOJ4237 稻草人(分治+树状数组+单调栈)
如果要询问的某个纵坐标为inf的点左边是否有点能与其构成所要求的矩形,只要用个单调栈就可以了.可以想到用分治来制造单调性. 按横坐标排序,每次考虑跨过分治中心的矩形.考虑右边的每个点能与左边的哪些点构 ...
- BZOJ4237稻草人——单调栈+CDQ分治
题目描述 JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要满足以下条件: ...
- bzoj4237稻草人
题意:给你一个田地,问左下角和右上角有稻草人并且内部除了边界都没有稻草人的矩形数. 标程: #include<bits/stdc++.h> using namespace std; int ...
- bzoj4237 稻草人
我是萌萌的传送门 题意不难理解吧-- 一开始看到这道题的时候lrd告诉我这题要分治,还给我讲了讲分治要怎么写,好像是CDQ+树状数组来着--(好吧我已经忘了--)然而我第一眼看完题之后的思路是数据结构 ...
- bzoj4237 稻草人——分治
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4237 分治: 先把所有点按 y 排序,然后二分递归: 对于每个 mid ,计算经过它的矩形的 ...
随机推荐
- linux下LAMP环境的搭配
之前电脑上换了ubuntu16.04,本地需要重新配置,但是忘得一干二净,所以重新配置了一下,并再此记录一下. 安装apache: sudo apt-get install apache2 重启apa ...
- LVS结合keepalived配置测试
LVS/DR + keepalived配置 注意:前面虽然我们已经配置过一些操作,但是下面我们使用keepaliave操作和之前的操作是有些冲突的,所以若是之前配置过DR,请首先做如下操作: 三 ...
- 中小研发团队架构实践之应用监控Metrics
一.Metrics简介 应用监控系统Metrics由Metrics.NET+InfluxDB+Grafana组合而成,通过客户端Metrics.NET在业务代码中埋点,Metrics.N ...
- Pycharm 出现Unresolved reference '' 错误的解决方法
在用Pycharm做Pygame游戏小实战的时候碰到一个很无语的问题 如下 什么鬼?????? 我明明有写settings模块啊 而且还是放在同一个目录下 然后Pycharm给我来了一个错误 而且在 ...
- 一不小心把Mysql数据库的root的账号的权限给弄没啦,该怎么办
别急啊,现在只要你还能连接到Mysql,就问题不大! 首先,连接道Mysql,这里用Navicat进行讲解. 说明:root@localhost和root@127.0.0.1不是一个账号,也不是一回事 ...
- EmguCV创建/保存图片
Image图片类 public Image(Bitmap bmp);//采用 Bitmap 图像创建. public Image(string fileName);//指定路径创建图像. public ...
- UVALive - 4329 Ping pong 树状数组
这题不是一眼题,值得做. 思路: 假设第个选手作为裁判,定义表示在裁判左边的中的能力值小于他的人数,表示裁判右边的中的能力值小于他的人数,那么可以组织场比赛. 那么现在考虑如何求得和数组.根据的定义知 ...
- DOCKER 无法获取使用宿主机DNS 的原因,解决方法
今天在公司服务器上部署项目,遇到一个大坑.接口怎么请求都不同,宿主机DNS已经改了.宿主可以请求,找了半天,原来是DOCKER 没有获取到主机的DNS 进去DOCKER解析不了域名 指定DNS 启动也 ...
- JAVA多线程与并发学习总结
1. 计算机系统 使用高速缓存来作为内存与处理器之间的缓冲,将运算需要用到的数据复制到缓存中,让计算能快速进行:当运算结束后再从缓存同步回内存之中,这样处理器就无需等待缓慢的内存读写了. 缓 ...
- ubuntu网络设置及遇到问题
1.在ubuntu下面显示有线网络设备未托管 解决:在ubuntu下面输入:sudo gedit /etc/NetworkManager/nm-system-settings.conf然后将里面 ...