题目传送门

题意:在一个星空中,按着时间会出现一些点,现在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. Where is the clone one and how to extract it?

    One cannot be in two places at once. Do you know what's "Dual Apps"? Manufactures like Xia ...

  2. Kubernetes容器集群管理环境 - 完整部署(上篇)

    Kubernetes(通常称为"K8S")是Google开源的容器集群管理系统.其设计目标是在主机集群之间提供一个能够自动化部署.可拓展.应用容器可运营的平台.Kubernetes ...

  3. java8中使用函数式接口

    使用函数式接口 Predicate @FunctionalInterface interface Predicate<T>{ boolean test(T t); } public sta ...

  4. 【原创】HashMap复习精讲

    引言 由于近期忙着搬家,又偷懒了几个礼拜! 其实我很早以前就想写一篇关于HashMap的面试专题.对于JAVA求职者来说,HashMap可谓是集合类的重中之重,甚至你在复习的时候,其他集合类都不用看, ...

  5. .net持续集成测试篇之Nunit that断言

    系列目录 that是Nunit的新语法,语义上不如简单断言,使用上也更加复杂,但是其功能更加强大. 其基本语法如下代码片段示: [Test] public void DemoTest() { bool ...

  6. Docker 的另外两个话题: DockerHub 和 容器网络

    关注公众号,大家可以在公众号后台回复“博客园”,免费获得作者 Java 知识体系/面试必看资料. Hello,大家好,我是子悠,作为本周的小编昨天已经跟大家介绍过自己了,今天就让我们继续学习江南一点雨 ...

  7. oracle 正确删除归档日志,并清除 V$ARCHIVED_LOG 数据

    1. 连接 RMAN 管理 rman target / 2. 查看归档日志列表 RMAN> crosscheck archivelog all; 3. 删除所有归档日志 RMAN> DEL ...

  8. apicloud 开发环境搭建

     之前做过appcan 手机应用的开发,工作需要切换的apicloud , 开发环境的的搭建是开发的第一步,let's go 1新建应用 step1  注册账号 注册apicloud 账号:https ...

  9. SpringBoot:Web开发

    西部开源-秦疆老师:基于SpringBoot 2.1.6 的博客教程 , 基于atguigu 1.5.x 视频优化 秦老师交流Q群号: 664386224 未授权禁止转载!编辑不易 , 转发请注明出处 ...

  10. .netcore持续集成测试篇之 .net core 2.1项目集成测试

    系列目录 从.net到.net core以后,微软非常努力,以每年一到两个大版本的频率在演进.net core,去年相继发布了.net core 2.1和2.2,其中2.1是长期支持版,不断的快速更新 ...