传送门

题意:

先有两种操作,插入和查询,插入操作则插入一个点\((x,y,z)\),查询操作给出两个点\((x_1,y_1,z_1),(x_2,y_2,z_2)\),回答满足\(x_1\leq x\leq x_2,y_1\leq y\leq y_2,z_1\leq z\leq z_2\)的\((x,y,z)\)的个数为多少。

思路:

就是带修改的四维偏序问题。

首先我们可以将每个点看作三维空间中的一个点,那么每次询问就相当于询问立方体中的点。

我们将询问拆成\(8\)个询问,那么每次解决的就是一个前缀和问题,也就是满足\(x\leq x_0,y\leq y_0,z\leq z_0\)的点的个数。

那么就对一维排序,之后\(cdq\)套\(cdq\)再套个树状数组就好啦。

注意我们现在只有左边区间的修改操作才会对右边区间的询问操作有影响~

注意一下空间,要开大点。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 50005; int T, q; struct node{
int x, y, z, op, id, part;
}a[N * 10], b[N * 10], d[N * 10]; int hs[N << 2]; bool isq[N];
int ans[N]; int c[N << 2];
int lowbit(int x) {return x & (-x);} void update(int x, int v) {
for(; x < N << 2; x += lowbit(x)) c[x] += v;
} int query(int x) {
int ans = 0;
for(; x; x -= lowbit(x)) ans += c[x];
return ans;
} void cdq2(int l, int r) {
if(l == r) return ;
int mid = (l + r) >> 1;
cdq2(l, mid); cdq2(mid + 1, r);
int t1 = l, t2 = mid + 1;
for(int i = l; i <= r; i++) {
if(t2 > r || (t1 <= mid && b[t1].y <= b[t2].y)) {
if(b[t1].part == 0 && b[t1].op == 0) {
update(b[t1].z, 1);
}
d[i] = b[t1++];
} else {
if(b[t2].part && b[t2].op != 0) {
ans[b[t2].id] += b[t2].op * query(b[t2].z);
}
d[i] = b[t2++];
}
}
for(int i = l; i <= mid; i++) {
if(b[i].part == 0 && b[i].op == 0) update(b[i].z, -1);
}
for(int i = l; i <= r; i++) b[i] = d[i];
} void cdq(int l, int r) {
if(l == r) return ;
int mid = (l + r) >> 1;
cdq(l, mid); cdq(mid + 1, r);
int t1 = l, t2 = mid + 1;
for(int i = l; i <= r; i++) {
if(t2 > r || (t1 <= mid && a[t1].x <= a[t2].x)) {
b[i] = a[t1++];
b[i].part = 0;
} else {
b[i] = a[t2++];
b[i].part = 1;
}
}
for(int i = l; i <= r; i++) a[i] = b[i];
cdq2(l, r);
} int main() {
// freopen("input.in", "r", stdin);
ios::sync_with_stdio(false); cin.tie(0);
cin >> T;
while(T--) {
cin >> q;
for(int i = 1; i <= q; i++) ans[i] = 0, isq[i] = false;
int cnt = 0; hs[0] = 0;
for(int i = 1; i <= q; i++) {
int op; cin >> op;
if(op == 1) {
int x, y, z; cin >> x >> y >> z;
a[++cnt] = {x, y, z, 0, i, -1};
hs[++hs[0]] = z;
} else {
isq[i] = true;
int x1, y1, z1, x2, y2, z2;
cin >> x1 >> y1 >> z1 >> x2 >> y2 >> z2;
--x1, --y1, --z1;
a[++cnt] = {x1, y1, z1, -1, i, -1};
a[++cnt] = {x1, y2, z1, 1, i, -1};
a[++cnt] = {x2, y2, z1, -1, i, -1};
a[++cnt] = {x2, y1, z1, 1, i, -1};
a[++cnt] = {x1, y1, z2, 1, i, -1};
a[++cnt] = {x1, y2, z2, -1, i, -1};
a[++cnt] = {x2, y2, z2, 1, i, -1};
a[++cnt] = {x2, y1, z2, -1, i, -1};
hs[++hs[0]] = z1, hs[++hs[0]] = z2;
}
}
sort(hs + 1, hs + hs[0] + 1);
hs[0] = unique(hs + 1, hs + hs[0] + 1) - hs - 1;
for(int i = 1; i <= cnt; i++) a[i].z = lower_bound(hs + 1, hs + hs[0] + 1, a[i].z) - hs;
cdq(1, cnt);
for(int i = 1; i <= q; i++) {
if(isq[i]) cout << ans[i] << '\n';
}
}
return 0;
}

HDU5126 stars(cdq分治)的更多相关文章

  1. HDU5126 stars(CDQ分治)

    传送门 大意: 向三维空间中加点,询问一个三维区间中点的个数. 解题思路: 带修改CDQ,将修改和询问一起插入CDQ分治询问. (询问可以由8个前缀和加减操作实现) 其中第一层CDQ维护x有序. 第二 ...

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

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

  3. HDU - 5126 stars (CDQ分治)

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

  4. HDU5126 stars【CDQ分治】*

    HDU5126 stars Problem Description John loves to see the sky. A day has Q times. Each time John will ...

  5. [学习笔记]CDQ分治和整体二分

    序言 \(CDQ\) 分治和整体二分都是基于分治的思想,把复杂的问题拆分成许多可以简单求的解子问题.但是这两种算法必须离线处理,不能解决一些强制在线的题目.不过如果题目允许离线的话,这两种算法能把在线 ...

  6. CDQ分治笔记

    以前一直不会CDQ……然后经常听到dalao们说“这题直接CDQ啊”“CDQ不就秒了吗”的时候我只能瑟瑟发抖QAQ CDQ分治 其实CDQ分治就是二分分治,每次将$[l,r]$的问题划分为$[l,mi ...

  7. CDQ分治--用时间降维的美丽算法

    CDQ分治–用时间降维的美丽算法 CDQ分治,网上的阐述很多,太专业性的文字我就不赘述,这里指谈谈自己的感受 还是%一下CDQ大神的论文 CDQ分治的主要想法就是降维(比如三维问题降维到二维问题),并 ...

  8. CDQ分治的嵌套

    CDQ的嵌套 上一篇博客介绍了一下CDQ的入门思想.这里再介绍一下它的进阶,CDQ套CDQ.其实如果对入门思想掌握的透彻,嵌套也是很容易掌握的,思想是一样的. 什么是嵌套 简单地说,有的问题,如果用一 ...

  9. CDQ分治&整体二分学习个人小结

    目录 小结 CDQ分治 二维LIS 第一道裸题 bzoj1176 Mokia bzoj3262 陌上花开 bzoj 1790 矩形藏宝地 hdu5126四维偏序 P3157 [CQOI2011]动态逆 ...

  10. 技巧专题3(cdq分治、整体二分等)

    cdq分治与整体二分 cdq来源于2008年国家集训队作业陈丹琦(雅礼巨佬),用一个log的代价完成从静态到动态(很多时候是减少时间那一维的). 对于一个时间段[L, R],我们取mid = (L + ...

随机推荐

  1. NLP之预训练

    内容是结合:https://zhuanlan.zhihu.com/p/49271699 可以直接看原文 预训练一般要从图像处理领域说起:可以先用某个训练集合比如训练集合A或者训练集合B对这个网络进行预 ...

  2. DVWA SQL Injection 通关教程

    SQL Injection,即SQL注入,SQLi,是指攻击者通过注入恶意的SQL命令,破坏SQL查询语句的结构,从而达到执行恶意SQL语句的目的.SQL注入漏洞的危害巨大,常常会导致整个数据库被“脱 ...

  3. 第02组 Alpha冲刺(5/6)

    队名:無駄無駄 组长博客 作业博客 组员情况 张越洋 过去两天完成了哪些任务 摸鱼 准备"Alpha事后诸葛亮" 提交记录(全组共用) 接下来的计划 沟通前后端成员,监督.提醒他们 ...

  4. 【RS】Deep Learning based Recommender System: A Survey and New Perspectives - 基于深度学习的推荐系统:调查与新视角

    [论文标题]Deep Learning based Recommender System: A Survey and New Perspectives ( ACM Computing Surveys  ...

  5. Docker学习2-Docker的基本命令与使用

    前言: 前些天有人问镜像是什么?容器有是什么?docker对于初学者来说,往往分不清楚镜像和容器,编程语言都知道有一个面向对象,类和实例,类比作镜像,实例比作容器. 有的人蹦着学习的心态的去群里问人, ...

  6. sqlite删除数据

    sqlite删除数据 某日, 在使用sqlite的时候发现查询速度极慢, 查看了一下文件大小, sqlite数据库文件已经达到了 22G! 对于一个文件数据库来说, 已经相当致命了,先不说后面如果解决 ...

  7. VUE的$refs和$el的使用

    ref 被用来给元素或子组件注册引用信息 ref 有三种用法: 1.ref 加在普通的元素上,用this.$refs.(ref值) 获取到的是dom元素 2.ref 加在子组件上,用this.$ref ...

  8. Java如何执行操作系统的CMD命令行

    在模拟cmd调用Python时遇到一些情况,这类问题可以归类为"超时,阻塞"等,问题原因: Process p=Runtime.getRuntime().exec(String[] ...

  9. Prometheus 告警状态了解

    Prometheus 告警状态了解 一旦这些警报存储在Alertmanager,它们可能处于以下任何状态: · Inactive:这里什么都没有发生. · Pending:已触发阈值,但未满足告警持续 ...

  10. RAID(独立磁盘冗余阵列)简介

    RAID(独立磁盘冗余阵列) 在大数据技术出现之前,人们就需要面对这些关于存储的问题,对应的解决方案就是RAID技术. RAID(独立磁盘冗余阵列)技术主要是为了改善磁盘的存储容量,读写速度,增强磁盘 ...