浅谈\(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. linux性能调分析及调优

    转:https://blog.csdn.net/luokehua789789/article/details/53007456 Linux 性能分析以及调优介绍 写在前面:计算机要解决的基本问题之一是 ...

  2. python的对象类型-----列表&元组&字典

    列表: #定义列表 l=[1,'a',[3,4]] #l=list([1,'a',[3,4]]) #取值 print(l[0]) print(l[2][0]) l=[1,2,[['a','b'],'c ...

  3. Hadoop单机搭建

    单机Hadoop搭建 1.下载hadoop-2.7.3.tar.gz http://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-2.7.3/h ...

  4. OLTP和OLAP浅析

    数据库设计的一个根基就是要弄清楚数据库的类型.   当今的数据处理大致可以分成两大类:联机事务处理OLTP(on-line transaction processing在线事务处理,联机事务处理).联 ...

  5. java resources 红叉 Cannot change version of project facet Dynamic Web Module to 2.5

    在使用maven导入项目的时候,markers提示Cannot change version of project facet Dynamic Web Module to 2.5,不能将工程转换为2. ...

  6. 去除带有iframe页面中的2个滚动条[转]

    方法一:加载frame时修改高度 <div>    <iframe id="frame_content" name="frame_content&quo ...

  7. oracle 计算时间差

    1.计算时间差(相隔星期,天数,小时,分钟,秒) SELECT TO_CHAR(date1,'MMDDYYYY:HH24:MI:SS') date1, TO_CHAR(date2,'MMDDYYYY: ...

  8. word导出失败问题

    1.问题分析: 求职者在线填写招聘简历,人事hr下载简历无法打开,报错如下: 对于”根据架构,xml数据无效”,是因为没有成功生产xml,内部代码里还包含word无法识别的代码块,所以无法打开,通过用 ...

  9. nginx根据项目名实现内网地址转发

    nginx根据访问的项目名进行内网地址转发 以下是nginx的配置信息: server { listen 8081; server_name localhost; #charset koi8-r; # ...

  10. Codeforces Beta Round #27 (Codeforces format, Div. 2) E. Number With The Given Amount Of Divisors 反素数

    E. Number With The Given Amount Of Divisors time limit per test 2 seconds memory limit per test 256 ...