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\)分治与其他分治最本质的 ...
随机推荐
- Bootstrap 辅组类和响应式工具
1.情景文本颜色 //各种色调的字体 <p class="text-muted">Bootstrap 视频教程</p> <p class=" ...
- TCP的三次握手四次挥手
一.三次握手 1.wireshark 抓包 2.TCP报文手部 注意标志位: 1).同步 SYN = 1 表示这是一个连接请求或连接接受报文. 2).只有当 ACK = 1 时确认号字段才有效.当 A ...
- Qt 之 设置窗口边框的圆角(使用QSS和PaintEvent两种方法)
Qt在设置窗口边框圆角时有两种方式,一种是设置样式,另一种是在paintEvent事件中绘制窗口.下面分别叙述用这两种方式来实现窗口边框圆角的效果. 一.使用setStyleSheet方法 this- ...
- Qt 窗口属性简介之Qt::WA_DeleteOnClose
一.简述 今天介绍一个简单的窗口属性——Qt::WA_DeleteOnClose. 在正常创建窗口后,我们一般会调用close()方法来关闭窗口,这里我们看一下Q助手中关于close()方法的介绍. ...
- MVVM with ReactiveCocoa
内容提要: 本文首先对比MVC简单介绍了MVVM的概念和优点,其次,简单介绍了Reactive Cocoa的使用,最后,通过一个例子介绍了使用Reactive Cocoa的MVVM框架. 正文: 首先 ...
- Asp.net mvc + .net ef database first 或 model first 时如何添加验证特性
今天有个同事问到,在使用Entity Framework 的Database frist或model first时,怎么在model上添加验证的特性? 因为此时的Model是是VS 工具怎么生成的,直 ...
- httpd.conf
修改配置文件-时会弹出一个文本式的文件 1.搜索:#LoadModule rewrite_module modules/mod_rewrite.so,去掉前面的# 2.全部替换AllowOverrid ...
- error = Error Domain=NSCocoaErrorDomain Code=3840
json解析,同样的请求,有一个请求,无反应.纠结了几天,终于解决了. error = Error Domain=NSCocoaErrorDomain Code=3840 "Unescape ...
- js获取网站根目录
//js获取网站根路径(站点及虚拟目录),获得网站的根目录或虚拟目录的根地址 function getRootPath(){ var strFullPath=window ...
- visual studio2013 添加 dll库
在visual studio2013中添加C#的dll库.记录如下: 在solution explorer处右键,选择reference--> add References 选择Browser. ...