HDU5126 stars(CDQ分治)
大意:
向三维空间中加点,询问一个三维区间中点的个数。
解题思路:
带修改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分治)的更多相关文章
- hdu 5126 stars cdq分治套cdq分治+树状数组
题目链接 给n个操作, 第一种是在x, y, z这个点+1. 第二种询问(x1, y1, z1). (x2, y2, z2)之间的总值. 用一次cdq分治可以将三维变两维, 两次的话就变成一维了, 然 ...
- HDU - 5126 stars (CDQ分治)
题目链接 题目大意:一共有Q(1<=Q<=50000)组操作,操作分为两种: 1.在x,y,z处添加一颗星星 2.询问以(x1,y1,z1)与(x2,y2,z2)为左上和右下顶点的矩形之间 ...
- HDU5126 stars【CDQ分治】*
HDU5126 stars Problem Description John loves to see the sky. A day has Q times. Each time John will ...
- [学习笔记]CDQ分治和整体二分
序言 \(CDQ\) 分治和整体二分都是基于分治的思想,把复杂的问题拆分成许多可以简单求的解子问题.但是这两种算法必须离线处理,不能解决一些强制在线的题目.不过如果题目允许离线的话,这两种算法能把在线 ...
- CDQ分治笔记
以前一直不会CDQ……然后经常听到dalao们说“这题直接CDQ啊”“CDQ不就秒了吗”的时候我只能瑟瑟发抖QAQ CDQ分治 其实CDQ分治就是二分分治,每次将$[l,r]$的问题划分为$[l,mi ...
- CDQ分治--用时间降维的美丽算法
CDQ分治–用时间降维的美丽算法 CDQ分治,网上的阐述很多,太专业性的文字我就不赘述,这里指谈谈自己的感受 还是%一下CDQ大神的论文 CDQ分治的主要想法就是降维(比如三维问题降维到二维问题),并 ...
- CDQ分治的嵌套
CDQ的嵌套 上一篇博客介绍了一下CDQ的入门思想.这里再介绍一下它的进阶,CDQ套CDQ.其实如果对入门思想掌握的透彻,嵌套也是很容易掌握的,思想是一样的. 什么是嵌套 简单地说,有的问题,如果用一 ...
- CDQ分治&整体二分学习个人小结
目录 小结 CDQ分治 二维LIS 第一道裸题 bzoj1176 Mokia bzoj3262 陌上花开 bzoj 1790 矩形藏宝地 hdu5126四维偏序 P3157 [CQOI2011]动态逆 ...
- 技巧专题3(cdq分治、整体二分等)
cdq分治与整体二分 cdq来源于2008年国家集训队作业陈丹琦(雅礼巨佬),用一个log的代价完成从静态到动态(很多时候是减少时间那一维的). 对于一个时间段[L, R],我们取mid = (L + ...
随机推荐
- Github-flavored Markdown 导出为 PDF
前提条件: 你可以访问Google和它相关的服务 第一步 到Chrome Store安装插件 Markdown Preview Plus 安装以后记得勾选 "允许访问文件网址" 设 ...
- Linux150个常用指令
线上查询及帮助命令(2个) 文件和目录操作命令(18个) 查看文件及内容处理命令(21个) 文件压缩及解压缩命令(4个) 信息显示命令(11个) 搜索文件命令(4个) 用户管理命令(10个) 基础网络 ...
- DENON AVR-X510BT 功放设置记录
http://manuals.denon.com/avrx510bt/ap/zh/index.php 环绕模式 : Direct:直接 Sttereo:立体声 Dolby PL 声音模式 电影 : ...
- 手把手教你如何在Ubuntu系统中安装Pycharm
前几天带大家一起安装了Ubuntu14.04系统,没来得及上车的伙伴可以戳这篇文章:手把手教你在VMware虚拟机中安装Ubuntu14.04系统.今天小编带大家一起在Ubuntu14.04中安装Py ...
- CentOS 安装openssl
https://blog.csdn.net/ydyang1126/article/details/72902113 安装环境: 操作系统:CentOS 7 OpenSSL Version:openss ...
- Mysql学习总结(6)——MySql之ALTER命令用法详细解读
MySql语法中Alter命令的用法,这是一个用法比较多的语法,而且功能还是很强大的. [sql] view plaincopy USE learning;(自己要提前建好) CREATE TABLE ...
- WPF和WinForm的区别, 数据驱动与事件驱动的优势对比
Winform中针对界面的元素进行操作, 所有业务都关联在当前窗口的后台, 而在此之前, 无奈你是双击事件的添加方式.还是后台绑定事件的方式, 你都需要给每个元素一个固定规范的名称, 然后进行相关的数 ...
- CF 246 div2 D Prefixes and Suffixes (全部前缀的出现次数)
题目链接:http://codeforces.com/contest/432/problem/D 题意:对一个长度不超过10^5的字符串.按长度输出和后缀全然匹配的的前缀的长度,及该前缀在整个串中出现 ...
- Python: PS 图像调整--对比度调整
本文用 Python 实现 PS 里的图像调整–对比度调整.具体的算法原理如下: (1).nRGB = RGB + (RGB - Threshold) * Contrast / 255 公式中,nRG ...
- 45. Express 框架 静态文件处理
转自:http://www.runoob.com/nodejs/nodejs-express-framework.html Express 提供了内置的中间件 express.static 来设置静态 ...