题目链接: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. Oracle 在存储过程或函数中执行字符串sql

    有时,我们需要在存储过程或函数中根据条件拼凑一些sql字符串语句,然后再执行拼凑后的sql字符串,如何做到呢? 参考以下代码: FUNCTION CALCULATE_TARGET_SCORE (CUR ...

  2. Luogu1967 NOIP2013 货车运输 最大生成树、倍增

    传送门 题意:给出一个$N$个节点.$M$条边的图,$Q$次询问,每一次询问两个点之间的所有可行路径中经过的边的边权的最小值中的最大值.$N \leq 10000 , M \leq 50000 , Q ...

  3. Intel Digital Innovation Industry Summit(2018.08.17)

    时间:2018.08.17地点:北京金隅喜来登大酒店

  4. HTML 图片轮播制作工具

    下载地址:http://wowslider.com/download/wowslider-win-setup.zip?utm_source=free_downl_win&utm_medium= ...

  5. mac brew update 报错

    环境为mac, 总共报了三种错误. 对应三种不同的解法. 1.   第一种如下, 提示 1.8 的版本找不到 $ brew update /usr/local/bin/brew: /usr/local ...

  6. 微信小程序——获取用户unionId

    1.获取code 2.获取openid 3.获取access_token 4.获取unionid

  7. Codeforces 718C solution

    C. Sasha and Array   time limit per test :  5 seconds memory limit per test :  256 megabytes Descrip ...

  8. synchronized和Lock的异同

    JAVA语言使用两种机制来实现堆某种共享资源的同步,synchronized和Lock.其中,synchronized使用Object对象本身的notify.wait.notifyAll调度机制,而l ...

  9. PHP生成QRCode二维码

    php生成QRCode二维码示例 <?php //引入 phpqrcode 类库 //phpqrcode下载地址:https://github.com/t0k4rt/phpqrcode //或从 ...

  10. ASS字幕制作

    虽然不常做视频,但正因为是偶尔用到,所以总是记不牢,特此笔记. Name 字体名称?Fontname 字体名称(\fn冬青黑体简体中文 W3)(\fnVogueSans)(例:\N{\fn冬青黑体简体 ...