题目大意:略 题目传送门

四维偏序板子题

把插入操作和询问操作抽象成$(x,y,z,t)$这样的四元组

询问操作拆分成八个询问容斥

此外$x,y,z$可能很大,需要离散

直接处理四维偏序很困难,考虑降维

而$t$这一维有一个神奇的性质,任意两个四元组的$t$互不相同,是最好处理的,所以尽量保证$t$这一维也出现在降维之后的$cdq$分治里

外层把所有四元组按$x$排序,回溯按$t$排序

现在要处理左区间对右区间的影响了,把左区间里的所有四元组打上$0$标记,右区间里的所有四元组打上$1$标记

只有带$0$标记的四元组能影响$1$标记的四元组

就这样我们消掉了$x$这一维,只剩下$(y,z,t)$,再在当前区间跑三维偏序即可

 #include <cstdio>
#include <cstring>
#include <algorithm>
#define N1 100010
#define M1 400010
#define ll long long
#define dd double
#define cll const long long
using namespace std; int gint()
{
int ret=,fh=;char c=getchar();
while(c<''||c>''){if(c=='-')fh=-;c=getchar();}
while(c>=''&&c<=''){ret=ret*+c-'';c=getchar();}
return ret*fh;
}
struct BIT{
int s[N1],ma;
void update(int x,int w){ for(int i=x;i<=ma;i+=(i&(-i))) s[i]+=w; }
int query(int x){ int ans=; for(int i=x;i>;i-=(i&(-i))) ans+=s[i]; return ans; }
void clr(int x){ for(int i=x;i<=ma;i+=(i&(-i))) s[i]=; }
}s;
int n,m,nn,T;
struct node{int x,y,z,t,p,tag,id;}a[M1],b[M1],tmp[M1];
int xx[N1],nx,yy[N1],ny,zz[N1],nz,f[N1],que[M1],tl; int cmp1(node s1,node s2)
{
if(s1.x!=s2.x) return s1.x<s2.x;
if(s1.y!=s2.y) return s1.y<s2.y;
if(s1.z!=s2.z) return s1.z<s2.z;
return s1.p*s1.p<s2.p*s2.p;
}
int cmp2(node s1,node s2)
{
if(s1.y!=s2.y) return s1.y<s2.y;
if(s1.z!=s2.z) return s1.z<s2.z;
if(s1.tag!=s2.tag) return s1.tag<s2.tag;
return s1.p*s1.p<s2.p*s2.p;
}
int cmp3(node s1,node s2){return s1.t<s2.t;}
int de; void CDQ2(int L,int R)
{
if(R-L<=) return;
int M=(L+R)>>,i,j,cnt;
CDQ2(L,M); CDQ2(M,R);
for(i=L,j=M,cnt=;i<M&&j<R;)
{
if(cmp2(b[i],b[j])){
if(!b[i].tag&&!b[i].p){ s.update(b[i].z,); que[++tl]=i; }
tmp[++cnt]=b[i]; i++;
}else{
if(b[j].tag&&b[j].p){ f[b[j].id]+=b[j].p*s.query(b[j].z); }
tmp[++cnt]=b[j]; j++;
}
}
while(i<M){ tmp[++cnt]=b[i]; i++; }
while(j<R){ if(b[j].tag&&b[j].p) f[b[j].id]+=b[j].p*s.query(b[j].z); tmp[++cnt]=b[j]; j++; }
while(tl){ s.clr(b[que[tl--]].z); }
for(i=L;i<R;i++){ b[i]=tmp[i-L+]; }
}
void CDQ1(int L,int R)
{
if(R-L<=) return;
int M=(L+R)>>,i,j,cnt;
CDQ1(L,M); CDQ1(M,R);
for(i=L,j=M,cnt=;i<M&&j<R;)
{
if(a[i].t<a[j].t){ tmp[++cnt]=a[i]; tmp[cnt].tag=; i++; }
else{ tmp[++cnt]=a[j]; tmp[cnt].tag=; j++;}
}
while(i<M){ tmp[++cnt]=a[i]; tmp[cnt].tag=; i++; }
while(j<R){ tmp[++cnt]=a[j]; tmp[cnt].tag=; j++; }
for(nx=,i=L;i<R;i++){ a[i]=b[i-L+]=tmp[i-L+]; }
sort(b+,b+R-L+,cmp3);
for(i=;i<=R-L;i++){ b[i].t=i; }
CDQ2(,R-L+);
} int main()
{
scanf("%d",&T);
while(T--){ scanf("%d",&n);
int i,x,y,z,xa,xb,ya,yb,za,zb,p;
for(nn=,nx=,ny=,nz=,i=;i<=n;i++)
{
p=gint(); f[i]=;
if(p==){
x=gint(); y=gint(); z=gint(); f[i]=-;
nn++; a[nn].x=x; a[nn].y=y; a[nn].z=z; a[nn].t=nn; a[nn].p=;
xx[++nx]=x; yy[++ny]=y; zz[++nz]=z;
}else{
xa=gint(); ya=gint(); za=gint(); xb=gint(); yb=gint(); zb=gint(); xa--; ya--; za--;
xx[++nx]=xa; xx[++nx]=xb; yy[++ny]=ya; yy[++ny]=yb; zz[++nz]=za; zz[++nz]=zb;
nn++; a[nn].x=xa; a[nn].y=ya; a[nn].z=za; a[nn].t=nn; a[nn].id=i; a[nn].p=-;
nn++; a[nn].x=xb; a[nn].y=ya; a[nn].z=za; a[nn].t=nn; a[nn].id=i; a[nn].p=;
nn++; a[nn].x=xa; a[nn].y=yb; a[nn].z=za; a[nn].t=nn; a[nn].id=i; a[nn].p=;
nn++; a[nn].x=xa; a[nn].y=ya; a[nn].z=zb; a[nn].t=nn; a[nn].id=i; a[nn].p=;
nn++; a[nn].x=xa; a[nn].y=yb; a[nn].z=zb; a[nn].t=nn; a[nn].id=i; a[nn].p=-;
nn++; a[nn].x=xb; a[nn].y=ya; a[nn].z=zb; a[nn].t=nn; a[nn].id=i; a[nn].p=-;
nn++; a[nn].x=xb; a[nn].y=yb; a[nn].z=za; a[nn].t=nn; a[nn].id=i; a[nn].p=-;
nn++; a[nn].x=xb; a[nn].y=yb; a[nn].z=zb; a[nn].t=nn; a[nn].id=i; a[nn].p=;
}
}
sort(xx+,xx+nx+); nx=unique(xx+,xx+nx+)-(xx+);
sort(yy+,yy+ny+); ny=unique(yy+,yy+ny+)-(yy+);
sort(zz+,zz+nz+); nz=unique(zz+,zz+nz+)-(zz+);
for(i=;i<=nn;i++)
{
a[i].x=lower_bound(xx+,xx+nx+,a[i].x)-xx;
a[i].y=lower_bound(yy+,yy+ny+,a[i].y)-yy;
a[i].z=lower_bound(zz+,zz+nz+,a[i].z)-zz;
}
sort(a+,a+nn+,cmp1); s.ma=nz;
CDQ1(,nn+);
for(i=;i<=n;i++)
if(f[i]!=-) printf("%d\n",f[i]); }
return ;
}

HDU 5126 stars (四维偏序+树状数组)的更多相关文章

  1. hdu 5126 stars (四维偏序,离线,CDQ套CDQ套树状数组)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5126 思路:支持离线,那么我们可以用两次CDQ分治使四维降为二维,降成二维后排个序用树状数组维护下就好 ...

  2. HDU 5862 Counting Intersections(离散化+树状数组)

    HDU 5862 Counting Intersections(离散化+树状数组) 题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=5862 D ...

  3. hdu 5517 Triple(二维树状数组)

    Triple Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  4. 洛谷 P1972 [SDOI2009]HH的项链-二维偏序+树状数组+读入挂(离线处理,思维,直接1~n一边插入一边查询),hahahahahahaha~

    P1972 [SDOI2009]HH的项链 题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含 ...

  5. 计蒜客 41391.query-二维偏序+树状数组(预处理出来满足情况的gcd) (The Preliminary Contest for ICPC Asia Xuzhou 2019 I.) 2019年徐州网络赛)

    query Given a permutation pp of length nn, you are asked to answer mm queries, each query can be rep ...

  6. 2019-ACM-ICPC-徐州站网络赛- I. query-二维偏序+树状数组

    2019-ACM-ICPC-徐州站网络赛- I. query-二维偏序+树状数组 [Problem Description] ​ 给你一个\([1,n]\)的排列,查询\([l,r]\)区间内有多少对 ...

  7. HDU 5517 【二维树状数组///三维偏序问题】

    题目链接:[http://acm.split.hdu.edu.cn/showproblem.php?pid=5517] 题意:定义multi_set A<a , d>,B<c , d ...

  8. HDU 1394 Minimum Inversion Number ( 树状数组求逆序数 )

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 Minimum Inversion Number                         ...

  9. HDU 5862 Counting Intersections (树状数组)

    Counting Intersections 题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5862 Description Given ...

随机推荐

  1. Storm工作流程 vs. Spark Stream

    看的这个学习课程: http://study.163.com/course/courseLearn.htm?courseId=1002887002#/learn/video?lessonId=1003 ...

  2. TensorFlow 入门之手写识别(MNIST) softmax算法 二

    TensorFlow 入门之手写识别(MNIST) softmax算法 二 MNIST Fly softmax回归 softmax回归算法 TensorFlow实现softmax softmax回归算 ...

  3. fputs与fgets

    1.      fputs 函数名: fputs  功  能: 送一个字符到一个流中  用  法: int fputs(char *string, FILE *stream); 说明: fputs是一 ...

  4. Lua 与C/C++ 交互系列:注冊枚举enum到Lua Code中

    在Lua Code中注冊C/C++的枚举很easy,就像注冊全局变量一样.我们使用枚举名称作为命名空间,来避免注冊的枚举发生冲突.注冊的枚举存储在全局环境(线程环境)中. 当在Lua Code中訪问枚 ...

  5. HDU 4607 Park visit (求树的直径)

    解题思路: 通过两次DFS求树的直径,第一次以随意点作为起点,找到距离该点距离最远的点,则能够证明这个点一定在树的直径上,然后以该点为起点进行DFS得到的最长路就是树的直径. 最后的询问,假设K &l ...

  6. Qt的Socket数据通讯的一个样例。

    QTcpServer类 用来侦听port ,获取QTcpSocket. QTcpSocket有  connected的信号(已经连接),还有readyread()信号,表示已经有数据发过来了.准备读取 ...

  7. HDU--1558--Segment set--并查集***经典***

    Segment set Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  8. Objective-c基础知识学习笔记

    Objective-c基础知识学习笔记(一) 一直有记录笔记的习惯.但非常久没分享一些东西了,正好上半年開始学习IOS了,如今有空写点.因开发须要,公司特意为我们配置了几台新MAC.还让我们自学了2周 ...

  9. RabbitMQ(三) 集群配置

    RabbitMQ--集群配置 之前不管是搞Redis.SQL.Mongo还是其他的东西,一律都没说过集群要怎么搞,电脑实在是带不动.说透彻点就是懒,懒得搭也懒得写,今日深刻意识到错误,做学问是不能懒的 ...

  10. Hadoop MapReduce编程 API入门系列之FOF(Fund of Fund)(二十三)

    不多说,直接上代码. 代码 package zhouls.bigdata.myMapReduce.friend; import org.apache.hadoop.io.Text; public cl ...