热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:bzoj4237:稻草人cdq分治单调栈

本文由编程笔记#小编为大家整理,主要介绍了bzoj4237:稻草人cdq分治单调栈相关的知识,希望对你有一定的参考价值。目录题目链
本文由编程笔记#小编为大家整理,主要介绍了bzoj4237: 稻草人 cdq分治 单调栈相关的知识,希望对你有一定的参考价值。


目录



  • 题目链接

  • 题解

  • 代码






题目链接

bzoj4237: 稻草人


题解

暴力统计是n^2的

考虑统计一段区间对另一端的贡献

对于y值cdq分治,降调一维

对于当前两个分治区间统计上面那部分对下面那部分的贡献

对当前两区间x排序后,对上部分维护单增单调栈,得到距离当前点最近的比她低的点p

对于下面的区间维护一个上凸壳 ,直接在凸壳上二分p统计答案


代码

#include
#include
#include
#include
#define gc getchar()
#define pc putchar
#define LL long long
inline int read() {
int x = 0,f = 1;
char c = gc;
while(c <&#39;0&#39; || c > &#39;9&#39;) c = gc;
while(c <= &#39;9&#39; && c >= &#39;0&#39;) x = x * 10 + c - &#39;0&#39;,c = gc;
return x * f;
}
void print(LL x) {
if(x <0) {
pc(&#39;-&#39;);
x = -x;
}
if(x >= 10) print(x / 10);
pc(x % 10 + &#39;0&#39;);
}
const int maxn = 200007;
struct Point {
int x,y;
} po[maxn];
int n;
bool cmpx(Point a,Point b) { return a.x bool cmpy(Point a,Point b) { return a.y int tp,tl;
int sk[maxn],sk2[maxn];
LL ans = 0;
void solve(int l = 1,int r = n) {
if(l == r) return ;
int mid = l + r >> 1;
std::sort(po + l,po + r + 1,cmpy);
std::sort(po + l,po + mid + 1,cmpx); //down
std::sort(po + mid + 1,po + r + 1,cmpx); //up
tp = tl = 0;
int p = l,L,R,to,miid,lim;
for(int i = mid + 1;i <= r;++ i) {
while(tp && po[sk[tp]].y >= po[i].y) tp --;
sk[++ tp] = i;

for(;p <= mid && po[p].x while(tl && po[sk2[tl]].y <= po[p].y) tl --;
sk2[++ tl] = p;
}

L = 1,R = tl;to = - 1;lim = po[sk[tp - 1]].x;
while(L <= R) {
miid = L + R >> 1;
if(po[sk2[miid]].x > lim) to = miid,R = miid - 1;
else L = miid + 1;
}
if(to != -1) ans += 1ll * tl - 1ll * to + 1;
}
solve(l,mid); solve(mid + 1,r);
}
int main() {
n = read();
for(int i = 1;i <= n;++ i) {
po[i].x = read(),po[i].y = read();
}
po[0].x = po[0].y = -1;
solve();
print(ans);
pc(&#39;
&#39;);
}

推荐阅读
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 文件描述符、文件句柄与打开文件之间的关联解析
    本文详细探讨了文件描述符、文件句柄和打开文件之间的关系,通过具体示例解释了它们在操作系统中的作用及其相互影响。 ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 本文探讨了 Objective-C 中的一些重要语法特性,包括 goto 语句、块(block)的使用、访问修饰符以及属性管理等。通过实例代码和详细解释,帮助开发者更好地理解和应用这些特性。 ... [详细]
  • 本文探讨了 C++ 中普通数组和标准库类型 vector 的初始化方法。普通数组具有固定长度,而 vector 是一种可扩展的容器,允许动态调整大小。文章详细介绍了不同初始化方式及其应用场景,并提供了代码示例以加深理解。 ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
  • 本文探讨了如何在模运算下高效计算组合数C(n, m),并详细介绍了乘法逆元的应用。通过扩展欧几里得算法求解乘法逆元,从而实现除法取余的计算。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • Splay Tree 区间操作优化
    本文详细介绍了使用Splay Tree进行区间操作的实现方法,包括插入、删除、修改、翻转和求和等操作。通过这些操作,可以高效地处理动态序列问题,并且代码实现具有一定的挑战性,有助于编程能力的提升。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 本实验主要探讨了二叉排序树(BST)的基本操作,包括创建、查找和删除节点。通过具体实例和代码实现,详细介绍了如何使用递归和非递归方法进行关键字查找,并展示了删除特定节点后的树结构变化。 ... [详细]
  • 本文详细介绍了C语言中链表的两种动态创建方法——头插法和尾插法,包括具体的实现代码和运行示例。通过这些内容,读者可以更好地理解和掌握链表的基本操作。 ... [详细]
author-avatar
手机用户2502922685
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有