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\)分治与其他分治最本质的 ...
随机推荐
- 数据库留言板例题:session和cookie区别
session和cookie区别: <?php session_start(); //session_start();必须写在所有的php代码前边 ?> <!DOCTYPE html ...
- JS实现页面回到顶部效果
[代码] <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...
- [LeetCode]题解(python):063-Unique path II
题目来源 https://leetcode.com/problems/unique-paths-ii/ Follow up for "Unique Paths": Now cons ...
- JS全局函数parseInt和parseFloat
1.parsetInt parseInt(string ,radix)解析一个字符串,并返回一个十进制的整数:该方法是将字符串转成十进制整数 console.log(parseInt("01 ...
- js- 千分位分割
// 千分位 console.log(split3str("123456789")) function splitByReg3(str) { var re = /(\d{1,3}) ...
- iOS工程如何支持64-bit
苹果在2014年10月20号发布了一条消息:从明年的二月一号开始,提交到App Store的应用必须支持64-bit.详细消息地址为:https://developer.apple.com/news/ ...
- Python-S13-day2-之购物车
Python-S13-day2 需求: 1.写一个购物小程序,用户开始先输入自己的工资,然后可以不断的买东西并加入购物车,如果钱不够了提示余额不足,用户中途可以选择查看自己购物车里面的商品,以及余额, ...
- 使用jQuery为表单添加回车事件
$(document).keypress(function(e){ if(e.which==13){ checkUserForm(); } });
- win2003下全自动快速安装php+mysql套件
导读:Windows 2003下一键快速安装PHP和MySql的安装包 场景:wind2003 32位 php5.2 1.下载php+mysql套件 地址1 http://pan.baidu.com/ ...
- APICloud全面支持WiFi真机同步和实时预览功能
APICloud工具插件包括APICloud Studio.Sublime Text和Webstorm全面为开发者提供iOS和Android平台真机同步调试功能,不仅可以通过USB方式进行APP真机同 ...