bzoj 4237: 稻草人 -- CDQ分治
4237: 稻草人
Time Limit: 40 Sec Memory Limit: 256 MB
Description
Input
Output
Sample Input
0 0
2 2
3 4
4 3
Sample Output
HINT

Source
先将x轴排序,然后CDQ分治,这样先保证左面x值一定小于右面
然后两边分别按y轴排序,然后去找合法解
我们可以左面维护x单调递增的栈,右面维护x单调递减的栈,这样对于左面的每一位在右面二分查找就好
- #include<map>
- #include<cmath>
- #include<queue>
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- using namespace std;
- #define inf 1000000007
- #define ll long long
- #define N 200010
- inline int rd()
- {
- int x=,f=;char ch=getchar();
- while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
- while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
- return x*f;
- }
- int n;
- ll ans;
- struct qaz{int x,y;}a[N],b[N];
- bool cmp(qaz a,qaz b){return a.x<b.x;}
- int q1[N],q2[N];
- int fd(int x,int l,int r)
- {
- int mid;
- while(l+<r)
- {
- mid=l+r>>;
- if(a[q2[mid]].y<x) l=mid;
- else r=mid;
- }
- return l;
- }
- void cdq(int l,int r)
- {
- if(l==r) return;
- int mid=l+r>>;
- cdq(l,mid);cdq(mid+,r);
- int i,j=l,t1=,t2=;
- for(i=mid+;i<=r;i++)
- {
- while(t1&&a[q1[t1]].x>a[i].x) t1--;
- q1[++t1]=i;
- for(;j<=mid&&a[j].y<a[i].y;j++)
- {
- while(t2&&a[q2[t2]].x<a[j].x) t2--;
- q2[++t2]=j;
- }
- ans+=t2-fd(a[q1[t1-]].y,,t2+);
- }
- for(i=l,t1=l,t2=mid+;i<=r;i++) b[i]=((t1<=mid&&a[t1].y<a[t2].y)||t2>r)?a[t1++]:a[t2++];
- for(i=l;i<=r;i++) a[i]=b[i];
- }
- int main()
- {
- n=rd();
- for(int i=;i<=n;i++) a[i].x=rd(),a[i].y=rd();
- sort(a+,a+n+,cmp);
- cdq(,n);
- printf("%lld\n",ans);
- return ;
- }
bzoj 4237: 稻草人 -- CDQ分治的更多相关文章
- bzoj 4237 稻草人 - CDQ分治 - 单调栈
题目传送门 传送点I 传送点II 题目大意 平面上有$n$个点.问存在多少个矩形使得只有左下角和右上角有点. 考虑枚举左下角这个点.然后看一下是个什么情况: 嗯对,是个单调栈.但不可能暴力去求每个点右 ...
- bzoj 4237 稻草人 CDQ
稻草人 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 1433 Solved: 626[Submit][Status][Discuss] Descr ...
- [BZOJ 3456]城市规划(cdq分治+FFT)
[BZOJ 3456]城市规划(cdq分治+FFT) 题面 求有标号n个点无向连通图数目. 分析 设\(f(i)\)表示\(i\)个点组成的无向连通图数量,\(g(i)\)表示\(i\)个点的图的数量 ...
- [BZOJ 2989]数列(CDQ 分治+曼哈顿距离与切比雪夫距离的转化)
[BZOJ 2989]数列(CDQ 分治) 题面 给定一个长度为n的正整数数列a[i]. 定义2个位置的graze值为两者位置差与数值差的和,即graze(x,y)=|x-y|+|a[x]-a[y]| ...
- ●BZOJ 4237 稻草人
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4237 题解: CDQ分治,单调栈 把所有点先按x从小到大排序,然后去CDQ分治y坐标. 在分 ...
- bzoj4237: 稻草人 cdq分治 单调栈
目录 题目链接 题解 代码 题目链接 bzoj4237: 稻草人 题解 暴力统计是n^2的 考虑统计一段区间对另一端的贡献 对于y值cdq分治,降调一维 对于当前两个分治区间统计上面那部分对下面那部分 ...
- bzoj 3262 陌上花开 - CDQ分治 - 树状数组
Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ...
- 【BZOJ4237】稻草人 cdq分治+单调栈+二分
[BZOJ4237]稻草人 Description JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田 ...
- 【BZOJ4237】 稻草人 CDQ分治+单调栈
## 题目描述 JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要满足以下 ...
随机推荐
- 【codeforces】【比赛题解】#940 CF Round #466 (Div. 2)
人生的大起大落莫过如此,下一场我一定要回紫. [A]Points on the line 题意: 一个直线上有\(n\)个点,要求去掉最少的点,使得最远两点距离不超过\(d\). 题解: 暴力两重fo ...
- shell系统检测->
系统状态检测脚本练习 1-> 查看磁盘状态 思路:查看磁盘/当前使用状态,如果使用率超过80%则报警发邮件 1.获取磁盘当前使用的值 df -h|grep /$ 2.从获取到的值中提取出,对应的 ...
- Spring Boot连接Mysql数据库问题解决
在spring Boot项目中使用mysql数据库进行数据库的增删查改,出现以下错误: Error starting ApplicationContext. To display the auto-c ...
- jpql和sql的区别
项目使用jpa规范 其中既可使用面对对象查询(jpql语句) 又可使用原生sql查询; 1.(经后期验证,jpql都可以) 其中有一个区别是: jpql查询字段为空: " cr.owner ...
- ZooKeeper的典型应用场景
<从Paxos到Zookeeper 分布式一致性原理与实践>读书笔记 本文:总结脑图地址:脑图 前言 所有的典型应用场景,都是利用了ZK的如下特性: 强一致性:在高并发情况下,能够保证节点 ...
- 利用sys.dm_db_index_physical_stats查看索引碎片等数据
我们都知道,提高sql server的数据查询速度,最有效的方法,就是为表创建索引,而索引在对数据进行新增,删除,修改的时候,会产生索引碎片,索引碎片多了,就需要重新组织或重新生成索引,以达到索引的最 ...
- 20155309 2016-2017-2《Java程序设计》课程总结
预备作业1http://www.cnblogs.com/nhx19970709/p/6155580.html 第一次写博客,也是第一次用Markdown,具体流程都还不是很熟悉 预备作业2http:/ ...
- java根据日期获取周几和获取某段时间内周几的日期
整理两个日期的方法. 根据日期获取当天是周几 /** * 根据日期获取当天是周几 * @param datetime 日期 * @return 周几 */ public static String d ...
- BFC 从了解到放弃
最近工作中我突然产生了一个想法,就如我们人类面临的终极问题一般,我从哪里来?我到哪里去?在撸代码进行CSS布局的时候,我会去想,我为什么这么做?,为什么浮动的元素要用overflow?,为什么要用cl ...
- apache camel 条件路由
<camelContext xmlns="http://camel.apache.org/schema/blueprint"> <route id="e ...