题目描述

题解:

和二维的比起来差不多。

但是这是四维偏序。

所以搞一下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. css margin边界叠加问题详谈

    问题:给子元素一个margin-top值,其父元素会跟着往下走margin-top的值 一.代码展示 HTML <body> <div class="box"&g ...

  2. POJ2533/hdoj1950【DP】

    O(nlog(n))的方法: 定义d[k]:长度为k的上升子序列的最末元素,若有多个长度为k的上升子序列,则记录最小的那个最末元素. d中元素也是单调递增的. #include <iostrea ...

  3. the little schemer 笔记(10)

    第十章 What Is  the Value of All of This? entry条目 是由list表组成的 pair 对,pair 对的第一个list表是集合 set.另外,两个list表的长 ...

  4. Hdu 5496 Beauty of Sequence (组合数)

    题目链接: Hdu 5496 Beauty of Sequence 题目描述: 一个整数序列,除去连续的相同数字(保留一个)后,序列的和成为完美序列和.问:一个整数序列的所有子序列的完美序列和? 解题 ...

  5. 洛谷P3379lca,HDU2586,洛谷P1967货车运输,倍增lca,树上倍增

    倍增lca板子洛谷P3379 #include<cstdio> struct E { int to,next; }e[]; ],anc[][],log2n,deep[],n,m,s,ne; ...

  6. 洛谷 P1199 三国游戏

    参考:Solution_ID:17 题解 更新时间: 2016-11-13 21:01 这道题要求最后得到的两方的默契值最大的武将,小涵的默契值大于计算机,首先,我们这个解法获胜的思路是,每个武将对应 ...

  7. solrJ的使用--覆盖创建索引,查询,删除索引【转自http://blog.sina.com.cn/s/blog_64ac3ab10100t3mq.html】

    package com.xzhe.common.search; import java.util.ArrayList; import java.util.Collection; import java ...

  8. 洛谷P2774 方格取数问题(最小割)

    题意 $n \times m$的矩阵,不能取相邻的元素,问最大能取多少 Sol 首先补集转化一下:最大权值 = sum - 使图不连通的最小权值 进行黑白染色 从S向黑点连权值为点权的边 从白点向T连 ...

  9. 【经验总结】关于使用某些第三方插件库元素设置display:none后重新show不显示的问题;(display、opacity、宽高0的使用场景)

    display:none 直接取消元素所占用的位置(但是元素还是存在的),后面元素看他就相当于不存在了: opacity:0  隐藏,但是其依旧占用位置: height.width:0 和displa ...

  10. iOS 解决iOS 9下的http请求发送失败问题

    iOS9中 因为系统要求所有的请求都必须使用https, 所以发送http请求会失败,如果想让程序能够兼容http请求 在info.plist中添加以下代码: 这里需要做的是右键info.plist文 ...