题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5126

思路:支持离线,那么我们可以用两次CDQ分治使四维降为二维,降成二维后排个序用树状数组维护下就好了

实现代码:

#include<bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
const int M = 5e5+; int ans[M],c[M];
struct node
{
int x,y,z;
int kind,id;
node(){}
node(int x1,int y1,int z1,int k,int i):x(x1),y(y1),z(z1),kind(k),id(i){}
};
vector<node>q,q1,q2;
vector<int>v;
void init(){
q.clear();
v.clear();
memset(c,,sizeof(c));
} bool cmp(node a,node b){
if(a.x == b.x) return a.id < b.id;
return a.x < b.x;
} bool cmp1(node a,node b){
if(a.y == b.y) return a.id < b.id;
return a.y < b.y;
} int lowbit(int x){
return x&-x;
} void add(int x,int val){
while(x <= v.size()){
c[x] += val;
x += lowbit(x);
}
} int getsum(int x){
int sum = ;
while(x > ){
sum += c[x];
x -= lowbit(x);
}
return sum;
} void countstar(){
for(int i = ;i < q2.size();i ++){
if(q2[i].kind == ) add(q2[i].z,);
else ans[q2[i].id] += q2[i].kind*getsum(q2[i].z);
// cout<<q2[i].id<<" "<<ans[q2[i].id]<<endl;
}
for(int i = ;i < q2.size();i ++)
if(q2[i].kind == ) add(q2[i].z,-);
} void cdq1(int l,int r){
if(l >= r) return ;
int mid = (l + r) >> ;
cdq1(l,mid); cdq1(mid+,r);
q2.clear();
for(int i = l;i <= mid;i ++)
if(q1[i].kind == ) q2.push_back(q1[i]);
for(int i = mid+;i <= r;i ++)
if(q1[i].kind) q2.push_back(q1[i]);
sort(q2.begin(),q2.end(),cmp1);
countstar();
} void cdq(int l,int r){
if(l >= r) return ;
int mid = (l + r) >> ;
cdq(l,mid); cdq(mid+,r);
q1.clear();
for(int i = l;i <= mid;i ++)
if(q[i].kind == ) q1.push_back(q[i]);
for(int i = mid+;i <= r;i ++)
if(q[i].kind) q1.push_back(q[i]);
sort(q1.begin(),q1.end(),cmp);
cdq1(,q1.size()-);
} int main()
{
int t,n,op,x,y,z,x1,y1,z1,x2,y2,z2;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
init();
for(int i = ;i < n;i ++){
scanf("%d",&op);
if(op == ){
scanf("%d%d%d",&x,&y,&z);
q.push_back(node(x,y,z,,i));
v.push_back(z);
ans[i] = -;
}
else{
scanf("%d%d%d%d%d%d",&x1,&y1,&z1,&x2,&y2,&z2);
x1--; y1--; z1--;
q.push_back(node(x1,y1,z1,-,i));
q.push_back(node(x2,y2,z2,,i));
q.push_back(node(x1,y2,z2,-,i));
q.push_back(node(x2,y1,z2,-,i));
q.push_back(node(x2,y2,z1,-,i));
q.push_back(node(x2,y1,z1,,i));
q.push_back(node(x1,y2,z1,,i));
q.push_back(node(x1,y1,z2,,i));
v.push_back(z1); v.push_back(z2);
ans[i] = ;
} }
//离散化
sort(v.begin(),v.end());
v.erase(unique(v.begin(),v.end()),v.end());
for(int i = ;i < q.size();i ++)
q[i].z = (lower_bound(v.begin(),v.end(),q[i].z)-v.begin())+;
cdq(,q.size()-);
for(int i = ;i < n;i ++)
if(ans[i] != -) printf("%d\n",ans[i]);
}
return ;
}

hdu 5126 stars (四维偏序,离线,CDQ套CDQ套树状数组)的更多相关文章

  1. HDU 5126 stars (四维偏序+树状数组)

    题目大意:略 题目传送门 四维偏序板子题 把插入操作和询问操作抽象成$(x,y,z,t)$这样的四元组 询问操作拆分成八个询问容斥 此外$x,y,z$可能很大,需要离散 直接处理四维偏序很困难,考虑降 ...

  2. HDU 5458 Stability(双连通分量+LCA+并查集+树状数组)(2015 ACM/ICPC Asia Regional Shenyang Online)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5458 Problem Description Given an undirected connecte ...

  3. HDU 5618 Jam's problem again (cdq分治+BIT 或 树状数组套Treap)

    题意:给n个点,求每一个点的满足 x y z 都小于等于它的其他点的个数. 析:三维的,第一维直接排序就好按下标来,第二维按值来,第三维用数状数组维即可. 代码如下: cdq 分治: #pragma ...

  4. HDU 4918 Query on the subtree(动态点分治+树状数组)

    题意 给定一棵 \(n\) 个节点的树,每个节点有点权.完成 \(q\) 个操作--操作分两种:修改点 \(x\) 的点权.查询与 \(x\) 距离小于等于 \(d\) 的权值总和. \(1 \leq ...

  5. HDU 5618 Jam's problem again(三维偏序,CDQ分治,树状数组,线段树)

    Jam's problem again Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Othe ...

  6. HDU 4247 Pinball Game 3D(cdq 分治+树状数组+动态规划)

    Pinball Game 3D Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  7. 【二维偏序】【树状数组】【权值分块】【分块】poj2352 Stars

    经典问题:二维偏序.给定平面中的n个点,求每个点左下方的点的个数. 因为 所有点已经以y为第一关键字,x为第二关键字排好序,所以我们按读入顺序处理,仅仅需要计算x坐标小于<=某个点的点有多少个就 ...

  8. BZOJ2683: 简单题(cdq分治 树状数组)

    Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 2142  Solved: 874[Submit][Status][Discuss] Descripti ...

  9. [luogu4479][BJWC2018]第k大斜率【二维偏序+二分+离散化+树状数组】

    传送门 https://www.luogu.org/problemnew/show/P4479 题目描述 在平面直角坐标系上,有 n 个不同的点.任意两个不同的点确定了一条直线.请求出所有斜率存在的直 ...

随机推荐

  1. android 权限动态申请

    名字其实有点让人感觉高大上"权限动态申请",其实也没有什么, 以前做Android程序的时候,比如需要打开摄像头 那么需要在 然后就可以了, 但是Android6.0之后呢,有些权 ...

  2. 一个比较变态的js传值,Query的bind、ajax闭包、上下文传值

    var getIDNameList = function (list, selected, text, btn, actionUrl, defaultKey, deleteKey, keyName, ...

  3. Ubuntu 16.04 下部署Node.js+MySQL微信小程序商城

    转载于这篇文章 关于pm2看这篇文章 最近在研究小程序,申请了域名之后,再一次来配置环境,根据作者的步骤基本上完成了网站的架构,但由于环境路径等不同,配置上会有所不同,因此记录下来. 1.更新系统和安 ...

  4. Ionic 部分手机升级不成功的问题

    Android端的手机App发布之后的一段时间,用户反馈App无法升级的情况. 原因分析: 对代码进行错误在线,提示是FileNOTFindException错误,确定是下载的时候保存的目的路径 不存 ...

  5. 一个有趣的问题——HTTP是“超文本传输协议”还是“超文本转移协议”

    最近在看<HTTP图解>这本书,书中提到了对国内对HTTP协议名称的翻译问题,并且给出了一些网友讨论的原稿链接,我看了一下觉得挺有意思的,另外我本人也觉得翻译对于理解协议本身非常重要,就整 ...

  6. 大数据处理过程核心技术ETL详细介绍

    架构挑战 1.对现有数据库管理技术的挑战. 2.经典数据库技术并没有考虑数据的多类别(variety).SQL(结构化数据查询语言),在设计的一开始是没有考虑到非结构化数据的存储问题. 3.实时性技术 ...

  7. 【持续更新中···】Linux下的小技巧

    1.Linux回到上级文件的命令: cd ..回到上一级目录(注意:cd 和..中间有空格) cd ~回到home目录 cd -回到某一目录

  8. flask-socketio笔记

    Flask-SocketIO使Flask应用程序可以访问客户端和服务器之间的低延迟双向通信. 客户端应用程序可以使用Javascript,C ++,Java和Swift中的任何SocketIO官方客户 ...

  9. width,height为多少px时,A4纸打印时刚好一页?

    计算方式一般的分辨率为XX像素/英寸,其中一英寸为25.4毫米.所以一毫米的像素数就为XX/25.4.现在的工作就是求XX的值了,把XX的值求出来以后,直接用XX/25.4 * 210就得到A4纸的像 ...

  10. RetrieveFavicon 获取任何站点的 favicon

    原文发表于我的技术博客 开源了一个获取任何站点 favicon 的类库,供使用. 原文发表于我的技术博客 RetrieveFavicon Project GitHub Retrieve favicon ...