传送门

大意:

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

解题思路:

带修改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. ListView阻尼效果

    效果图省略.. . activity_main.xml(仅仅有一个自己定义ListView) <RelativeLayout xmlns:android="http://schemas ...

  2. Android设计模式(十二)--抽象工厂模式

    问题: 抽象工厂模式,是一个,狠恶心的模式,那么这个模式在Android有没实用到过呢? 1.定义: 抽象工厂模式:为创建一组相关或者是相互依赖的对象提供一个接口,而不须要指定他们的详细类. 2.使用 ...

  3. cf 828 A. Restaurant Tables

    A. Restaurant Tables time limit per test 1 second memory limit per test 256 megabytes input standard ...

  4. 如何建立远程桌面连接(XP、Vista、Win7)

    如何建立远程桌面连接(XP.Vista.Win7) 要求: 1:对方即你要连的机器必须要允许远程桌面连接,操作系统一般是winXP(单用户)和win2003server(多用户),具体设置:右击我的电 ...

  5. Windows10 Linux子系统的启用和中文用户名的修改

    一直用的虚拟机Linux,忽然心血来潮,看到Windows 10可以使用Linux子系统,于是来装一波,按照这位前辈的教程 https://blog.csdn.net/zhangdongren/art ...

  6. 如何批量telnet查看否开放指定端口

    由于机房搬迁,需要重新telnet看看网络是否联通 [weblogic@pays03pre_BankVerify /]$ telnet 172.29.1.159 22Trying 172.29.1.1 ...

  7. du---是对文件和目录磁盘使用的空间查看

    du命令也是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的. 语法 du [选项][文件] 选项 -a或-all 显示目录中个 ...

  8. ios-字符串替换-正则表达式-例子

    需求:在html中查找并替换相应的html标签 代码实现 - (NSString *)replaceImageHtml:(NSString *)oldHtml { NSString *regex = ...

  9. IOCP模型总结(总结回想)

    IOCP旧代码重提.近期一直在玩其它方面的东东.时不时回想一下,收益多多. IOCP(I/O Completion Port,I/O完毕port)是性能最好的一种I/O模型.它是应用程序使用线程池处理 ...

  10. C# 插入排序 冒泡排序 选择排序 高速排序 堆排序 归并排序 基数排序 希尔排序

    C# 插入排序 冒泡排序 选择排序 高速排序 堆排序 归并排序 基数排序 希尔排序 以下列出了数据结构与算法的八种基本排序:插入排序 冒泡排序 选择排序 高速排序 堆排序 归并排序 基数排序 希尔排序 ...