传送门

大意:

向三维空间中加点,询问一个三维区间中点的个数。

解题思路:

带修改CDQ,将修改和询问一起插入CDQ分治询问。

(询问可以由8个前缀和加减操作实现)

其中第一层CDQ维护x有序。

第二层CDQ维护y有序并且将z离线处理完更新答案。

注意要将原数组的辅助数组推入第二层CDQ否则会将顺序毁坏。

代码:

 #include<cstdio>
#include<cstring>
#include<algorithm>
const int N=;
const int M=;
struct data{
int t;
int x;
int y;
int tz;
int z;
int c;
bool left;
}d[N],o[N],tmp[N],stdata;
int n,T;
int cnt;
int tot;
int ans[N];
int sek[N];
int line[M];
bool cmpz(data a,data b){return a.tz<b.tz;}
bool cmpb(data a,data b){return a.t<b.t;}
int lowbit(int x){return x&(-x);}
void update(int pos,int v)
{
while(pos<=tot)
{
line[pos]+=v;
pos+=lowbit(pos);
}
return ;
}
int query(int pos)
{
int ans=;
while(pos)
{
ans+=line[pos];
pos-=lowbit(pos);
}
return ans;
}
void Get(void)
{
tot=;
std::sort(d+,d+cnt+,cmpz);
d[].z=;
for(int i=;i<=cnt;i++)
{
if(d[i].tz!=d[i-].tz)
tot++;
d[i].z=tot;
}
std::sort(d+,d+cnt+,cmpb);
return ;
}
void cdq(int l,int r)
{
if(l==r)
return ;
int mid=(l+r)>>;
cdq(l,mid);
cdq(mid+,r);
int j=l;
for(int i=mid+;i<=r;i++)
{
for(;j<=mid&&o[j].y<=o[i].y;j++)
if(!o[j].c&&o[j].left)
update(o[j].z,);
if(o[i].left)
continue;
ans[o[i].t]+=o[i].c*query(o[i].z);
}
for(int i=l;i<j;i++)
if(!o[i].c&&o[i].left)
update(o[i].z,-);
int sta1=l,sta2=mid+;
for(int i=l;i<=r;i++)
if(sta1<=mid&&(sta2>r||o[sta1].y<=o[sta2].y))
tmp[i]=o[sta1++];
else
tmp[i]=o[sta2++];
for(int i=l;i<=r;i++)
o[i]=tmp[i];
return ;
}
void CDQ(int l,int r)
{
if(l==r)
return ;
int mid=(l+r)>>;
CDQ(l,mid);
CDQ(mid+,r);
for(int i=l;i<=r;i++)
d[i].left=(i<=mid);
int sta1=l,sta2=mid+;
for(int i=l;i<=r;i++)
if(sta1<=mid&&(sta2>r||d[sta1].x<=d[sta2].x))
o[i]=d[sta1++];
else
o[i]=d[sta2++];
for(int i=l;i<=r;i++)
d[i]=o[i];
cdq(l,r);
for(int i=l;i<=r;i++)
d[i].left=false;
return ;
}
int main()
{
//freopen("a.in","r",stdin);
scanf("%d",&T);
while(T--)
{
for(int i=;i<=n;i++)
ans[i]=;
for(int i=;i<=cnt;i++)
d[i]=tmp[i]=stdata;
cnt=n=;
scanf("%d",&n);
for(int i=;i<=n;i++)
{
int cmd;
scanf("%d",&cmd);
sek[i]=cmd;
if(cmd==)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
d[++cnt]=(data){i,x,y,z,,,};
}else{
int ax,ay,az,bx,by,bz;
scanf("%d%d%d%d%d%d",&ax,&ay,&az,&bx,&by,&bz);
if(ax>bx)
std::swap(ax,bx);
if(ay>by)
std::swap(ay,by);
if(az>bz)
std::swap(az,bz);
ax--,ay--,az--;
d[++cnt]=(data){i,ax,ay,az,,-,};
d[++cnt]=(data){i,ax,ay,bz,,,};
d[++cnt]=(data){i,ax,by,az,,,};
d[++cnt]=(data){i,bx,ay,az,,,};
d[++cnt]=(data){i,ax,by,bz,,-,};
d[++cnt]=(data){i,bx,ay,bz,,-,};
d[++cnt]=(data){i,bx,by,az,,-,};
d[++cnt]=(data){i,bx,by,bz,,,};
}
} Get();
CDQ(,cnt);
for(int i=;i<=n;i++)
if(sek[i]==)
printf("%d\n",ans[i]);
}
return ;
}

HDU5126 stars(CDQ分治)的更多相关文章

  1. hdu 5126 stars cdq分治套cdq分治+树状数组

    题目链接 给n个操作, 第一种是在x, y, z这个点+1. 第二种询问(x1, y1, z1). (x2, y2, z2)之间的总值. 用一次cdq分治可以将三维变两维, 两次的话就变成一维了, 然 ...

  2. HDU - 5126 stars (CDQ分治)

    题目链接 题目大意:一共有Q(1<=Q<=50000)组操作,操作分为两种: 1.在x,y,z处添加一颗星星 2.询问以(x1,y1,z1)与(x2,y2,z2)为左上和右下顶点的矩形之间 ...

  3. HDU5126 stars【CDQ分治】*

    HDU5126 stars Problem Description John loves to see the sky. A day has Q times. Each time John will ...

  4. [学习笔记]CDQ分治和整体二分

    序言 \(CDQ\) 分治和整体二分都是基于分治的思想,把复杂的问题拆分成许多可以简单求的解子问题.但是这两种算法必须离线处理,不能解决一些强制在线的题目.不过如果题目允许离线的话,这两种算法能把在线 ...

  5. CDQ分治笔记

    以前一直不会CDQ……然后经常听到dalao们说“这题直接CDQ啊”“CDQ不就秒了吗”的时候我只能瑟瑟发抖QAQ CDQ分治 其实CDQ分治就是二分分治,每次将$[l,r]$的问题划分为$[l,mi ...

  6. CDQ分治--用时间降维的美丽算法

    CDQ分治–用时间降维的美丽算法 CDQ分治,网上的阐述很多,太专业性的文字我就不赘述,这里指谈谈自己的感受 还是%一下CDQ大神的论文 CDQ分治的主要想法就是降维(比如三维问题降维到二维问题),并 ...

  7. CDQ分治的嵌套

    CDQ的嵌套 上一篇博客介绍了一下CDQ的入门思想.这里再介绍一下它的进阶,CDQ套CDQ.其实如果对入门思想掌握的透彻,嵌套也是很容易掌握的,思想是一样的. 什么是嵌套 简单地说,有的问题,如果用一 ...

  8. CDQ分治&整体二分学习个人小结

    目录 小结 CDQ分治 二维LIS 第一道裸题 bzoj1176 Mokia bzoj3262 陌上花开 bzoj 1790 矩形藏宝地 hdu5126四维偏序 P3157 [CQOI2011]动态逆 ...

  9. 技巧专题3(cdq分治、整体二分等)

    cdq分治与整体二分 cdq来源于2008年国家集训队作业陈丹琦(雅礼巨佬),用一个log的代价完成从静态到动态(很多时候是减少时间那一维的). 对于一个时间段[L, R],我们取mid = (L + ...

随机推荐

  1. An internal error occurred during: &quot;Checking tomcat state&quot;. Error while reading server.xml

    An internal error occurred during: "Checking tomcat state". Error while reading server.xml ...

  2. 利用photoshop的动作功能实现图片批处理操作

    首先,通过"窗体菜单"点击"动作".启动动作栏. 然后.通过动作栏的菜单,新建动作. 接着,完毕一个标准操作,包含打开图像,图像处理或者格式转换,另存为,等. ...

  3. oracle之ROWNUM的查询应用

    1 在ORACLE数据库中,ROWNUM是ORACLE数据库为查询结果加入的一个伪列.起始值为1.经常使用来处理查询结果的分页. 2 因为ROWNUM的特殊性,使用时候一般是分三层: 第一层:先进行查 ...

  4. modSecurity规则学习(七)——防止SQL注入

    1.数字型SQL注入 /opt/waf/owasp-modsecurity-crs/rules/REQUEST-942-APPLICATION-ATTACK-SQLI.conf"] [lin ...

  5. 关于自适应的矩形css布局

    在面试中遇到的问题,做一个自适应的宽高2:1的矩形,这个问题考察了padding的细节,padding-bottom的百分比值,相对的是该盒模型的height,设置矩形之后,里面的内容如果太多会溢出, ...

  6. 洛谷P2415 集合求和

    题目描述 给定一个集合s(集合元素数量<=30),求出此集合所有子集元素之和. 输入输出格式 输入格式: 集合中的元素(元素<=1000) 输出格式: 和 输入输出样例 输入样例#1: 2 ...

  7. 基于CANopen DSP402的运动控制笔记

    常用的mode of operation 有以下几种: 控制字 control word: 6--------------7---------------15--------------------7 ...

  8. 关于IDEA无法完整显示项目文件结构

    今天发现一个奇怪的问题,就是我从本地导入了文件,明明已经成功了,但是在我的项目结构里面就是不显示,然而点击目录, 又能打开相应的文件,如图所示: 其实这个打开的只是包文件,只需要如下图操作即可:

  9. CentOS yum安装mcrypt详细图解教程

    CentOS yum安装mcrypt详细图解教程 在Linux的发行版CentOS 6.3 系统下,LAMP(Linux+Apache+Mysql+php)环境搭建好后发现PHPMyadmin提示 “ ...

  10. Python命令行參数大全

      -b     :    当转换数组为字符串时提出警告.比方str(bytes_instance), str(bytearray_instance). -B     :    当导入.py[co]文 ...