传送门

大意:

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

解题思路:

带修改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. Snail—UI学习之导航视图控制器UINavigationController(系统)

    背景 有一个根视图控制器 然后跳转到第一个界面  第一个界面能够返回到根视图 也能够跳转到第二个视图 第二个视图能够直接返回到根视图 新建三个ViewController    RootViewCon ...

  2. POJ 3670 Eating Together(LIS)

    Description The cows are so very silly about their dinner partners. They have organized themselves i ...

  3. QThread 爬坑之旅(三种办法解决QObject: Cannot create children for a parent that is in a different thread)

    Cannot create children for a parent that is in a different thread. 在Qt的官方文档,大家知道有两种方式使用QThread. You ...

  4. 15.Intellij中配置jdk/tomcat/maven

    转自:https://blog.csdn.net/u010414666/article/details/44465905 继上一篇安装好了Intellij之后,我们可以对Intellij,做一些简单的 ...

  5. 之前写的收集的一些c++代码片,算法排序,读文件,写日志,快速求积分等等

    写日志: class LogFile { public: static LogFile &instance(); operator FILE *() const { return m_file ...

  6. Git 操作笔记

    ¥先放个地址:这个视频超详细 https://www.bilibili.com/video/av10475153 分了2部分: 1是GitHub的功能介绍:2是pc端+doc命令的操作+发布个人网站 ...

  7. chgrp---改变文件或目录所属的用户组

    chgrp命令用来改变文件或目录所属的用户组.该命令用来改变指定文件所属的用户组.其中,组名可以是用户组的id,也可以是用户组的组名.文件名可以 是由空格分开的要改变属组的文件列表,也可以是由通配符描 ...

  8. 【Henu ACM Round#17 E】Tree Construction

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 做这题之前先要知道二叉排序树的一个性质. 就是它的中序遍历的结果就是这个数组升序排序. (且每个节点的左边的节点都是比这个节点的值小 ...

  9. LeetCode 223 Rectangle Area(矩形面积)

    翻译 找到在二维平面中两个相交矩形的总面积. 每一个矩形都定义了其左下角和右上角的坐标. (矩形例如以下图) 如果,总占地面积永远不会超过int的最大值. 原文 分析 这题前天试过,写了一堆推断.终究 ...

  10. 蓝的成长记——追逐DBA(10):飞刀防身,熟络而非专长:摆弄中间件Websphere

    原创作品,出自 "深蓝的blog" 博客.欢迎转载,转载时请务必注明出处.否则追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlong ...