题目描述

题解:

和二维的比起来差不多。

但是这是四维偏序。

所以搞一下CDQ套CDQ。

CDQ是维度a已经有序,按维度b排序,然后将维度c存入一维数据结构。

所以我们在第一层CDQ中分治处理,将合法的前一半打标记。

然后进入第二层CDQ,处理打标记的点对没打标记的点的影响。

可以说是将两维压成一维。

想法仍然是容斥。

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 50050
#define ll long long
inline int rd()
{
int f=,c=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){c=*c+ch-'';ch=getchar();}
return f*c;
}
struct node
{
int x,y,z,t,w,k,id;
int typ;
node(){}
node(int x,int y,int t,int w,int k,int i):x(x),y(y),t(t),w(w),k(k),id(i){}
}p[N<<],tmp[N<<],sec[N<<];
bool cmpx(node a,node b)
{
return a.x<b.x;
}
bool cmpid(node a,node b)
{
return a.id<b.id;
}
int cnt;
struct PR
{
int x,id;
PR(){}
PR(int x,int i):x(x),id(i){}
}Z[N<<];
bool cmp(PR a,PR b)
{
return a.x<b.x;
}
int T,Q,typ,tim;
int kkk[N<<],ct;
ll ans[N];
struct BIT
{
ll v[N<<];
void up(int x,ll d)
{
if(!x)return ;
while(x<(N<<))
v[x]+=d,x+=(x&-x);
}
ll down(int x)
{
if(!x)return ;
ll ret = 0ll;
while(x)
ret+=v[x],x-=(x&-x);
return ret;
}
}tr;
void init()
{
cnt=ct=;
tim=;
}
void ap(int x,int y,int z,int t,int w,int k)
{
cnt++;
p[cnt] = node(x,y,t,w,k,cnt);
Z[cnt] = PR(z,cnt);
}
void Sort(int l,int r)
{
int mid = (l+r)>>;
int i=l,j=mid+,k=l;
while(i<=mid&&j<=r)
{
while(i<=mid&&tmp[i].y<=tmp[j].y)
{
sec[k]=tmp[i];
i++,k++;
}
while(j<=r&&tmp[i].y>tmp[j].y)
{
sec[k]=tmp[j];
j++,k++;
}
}
while(i<=mid)
{
sec[k]=tmp[i];
i++,k++;
}
while(j<=r)
{
sec[k]=tmp[j];
j++,k++;
}
for(i=l;i<=r;i++)
tmp[i]=sec[i];
}
void cdq2(int l,int r)
{
if(l==r)return ;
int mid = (l+r)>>;
cdq2(l,mid);cdq2(mid+,r);
Sort(l,mid);Sort(mid+,r);
int i,j;
for(i=l,j=mid+;j<=r;j++)
{
while(i<=mid&&tmp[i].y<=tmp[j].y)
{
if(tmp[i].typ&&tmp[i].w)tr.up(tmp[i].z,tmp[i].w);
i++;
}
if(kkk[tmp[j].t]&&!tmp[j].typ)ans[kkk[tmp[j].t]]+=1ll*tmp[j].k*tr.down(tmp[j].z);
}
for(i=i-;i>=l;i--)
if(tmp[i].typ&&tmp[i].w)tr.up(tmp[i].z,-tmp[i].w);
}
void cdq1(int l,int r)
{
if(l==r)return ;
int mid = (l+r)>>;
cdq1(l,mid),cdq1(mid+,r);
sort(p+l,p+mid+,cmpx);
sort(p+mid+,p+r+,cmpx);
int i=l,j=mid+,k=l;
while(i<=mid&&j<=r)
{
while(i<=mid&&p[i].x<=p[j].x)
{
tmp[k]=p[i],tmp[k].typ=;
i++,k++;
}
while(j<=r&&p[i].x>p[j].x)
{
tmp[k]=p[j],tmp[k].typ=;
j++,k++;
}
}
while(i<=mid)
{
tmp[k]=p[i],tmp[k].typ=;
i++,k++;
}
while(j<=r)
{
tmp[k]=p[j],tmp[k].typ=;
j++,k++;
}
cdq2(l,r);
}
int main()
{
T=rd();
while(T--)
{
init();
Q = rd();
for(int ax,ay,az,bx,by,bz,i=;i<=Q;i++)
{
typ=rd();
if(typ==)
{
ax=rd(),ay=rd(),az=rd();
ap(ax,ay,az,tim,,);
}else
{
ax=rd(),ay=rd(),az=rd(),bx=rd(),by=rd(),bz=rd();
tim++,ct++;
kkk[tim]=ct;
ax--,ay--,az--;
ap(ax,ay,az,tim,,-);
ap(ax,ay,bz,tim,,);
ap(ax,by,az,tim,,);
ap(ax,by,bz,tim,,-);
ap(bx,ay,az,tim,,);
ap(bx,ay,bz,tim,,-);
ap(bx,by,az,tim,,-);
ap(bx,by,bz,tim,,);
tim++;
}
}
sort(Z+,Z++cnt,cmp);
for(int las=-,k=,i=;i<=cnt;i++)
{
if(las!=Z[i].x)
{
las = Z[i].x;
k++;
}
p[Z[i].id].z = k;
}
cdq1(,cnt);
for(int i=;i<=ct;i++)
printf("%I64d\n",ans[i]);
for(int i=;i<=ct;i++)
ans[i]=;
}
return ;
}

hdu5126 stars的更多相关文章

  1. HDU5126 stars【CDQ分治】*

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

  2. HDU5126 stars(CDQ分治)

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

  3. HDU5126 stars(cdq分治)

    传送门 题意: 先有两种操作,插入和查询,插入操作则插入一个点\((x,y,z)\),查询操作给出两个点\((x_1,y_1,z_1),(x_2,y_2,z_2)\),回答满足\(x_1\leq x\ ...

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

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

  5. 【HDU5126】 stars k-d树

    题目大意:有$m$个操作,分两种:在指定三维坐标内加入一个点,询问指定空间内点的数量. 其中$m≤5*10^{4},1≤x,y,z≤10^9$ 这题几乎就是裸的$k-d$树啊.我们动态维护一棵$k-d ...

  6. poj 2352 Stars 数星星 详解

    题目: poj 2352 Stars 数星星 题意:已知n个星星的坐标.每个星星都有一个等级,数值等于坐标系内纵坐标和横坐标皆不大于它的星星的个数.星星的坐标按照纵坐标从小到大的顺序给出,纵坐标相同时 ...

  7. POJ 2352 Stars(树状数组)

    Stars Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 30496   Accepted: 13316 Descripti ...

  8. 【POJ-2482】Stars in your window 线段树 + 扫描线

    Stars in Your Window Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11706   Accepted:  ...

  9. Java基础之在窗口中绘图——填充星型(StarApplet 2 filled stars)

    Applet程序. import javax.swing.*; import java.awt.*; import java.awt.geom.GeneralPath; @SuppressWarnin ...

随机推荐

  1. IT兄弟连 ElasticSearch在Linux下的安装和启动、常见问题解决

    环境要求 ·      Linux(Centos 7) ·      ElasticSerach 6.6.1 ES下载 ·      下载地址:https://www.elastic.co/cn/do ...

  2. iOS NSUserDefaults [setValue:forKey:] [setObject:forKey:] <Objc> setValue(_,forKey:) set(_,forKey) <Swift 3>

    前者其实是NSObject都可以调用的KVC方法,后者才是NSUserDefaults的实例方法: 这里参数的类型是nullable id,但是我建议你在传null的时候慎重考虑,否则你的应用就可能面 ...

  3. Hexo瞎折腾系列(5) - 使用hexo-neat插件压缩页面静态资源

    为什么要压缩页面静态资源 对于个人博客来说,优化页面的访问速度是很有必要的,如果打开你的个人站点,加载个首页就要十几秒,页面长时间处于空白状态,想必没什么人能够忍受得了吧.我个人觉得,如果能把页面的加 ...

  4. multiprocessing多进程模块

    1 基本理解 python不支持真多线程,无法在单进程中调用多核cpu.对于cpu密集型任务,可以使用多进程.python会调用OS原生多进程,运行在多核上,以此提高运行速度. 2 基本实现 impo ...

  5. Chips CodeForces - 333B

    Chips CodeForces - 333B 题意:有一个n*n的棋盘,其中有m个格子被禁止.在游戏开始前要将一些芯片(?)放到四条边上(但不能是角上).游戏开始后,每次操作将每一个芯片移动到它四周 ...

  6. Datapatch AND What to do if the status of a datapatch action was not SUCCESS due to finding non-ignorable errors

    1. Enterprise Manager: Starting version 12.1 Enterprise Manager now calls datapatch to complete post ...

  7. 1051 - Good or Bad DFS 记忆化搜索

    http://lightoj.com/volume_showproblem.php?problem=1051 对于每个位置,设dfs(cur, one, two)表示前i个字母,拥有辅音字母one个, ...

  8. Suricata的规则解读(默认和自定义)

    不多说,直接上干货! 见suricata官网 https://suricata.readthedocs.io/en/latest/rules/index.html 一.Suricata的规则所放位置 ...

  9. 基于ABP的Easyui admin framework正式开放源代码

    下载&反馈:http://www.webplus.org.cn v1.0 (2016/9/21) EF6+MVC5+API2+Easyui1.4.2开发 后台管理不使用iframe,全ajax ...

  10. Java基础--java简介

    1.Java的起源: Oak  -->  Java 2.Java的发展 Java1.0 Java2 JavaSE:Java平台标准版 JavaME:微型版 JavaEE:企业版 Sun公司 or ...