传送门

大意:

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

解题思路:

带修改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. leetcode第一刷_Text Justification

    这个题的接受率好低,搞得我一直不敢做.后来认真的看了一下题目,不是非常难嘛.字符串的题目ac率就是低,除了难,还由于它的測试用例太多. 思路不难,主要是由于特殊情况太多.纯模拟,我把全部的情况罗列一下 ...

  2. linux关于用户密码家目录总结

    创建用户及其家目录useradd -d /home/tomcat -m tomcat接着修改密码passwd tomcat usermod -s /sbin/nologin + 用户名 禁止登录ssh ...

  3. BZOJ 1230 Usaco2008 Nov 开关灯 线段树

    思路: 用线段树模拟题中的操作就好 (标记异或 长度=区间总长度-当前已开灯的长度) //By SiriusRen #include <cstdio> using namespace st ...

  4. Aspose.Cells相应操作及下载

    Aspose.Cells相应操作 1,上传 1.1 Workbook Workbook workBook = new Workbook(); 属性: 名称 值类型 说明 Colors Color[] ...

  5. angularjs 页面缓存及动态刷新解决方案

    一.准备工作 框架:angularjs ui组件库:ionic1 二.页面缓存cache 路由设置cache参数,true为缓存,false为不缓存,代码如下: angular.module('app ...

  6. Deepin for Linux 下串口调试交换机

    最近因工作需要,在淘宝购买了一条宇泰的串口线:USB to RS232 之所以选择这款,主要是它支持 Windows.Linux.mac Linux机是Deepin for Linux,算是国产比较好 ...

  7. 无闻go编程基础笔记

    Go语言做Web编程非常方便,并且在开发效率和程序运行效率方面都非常优秀.相比于Java,其最大的优势就是简便易用,而相比于PHP,它最大的优势就是性能好. (go做web)推荐Gorilla的库,里 ...

  8. Java并发包之CountDownLatch用法

    CountDownLatch计数器闭锁是一个能阻塞主线程,让其他线程满足特定条件下主线程再继续执行的线程同步工具. Latch闭锁的意思,是一种同步的工具类.类似于一扇门:在闭锁到达结束状态之前,这扇 ...

  9. Cisco PIX防火墙PPPoE拨号配置视频教学

    Cisco PIX防火墙PPPoE拨号配置视频教学   本文出自 "李晨光原创技术博客" 博客,请务必保留此出处http://chenguang.blog.51cto.com/35 ...

  10. 跨域使用onmessage实现方式

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...