浅谈\(K-D\) \(Tree\)

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

莫队加\(kd\) \(tree\),直接用链加的方式动态删除和插入某个点,对于每个点维护子树内\(cnt\)。加上剪枝复杂度较为优越。

时间复杂度:\(O(mn)\)+剪枝

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

代码如下:

#include <cmath>
#include <cstdio>
#include <algorithm>
using namespace std;
#define bo11 p[u].mx[0]<X1||p[u].mn[0]>X2
#define bo12 p[u].mx[1]<Y1||p[u].mn[1]>Y2
#define bo21 X1<=p[u].mn[0]&&p[u].mx[0]<=X2
#define bo22 Y1<=p[u].mn[1]&&p[u].mx[1]<=Y2
#define bo31 X1<=p[u].c[0]&&p[u].c[0]<=X2
#define bo32 Y1<=p[u].c[1]&&p[u].c[1]<=Y2 const int maxn=2e5+5,inf=2e9; struct data {int x,y;}a[maxn];
int bel[maxn],node[maxn],ans[maxn];
int n,m,d,block,pps,res,sum,X1,X2,Y1,Y2; 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 query {
int l,r,id; bool operator<(const query &a)const {
if(bel[l]!=bel[a.l])return bel[l]<bel[a.l];
return bel[l]&1?r<a.r:r>a.r;
}
}q[10005]; struct kd_tree {
int root;
int bo[maxn];
int son[maxn][2];
int fa[maxn],cnt[maxn]; struct point {
int id;
int c[2],mn[2],mx[2]; bool operator<(const point &a)const {
return c[pps]<a.c[pps];
}
}p[maxn]; int build(int l,int r,int cmp) {
int mid=(l+r)>>1,u=mid;pps=cmp;
nth_element(p+l,p+mid,p+r+1);
node[p[u].id]=u;
if(l<mid)fa[son[u][0]=build(l,mid-1,cmp^1)]=u;
if(r>mid)fa[son[u][1]=build(mid+1,r,cmp^1)]=u;
int ls=son[u][0],rs=son[u][1];
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() {
for(int i=1;i<=n;i++) {
p[i].c[0]=a[i].x,p[i].c[1]=a[i].y,bo[i]=0;
p[i].id=i,son[i][0]=son[i][1]=fa[i]=cnt[i]=0;
}
root=build(1,n,0);
} void add(int u,int v) {bo[u]+=v;while(u)cnt[u]+=v,u=fa[u];} void query(int u) {
if(!cnt[u]||bo11||bo12)return;
if(bo21&&bo22) {sum+=cnt[u];return;}
if(bo31&&bo32)sum+=bo[u];
if(son[u][0])query(son[u][0]);
if(son[u][1])query(son[u][1]);
}
}T; void change(int pos,int v) {
if(v==-1)T.add(node[pos],v);
X1=a[pos].x-d,X2=a[pos].x+d;
Y1=a[pos].y-d,Y2=a[pos].y+d;
sum=0,T.query(T.root),res+=v*sum;
if(v==1)T.add(node[pos],v);
} int main() {
int Case=0;
T.p[0].mn[0]=T.p[0].mn[1]=inf;
T.p[0].mx[0]=T.p[0].mx[1]=-inf;
while(~scanf("%d%d%d",&n,&d,&m)) {
res=0,block=sqrt(n);
printf("Case %d:\n",++Case);
for(int i=1;i<=n;i++) {
bel[i]=(i-1)/block+1;
int x=read(),y=read();
a[i].x=x+y,a[i].y=x-y;
}
T.prepare();
for(int i=1;i<=m;i++)
q[i].l=read(),q[i].r=read(),q[i].id=i;
sort(q+1,q+m+1);
int l=1,r=0;
for(int i=1;i<=m;i++) {
while(l<q[i].l)change(l++,-1);
while(l>q[i].l)change(--l,1);
while(r<q[i].r)change(++r,1);
while(r>q[i].r)change(r--,-1);
ans[q[i].id]=res;
}
for(int i=1;i<=m;i++)
printf("%d\n",ans[i]);
}
return 0;
}

BZOJ4255:Keep Fit!的更多相关文章

  1. 转:如何实现一个malloc

    如何实现一个malloc 转载后排版效果很差,看原文!   任何一个用过或学过C的人对malloc都不会陌生.大家都知道malloc可以分配一段连续的内存空间,并且在不再使用时可以通过free释放掉. ...

  2. fitnesse 中各类fit fixture的python实现

    虽然网上都说slim效率很高,无奈找不到支持python的方法,继续用pyfit 1 Column Fixture 特点:行表格展现形式,一条测试用例对应一行数据 Wiki !define COMMA ...

  3. 深度学习:Keras入门(一)之基础篇

    1.关于Keras 1)简介 Keras是由纯python编写的基于theano/tensorflow的深度学习框架. Keras是一个高层神经网络API,支持快速实验,能够把你的idea迅速转换为结 ...

  4. 深度学习框架: Keras官方中文版文档正式发布

    今年 1 月 12 日,Keras 作者 François Chollet‏ 在推特上表示因为中文读者的广泛关注,他已经在 GitHub 上展开了一个 Keras 中文文档项目.而昨日,Françoi ...

  5. scipy.stats与统计学:4个概率分布:N,chi2,F,t

    scipy.stats与统计学:4个概率分布:N,chi2,F,t   四个常用分布的概率密度函数.分布函数.期望.分位数.以及期望方差标准差中位数原点矩: 1,正态分布: from scipy.st ...

  6. 机器学习 第四篇:OLS回归分析

    变量之间存在着相关关系,比如,人的身高和体重之间存在着关系,一般来说,人高一些,体重要重一些,身高和体重之间存在的是不确定性的相关关系.回归分析是研究相关关系的一种数学工具,它能帮助我们从一个变量的取 ...

  7. 跟 Google 学 machineLearning [2] -- 关于 classifier.fit 的 warning

    tensorfllow 的进化有点快.学习的很多例子已经很快的过时了,这里记录一些久的例子里被淘汰的方法,供后面参考. 我系统现在安装的是 tensorflow 1.4.1. 主要是使用了下面的代码后 ...

  8. Decision_function:scores,predict以及其他

    机器学习的评估 PR曲线用于positive类数据占比比较小,或者你更加在意false postion(相比于false negative):其他情况采用ROC曲线:比如Demo中手写体5的判断,因为 ...

  9. 基于R语言的结构方程:lavaan简明教程 [中文翻译版]

    lavaan简明教程 [中文翻译版] 译者注:此文档原作者为比利时Ghent大学的Yves Rosseel博士,lavaan亦为其开发,完全开源.免费.我在学习的时候顺手翻译了一下,向Yves的开源精 ...

随机推荐

  1. Python自然语言处理 - 系列三

    有监督分类过程 ![enter image description here][1]例子:涉及一个特征器,给定一个姓名分析出是男性名字还是女性名字 分析:男性和女性的名字有一些鲜明的特点.以a,e 和 ...

  2. C语言math.h库函数中atan与atan2的区别

    源: C语言math.h库函数中atan与atan2的区别 C语言中的atan和atan2

  3. springboot中Controller没有被扫描

    今天给客户开发登陆的密码加密需求,研究一下想,需要在本地搭一套环境,前台用js实现RAS加密,后台使用java解密.本是一套非常简单的环境,看最近springboot比较常用,所以想要搭一下sprin ...

  4. Python字符串格式转换

    转换类型 转换类型 说明 d, i 带符号十进制 b 无符号二进制 o 无符号八进制 u 无符号十进制 x 无符号十六进制(小写) X 无符号十六进制(大写) e 科学计数法表示的浮点数(小写) E ...

  5. 关于v4l2的一点变更

    先打个连接 http://linuxtv.org/downloads/presentations/media_ws_2013/v4l2-multi-format.pdf 2013年linux 多媒体构 ...

  6. Spring的AOP面向切面编程

    什么是AOP? 1.AOP概念介绍 所谓AOP,即Aspect orientied program,就是面向方面(切面)的编程. 功能: 让关注点代码与业务代码分离! 关注点: 重复代码就叫做关注点: ...

  7. 亚马逊chime启用新顶级.aws域名后缀

    自2013年12月亚马逊AWS公有云服务落地中国,亚马逊AWS在中国市场展开了一系列的活动,激发了国内开发者对亚马逊AWS云平台的热情. chime是亚马逊为客户提供视频会议领域的服务,而.aws是由 ...

  8. 利用Xshell从windows上传文件到linux

    1.首先,打开你的xshell客户端. 2.我用的是ubuntu 所以用 apt-get install lrzsz 命令来安装这个上传软件. 安装成功以后,可以使用rz上传,sz下载. 然后等待上传 ...

  9. QT 文本html显示格式的问题,如在QTextBrowser.setText用tr(),其中为html格式

    QObject::tr("<h1><font color = green>%1</font>的人品指数:<font color = orange&g ...

  10. php环境之Wampserver端口修改

    WampServer是一款由法国人开发的Apache Web服务器.PHP解释器以及MySQL数据库的整合软件包.免去了开发人员将时间花费在繁琐的配置环境过程,从而腾出更多精力去做开发.WampSer ...