浅谈\(K-D\ Tree\):https://www.cnblogs.com/AKMer/p/10387266.html

题目传送门:https://lydsy.com/JudgeOnline/problem.php?id=4130

这题跟\(BZOJ4358:permu\)一样。

不过我们需要把区间包含某个点改成判断区间是否有交点。

假设我们有俩区间\([l,r]\)与\([L,R]\)

假设俩不相交则满足:\(r<L||l>R\);

假设有交:\(l<=R\)且\(L<=r\)

我们把询问区间当做点,把序列区间一个一个往\(K-D\)树里面搞。

那么就可以看做是把正交包围盒\([1,R][L,inf]\)。所以判断相交或者不相交就直接变成正交包围盒范围查询了。

判断不交的时候用大区间\([mn[0],mx[1]]\),判断相交的时候用小区间\([mx[0],mn[1]]\)。由于卡常需求比较高,我就把\(struct\)改成\(namespace\)了。

时间复杂度:\(O(n\sqrt{n})\)

空间复杂度:\(O(n)\)

代码如下:

#include <cstdio>
#include <algorithm>
using namespace std;const int maxn=5e4+5,maxm=2e5+5,inf=2e9;int ans[maxm];
int n,m,pps,X1,X2,Y1,Y2,L,R;int read() {int x=0,f=1;char ch=getchar();for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';return x*f;
}struct Kangaroos {int l,r;}a[maxn];namespace T {int root;bool bo[maxm];int cnt[maxm],hismx[maxm];int add[maxm],cov[maxm],hiscov[maxm];struct point {int id,ls,rs;int c[2],mn[2],mx[2];bool operator<(const point &a)const {return c[pps]<a.c[pps];}}p[maxm];int build(int l,int r,int d) {int mid=(l+r)>>1,u=mid;pps=d;nth_element(p+l,p+mid,p+r+1);if(l<mid)p[u].ls=build(l,mid-1,d^1);if(r>mid)p[u].rs=build(mid+1,r,d^1);int ls=p[u].ls,rs=p[u].rs;for(int i=0;i<2;i++) {int mn=min(p[ls].mn[i],p[rs].mn[i]);p[u].mn[i]=min(p[u].c[i],mn);int mx=max(p[ls].mx[i],p[rs].mx[i]);p[u].mx[i]=max(p[u].c[i],mx);}return u;}void prepare() {p[0].mn[0]=p[0].mn[1]=inf;p[0].mx[0]=p[0].mx[1]=-inf;for(int i=1;i<=m;i++)p[i].c[0]=read(),p[i].c[1]=read(),p[i].id=i;root=build(1,m,0);}void cov_tag(int u) {if(!bo[u])bo[u]=1,hiscov[u]=0;cnt[u]=cov[u]=0;}void add_tag(int u,int v) {if(!bo[u])add[u]+=v;else cov[u]+=v,hiscov[u]=max(hiscov[u],cov[u]);cnt[u]+=v,hismx[u]=max(hismx[u],cnt[u]);}void solve(int u,int v,int hisv) {bo[u]=1,hiscov[u]=max(hiscov[u],hisv);cnt[u]=cov[u]=v;hismx[u]=max(hismx[u],hiscov[u]);}void push_down(int u) {if(add[u]) {if(p[u].ls)add_tag(p[u].ls,add[u]);if(p[u].rs)add_tag(p[u].rs,add[u]);add[u]=0;}if(bo[u]) {if(p[u].ls)solve(p[u].ls,cov[u],hiscov[u]);if(p[u].rs)solve(p[u].rs,cov[u],hiscov[u]);bo[u]=0;}}void change(int u) {if(R<p[u].mn[0]||L>p[u].mx[1]) {cov_tag(u);return;}if(L<=p[u].mn[1]&&p[u].mx[0]<=R) {add_tag(u,1);return;}push_down(u);if(p[u].c[1]<L||p[u].c[0]>R)cnt[u]=0;else cnt[u]++,hismx[u]=max(hismx[u],cnt[u]);if(p[u].ls)change(p[u].ls);if(p[u].rs)change(p[u].rs);}void make_ans(int u) {ans[p[u].id]=hismx[u];push_down(u);if(p[u].ls)make_ans(p[u].ls);if(p[u].rs)make_ans(p[u].rs);}
}int main() {n=read(),m=read();for(int i=1;i<=n;i++)a[i].l=read(),a[i].r=read();T::prepare();for(int i=1;i<=n;i++) {L=a[i].l,R=a[i].r;T::change(T::root);}T::make_ans(T::root);for(int i=1;i<=m;i++)printf("%d\n",ans[i]);return 0;
}

转载于:https://www.cnblogs.com/AKMer/p/10404964.html

BZOJ4130:[PA2011]Kangaroos相关推荐

  1. 【莫队/树上莫队/回滚莫队】原理详解及例题:小B的询问(普通莫队),Count on a tree II(树上莫队),kangaroos(回滚莫队)

    文章目录 问题引入 介绍莫队算法及其实现过程 时间复杂度 莫队算法适用范围 莫队奇偶优化 普通莫队:小B的询问 树上莫队:SP10707 COT2 - Count on a tree II 回滚莫队: ...

  2. 大数据技术之_19_Spark学习_07_Spark 性能调优 + 数据倾斜调优 + 运行资源调优 + 程序开发调优 + Shuffle 调优 + GC 调优 + Spark 企业应用案例

    大数据技术之_19_Spark学习_07 第1章 Spark 性能优化 1.1 调优基本原则 1.1.1 基本概念和原则 1.1.2 性能监控方式 1.1.3 调优要点 1.2 数据倾斜优化 1.2. ...

  3. golang大厂面试2

    golang大厂面试 滴滴 写个二分查找 以下是一个简单的二分查找算法的 Go 语言实现: package mainimport "fmt"// 二分查找函数 func binar ...

  4. InstallShield内部库函数

    InstallShield内部库函数 下载资源:点击 1  库函数综述 InstallShield包含300多个内部库函数,用户可在安装脚本中调用它们来创建程序组,操作文件夹,处理目录,监督安装状态, ...

  5. 【BZOJ3073】[Pa2011]Journeys 线段树+堆优化Dijkstra

    [BZOJ3073][Pa2011]Journeys Description Seter建造了一个很大的星球,他准备建造N个国家和无数双向道路.N个国家很快建造好了,用1..N编号,但是他发现道路实在 ...

  6. BZOJ3073: [Pa2011]Journeys

    题解: 暴力建图当然gg 我们考虑用线段树分块建图的思想 因为涉及到两个区间 对着建图 一个线段树不够 考虑用两个线段树 一个作为出树(出树儿子向父亲连边) 一个作为入树(父亲向儿子连边) 每次出树向 ...

  7. Alex Woodie:2019大数据预测

    "The future isn't what it used to be" the French poet Paul Valery wrote nine decades ago. ...

  8. 《薄冰实用英语语法详解》连载之一:名词

    第一章.名词的数 1. 名词复数的规则变化形式 词尾字母 变化方式 例 词 通常情况 加-s bird-birds, shop-shops, lake-lakes -ch,-sh,-s,-x,-z 加 ...

  9. 【观世界】百家争鸣:全球2019大数据预测

    90年前,法国诗人保罗·瓦勒里(Paul Valery)曾写道:"明日非同往昔."对于始于20世纪中期的大数据趋势来说,这句话同样适用.如今的我们并不像多数人曾经设想的那样,但在很 ...

  10. 4 AI基础:超越经典搜索算法

    文章目录 4.1 Classical Search 经典搜索 4.2 Local Search Algorithms(局部搜索算法) Basic idea: Methods of Local Sear ...

最新文章

  1. Shell编程中Shift的用法
  2. 使用UrlRewrite时修改form的action属性问题
  3. 关于Class之深入Class
  4. Linux日志查看head与tail配合查看区间行数的内容
  5. java——HashMap的实现原理,自己实现简单的HashMap
  6. SAP Fiori Elements 公开课第二单元视频的台词和课程主要内容
  7. DBCHM-最简单、实用的数据库表列批注维护工具
  8. P1020 [NOIP1999 普及组] 导弹拦截 Dilworth定理 + dp
  9. java编程软件安装
  10. C语言读取文件内容创建二叉树
  11. 为什么Redis 单线程却能支撑高并发?
  12. 2022 年 GIS 就业状况
  13. [LeetCode][算法初级][数组] 30 有效的数独
  14. 这些联盟可以去注册试一下
  15. 2021.1.15——星露谷作物计算器的小改进
  16. 正方教务管理系统后台敏感日志查看漏洞
  17. java web设置首页_java web设置默认首页方法
  18. 第三章第三节、他是一个箍桶匠
  19. 嵌入式的我们需要学习一下ROS吗?
  20. Android Framework 窗口子系统 (08)窗口动画之动画系统框架

热门文章

  1. linux磁盘连接方式,LaCie 最新的外接硬盘以 USB-C 作为连接方式
  2. SQL Server医疗信息管理系统数据库【英文版-源码】--(Medical Management System Database)
  3. 一图囊括所有ES6知识点结构
  4. 引用提高 提高 啦啦啦啦啦啦啦啦啦啦了
  5. 1044 火星数字(C语言)
  6. 如何在Windows 10上禁用登录屏幕的背景模糊
  7. 统一接口平台(一) 产品介绍
  8. Android之传感器(三)方向传感器
  9. w ndows10图标,win10桌面图标变白怎么解决
  10. oracle 会话数上不去_(一)UDS诊断服务中的诊断会话控制(DiagnosticSessionControl,0x10)...