题目传送门

题意:在一个星空中,按着时间会出现一些点,现在john想知道,在某个时间内有多少个星星是的坐标是满足条件的。(x1<=x<=x2, y1 <= y <= y2, z1 <= z <= z2).
题解:先简化问题,如果我们就统计出现所有 x <= x2 , y <= y2, z <= z2的点的话,这就是一个4维偏序题。

对于这个统计点数来说, 我们先按照题目给定点的顺序来进行CDQ, 这样在CDQ内只有左边的添加点会对右边的询问点产生影响,然后我们再把这些会对答案找出影响的点拿出来,

对这些点进行关于X轴内一个sort,对于sort完的结果,我们再进行cdq, 这样在cdq内还是只有左边的左边的添加点会对右边的询问点产生影响,然后我们再把这些会对答案找出影响的点拿出来。

这样就变成了2维偏序题了, 再对y sort, 然后for一遍询问答案把答案加进去就好了。

现在的问题就变成了怎么询问这个长方体内点的个数。 我们可以用差分的思想去维护这个矩形。

我们对一次询问可以拆成8次询问。

Q1( X1-1, Y1-1, Z2) Q2 (X1-1, Y2, Z2) Q3 (X2, Y1-1, Z2) Q4(X2,Y2,Z2)

Q5( X1-1, Y1-1, Z1-1) Q6 (X1-1, Y2, Z1-1) Q7 (X2, Y1-1, Z1-1) Q8(X2,Y2,Z1-1)

可以发现 Q1-Q2-Q3+Q4 得到的是  z <= z2    x1<=x <= x2 && y1 <= y <= y2 的点的个数和。

现在我们在减去 z <= z1-1 x1<=x <= x2 && y1 <= y <= y2 的个数和就是答案了。

在CDQ的过程中, 我们可以加上一个剪枝 即对于这个CDQ来说,如果左边没有添加点 或者 右边没有询问点 就再进行处理了, 因为不会对答案造成影响。

代码:

 #include<bits/stdc++.h>
using namespace std;
#define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
#define LL long long
#define ULL unsigned LL
#define fi first
#define se second
#define pb push_back
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define lch(x) tr[x].son[0]
#define rch(x) tr[x].son[1]
#define max3(a,b,c) max(a,max(b,c))
#define min3(a,b,c) min(a,min(b,c))
typedef pair<int,int> pll;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const LL mod = (int)1e9+;
const int N = 1e6 + ;
struct Node{
int x, y, z, op, id;
}A[N], B[N], C[N];
int ans[N];
int zz[N];
int tot = ;
int zsz;
int bit[N];
void add(int x, int v){
while(x <= zsz){
bit[x] += v;
x += x & (-x);
}
}
int query(int x){
int ret = ;
while(x > ){
ret += bit[x];
x -= x & (-x);
}
return ret;
}
bool cmp_x(Node & n1, Node & n2){
if(n1.x != n2.x) return n1.x < n2.x;
if(n1.y != n2.y) return n1.y < n2.y;
if(n1.z != n2.z) return n1.z < n2.z;
return n1.id < n2.id;
}
bool cmp_y(Node & n1, Node & n2){
if(n1.y != n2.y) return n1.y < n2.y;
if(n1.z != n2.z) return n1.z < n2.z;
return n1.id < n2.id;
}
void cdq(int l, int r){
if(l >= r) return ;
int m = l+r >> ;
cdq(l, m); cdq(m+, r);
int k = ;
for(int i = l; i <= m; i++)
if(!B[i].id) C[++k] = B[i];
for(int i = m+; i <= r; i++)
if(B[i].id) C[++k] = B[i];
if(C[].id != || C[k].id == ) return ;/// 剪枝
sort(C+, C++k, cmp_y);
for(int i = ; i <= k; i++){
if(C[i].op)
ans[C[i].id] += query(C[i].z) * C[i].op;
else
add(C[i].z, );
}
for(int i = ; i <= k; i++){
if(C[i].op);
else add(C[i].z, -);
}
}
void CDQ(int l, int r){
if(l == r) return ;
int m = l+r >> ;
CDQ(l,m); CDQ(m+,r);
int k = ;
for(int i = l; i <= m; i++)
if(!A[i].id) B[++k] = A[i];
for(int i = m+; i <= r; i++)
if(A[i].id) B[++k] = A[i];
if(B[].id != || B[k].id == ) return ;/// 剪枝
sort(B+, B++k, cmp_x);
cdq(,k);
} inline void nownode(int x, int y, int z, int op, int id){
++tot; A[tot].x = x; A[tot].y = y; zz[tot] = z;
A[tot].z = z; A[tot].op = op; A[tot].id = id;
}
int main(){
int T;
scanf("%d", &T);
while(T--){
int n, op, x1, y1, z1, x2, y2, z2, m = ;
tot = ;
scanf("%d", &n);
for(int i = ; i <= n; i++){
scanf("%d", &op);
if(op == ){
scanf("%d%d%d", &x1, &y1, &z1);
nownode(x1, y1, z1, , );
}
else {
m++;
ans[m] = ;
scanf("%d%d%d", &x1, &y1, &z1);
scanf("%d%d%d", &x2, &y2, &z2);
nownode(x2,y2,z2,,m);
nownode(x1-,y1-,z2,,m);
nownode(x2,y1-,z2,-,m);
nownode(x1-,y2,z2,-,m); nownode(x2,y2,z1-,-,m);
nownode(x1-,y1-,z1-,-,m);
nownode(x2,y1-,z1-,,m);
nownode(x1-,y2,z1-,,m);
}
}
sort(zz+, zz+tot+);
zsz = unique(zz+, zz+tot+) - zz - ;
for(int i = ; i <= tot; i++)
A[i].z = lower_bound(zz+, zz++zsz, A[i].z) - zz;
CDQ(, tot);
for(int i = ; i <= m; i++)
printf("%d\n", ans[i]);
}
return ;
}

HDU 5126 stars 4维偏序, CDQ套CDQ的更多相关文章

  1. HDU - 5126: stars (求立方体内点数 CDQ套CDQ)

    题意:现在给定空空的三维平面,有加点操作和询问立方体点数. 思路:考虑CDQ套CDQ.复杂度是O(NlogN*logN*logN),可以过此题. 具体的,这是一个四维偏序问题,4维分别是(times, ...

  2. cogs2479 偏序(CDQ套CDQ)

    题目链接 思路 四维偏序 \(CDQ\)套\(CDQ\),第一维默认有序.第二维用第一个\(CDQ\)变成有序的.并且对每个点标记上第一维属于左边还是右边.第二个\(CDQ\)处理第三维,注意两个\( ...

  3. [HZOI 2016] 偏序(CDQ套CDQ)

    传送门 思路: 就是cdq套cdq的模板题 #include <bits/stdc++.h> using namespace std; typedef long long ll; cons ...

  4. HDU5126---stars (CDQ套CDQ套 树状数组)

    题意:Q次操作,三维空间内 每个星星对应一个坐标,查询以(x1,y1,z1) (x2,y2,z2)为左下顶点 .右上顶点的立方体内的星星的个数. 注意Q的范围为50000,显然离散化之后用三维BIT会 ...

  5. 【教程】CDQ套CDQ——四维偏序问题

    前言 上一篇文章已经介绍了简单的CDQ分治,包括经典的二维偏序和三维偏序问题,还有带修改和查询的二维/三维偏序问题.本文讲介绍多重CDQ分治的嵌套,即多维偏序问题. 四维偏序问题       给定N( ...

  6. 四维偏序 CDQ套CDQ

    对CDQ深一步的理解 昨天做了一道CDQ,看了一堆CDQ可做的题,今天又做了一道四维偏序 感觉对CDQ的理解又深了一点,故来写一写现在自己对于CDQ的理解 CDQ其实就是实现了这样的一个问题的转化: ...

  7. hdu 5126 stars (四维偏序,离线,CDQ套CDQ套树状数组)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5126 思路:支持离线,那么我们可以用两次CDQ分治使四维降为二维,降成二维后排个序用树状数组维护下就好 ...

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

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

  9. HDU - 5126 stars (CDQ分治)

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

随机推荐

  1. isMemberOfClass、isKindOfClass原理分析

    isMemberOfClass - 调用者必须是传入的类的实例对象才返回YES- 判断调用者是否是传入对象的实例,别弄反了,如 [s1 isMemberOfClass:p1] ,意思是s1是否是p1的 ...

  2. scroll-苹果滑动卡顿

    2018年08月02日,程序小bug. 在移动端html中经常出现横向/纵向滚动的效果,但是在iPhone中滚动速度很慢,感觉不流畅,有种卡卡的感觉,但是在安卓设备上没有这种感觉; 一行代码搞定: - ...

  3. 理解MySQL(一)--MySQL介绍

    一.Mysql逻辑架构: 1. 第一层:服务器层的服务,连接\线程处理. 2. 第二层:查询执行引擎,MySQL的核心服务功能,包括查询解析.分析.优化和缓存,所有跨存储引擎的功能都在这一层实现. 3 ...

  4. java学习-NIO(三)Channel

    通道(Channel)是java.nio的第二个主要创新.它们既不是一个扩展也不是一项增强,而是全新.极好的Java I/O示例,提供与I/O服务的直接连接.Channel用于在字节缓冲区和位于通道另 ...

  5. DIY cnblog——背景渐变切换

    进来的小伙伴应该已经看过了我的博客样式,但还是贴张图先: 先大致说一下实现的思路,然后把代码贴出来供小伙伴们参考. 由于不是特别技术性的文章,格式就放宽松一点,跟着意识流走吧. 先跟大家分享一个渐变背 ...

  6. Spring Boot 支持 Https 有那么难吗?

    https 现在已经越来越普及了,特别是做一些小程序或者公众号开发的时候,https 基本上都是刚需了. 不过一个 https 证书还是挺费钱的,个人开发者可以在各个云服务提供商那里申请一个免费的证书 ...

  7. 使用bibtex为latex论文添加参考文献

    此文以引用Shannon的Prediction  and  Entropy  of Printed  English为例 1. bib文件 1.1 准备工作 进入Google Scholar 点击设置 ...

  8. final,权限,引用类型数据

    1. final关键字 1.概述 为了避免子类出现随意改写父类的情况,java提供了关键字final,用于修饰不可改变内容 final:不可改变,可以修饰类,方法和变量 类:被修饰的类,不能用于继承 ...

  9. ajax+JQuery实现类似百度智能搜索框

    最近再学习ajax,上课老师让我们实现一个类似百度首页实现搜索框的功能,刚开始做的时候没有一点头绪,查阅大量网上的资源后,发现之前的与我们现在的有些区别,所以在此写出来,希望能对大家有所帮助. 下面先 ...

  10. 100天搞定机器学习|day38 反向传播算法推导

    往期回顾 100天搞定机器学习|(Day1-36) 100天搞定机器学习|Day37无公式理解反向传播算法之精髓 上集我们学习了反向传播算法的原理,今天我们深入讲解其中的微积分理论,展示在机器学习中, ...