bzoj 4237稻草人
按x轴进行分治,将[l,r]分成[l,mid]和[mid+1,r],左下角点x值在[l,mid]中,右上角点x值在[mid+1,r],然后将[l,r]中的所有点按y轴排序,按顺序扫描,若扫描到左下角点,用一个单调栈维护,若扫描到右上角点,用另一个单调栈维护的同时,去维护左下角的单调栈中二分出答案,复杂度O(nlognlogn),程序跑的有点慢
代码
#include<cstdio>
#include<algorithm>
#include<set>
#define N 500010
using namespace std;
int n,i;
long long ans;
int top1,top2,stack1[N],stack2[N];
struct g{
int x,y;
}a[N];
bool cmp(g a,g b)
{
return a.x<b.x;
}
bool cmp1(g a,g b)
{
return a.y<b.y;
}
int ef(int x)
{
int l=,r=top1,m;
while (l<=r)
{
m=(l+r)>>;
if (x>a[stack1[m]].y) l=m+;else r=m-;
}
return r;
}
void solve(int L,int R,int l,int r)
{
int p,q;
if (L>=R) return;
if (l>=r) return;
int m=(L+R)>>;
int cnt=l,i;
int t;
for (i=l;i<=r;i++)
if (a[i].x<=m)
{
t=a[i].x;a[i].x=a[cnt].x;a[cnt].x=t;
t=a[i].y;a[i].y=a[cnt].y;a[cnt].y=t;
cnt++;
} if ((l<cnt)&&(cnt<=r))
{
sort(a+l,a+cnt,cmp1);
sort(a+cnt,a++r,cmp1); top1=;top2=;
p=l;q=cnt;
while ((p<cnt)||(q<=r))
{
if ((p==cnt)||((q<=r)&&(a[q].y<a[p].y)))
{
while ((top2)&&(a[q].x<a[stack2[top2]].x)) top2--;
ans+=ef(a[q].y)-ef(a[stack2[top2]].y);
top2++;stack2[top2]=q;q++;
}
else
{
while ((top1)&&(a[p].x>a[stack1[top1]].x)) top1--;
top1++;stack1[top1]=p;p++;
}
} }
/*
printf("%d %d\n",L,R);
printf("A:\n");
for (i=l;i<cnt;i++)
printf("%d %d\n",a[i].x,a[i].y);
printf("B:\n");
for (i=cnt;i<=r;i++)
printf("%d %d\n",a[i].x,a[i].y);
*/
solve(L,m,l,cnt-);
solve(m+,R,cnt,r);
}
int main()
{
scanf("%d",&n);
for (i=;i<=n;i++)
{
scanf("%d%d",&a[i].x,&a[i].y);
a[i].y++;
}
sort(a+,a++n,cmp);
for (i=;i<=n;i++)
a[i].x=i;
solve(,n,,n);
printf("%lld\n",ans);
}
bzoj 4237稻草人的更多相关文章
- bzoj 4237: 稻草人 -- CDQ分治
4237: 稻草人 Time Limit: 40 Sec Memory Limit: 256 MB Description JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行 ...
- bzoj 4237 稻草人 - CDQ分治 - 单调栈
题目传送门 传送点I 传送点II 题目大意 平面上有$n$个点.问存在多少个矩形使得只有左下角和右上角有点. 考虑枚举左下角这个点.然后看一下是个什么情况: 嗯对,是个单调栈.但不可能暴力去求每个点右 ...
- bzoj 4237: 稻草人
Description JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要 ...
- ●BZOJ 4237 稻草人
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4237 题解: CDQ分治,单调栈 把所有点先按x从小到大排序,然后去CDQ分治y坐标. 在分 ...
- bzoj 4237 稻草人 CDQ
稻草人 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 1433 Solved: 626[Submit][Status][Discuss] Descr ...
- 稻草人(bzoj 4237)
Description JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要 ...
- bzoj 4237 稻 草 人
bzoj 这个矩形有三个限制,分别是右上角点的横纵坐标分别大于左下角废话,并且中间区域没有点.那么可以先按横坐标排序,然后枚举左边的点和右边的点匹配.为了保证复杂度,这里每次把点集一分为二,先递归处理 ...
- BZOJ 4236~4247 题解
BZOJ 4236 JOIOJI f[i][0..2]表示前i个字符中′J′/′O′/′I′的个数 将二元组<f[i][0]−f[i][1],f[i][1]−f[i][2]>扔进map,记 ...
- $CDQ$分治总结
A.\(CDQ\) 分治 特别基础的教程略. \(CDQ\)分治的优缺点: ( 1 )优点:代码量少,常数极小,可以降低处理维数. ( 2 )缺点:必须离线处理. \(CDQ\)分治与其他分治最本质的 ...
随机推荐
- Ubuntu 14.04 LTS 64bit 编译SDL的问题
http://blog.csdn.net/jhting/article/details/38523945 Ubuntu 14.04 LTS 64bit 编译SDL的问题 分类: C/C++2014-0 ...
- Java程序设计的基本原则
Java程序设计的基本原则-1 1.面向对象 这是java编程里面大家公认的第一原则 2.优先使用对象组合而非类继承 3.分层 最典型的三层架构,表现层-->逻辑层-->数据层 表现层功能 ...
- 将对象转换成Dictionary 字典
/// <summary> /// /// 将对象属性转换为key-value对 /// </summary> /// <param name="o" ...
- linux下安装memcache以及开启memcache扩展
memcache 的工作就是在专门的机器的内存里维护一张巨大的hash表,来存储经常被读写的一些数组与文件,从而极大的提高网站的运行效率,减轻后端数据库的读写压力.在安装memcached之前需要安装 ...
- 使用bcrypt进行用户密码加密的简单实现
Bcrypt百度百科: bcrypt,是一个跨平台的文件加密工具.由它加密的文件可在所有支持的操作系统和处理器上进行转移.它的口令必须是8至56个字符,并将在内部被转化为448位的密钥. 除了对您的数 ...
- ios证书
内容提要: 安装app时提示 “无法下载应用,此时无法安装“XXX””.我遇到过多次是由于ios的app出现证书问题.本篇文章讲解用ios证书制作过程,以及每个步骤的解释. 正文: Xcode签名至少 ...
- Wall---hdu1348(求凸包周长 模板)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1348 求凸包周长+2*PI*L: #include <stdio.h> #include ...
- Android调用WCF
http://www.cnblogs.com/davidgu/archive/2012/05/16/2504182.html
- spring MVC的困惑--url-pattern的/和/*有区别
总是现象就是:spring用到forward("/WEB-INF/jsp/*.jsp")而forward当然是又要经过web.xml的映射的,然后,在URL匹配时,<url- ...
- Docker网络基础
大量的互联网应用服务包括多个服务组件,这往往需要多个容器之间通过网络通信进行相互配合. Docker目前提供了映射容器端口到宿主主机和容器互联机制来为容器提供网络服务. 端口映射实现访问容器: 在启动 ...