题目描述

题解:

和二维的比起来差不多。

但是这是四维偏序。

所以搞一下CDQ套CDQ。

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

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

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

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

想法仍然是容斥。

代码:

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. #define N 50050
  6. #define ll long long
  7. inline int rd()
  8. {
  9. int f=,c=;char ch=getchar();
  10. while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
  11. while(ch>=''&&ch<=''){c=*c+ch-'';ch=getchar();}
  12. return f*c;
  13. }
  14. struct node
  15. {
  16. int x,y,z,t,w,k,id;
  17. int typ;
  18. node(){}
  19. 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){}
  20. }p[N<<],tmp[N<<],sec[N<<];
  21. bool cmpx(node a,node b)
  22. {
  23. return a.x<b.x;
  24. }
  25. bool cmpid(node a,node b)
  26. {
  27. return a.id<b.id;
  28. }
  29. int cnt;
  30. struct PR
  31. {
  32. int x,id;
  33. PR(){}
  34. PR(int x,int i):x(x),id(i){}
  35. }Z[N<<];
  36. bool cmp(PR a,PR b)
  37. {
  38. return a.x<b.x;
  39. }
  40. int T,Q,typ,tim;
  41. int kkk[N<<],ct;
  42. ll ans[N];
  43. struct BIT
  44. {
  45. ll v[N<<];
  46. void up(int x,ll d)
  47. {
  48. if(!x)return ;
  49. while(x<(N<<))
  50. v[x]+=d,x+=(x&-x);
  51. }
  52. ll down(int x)
  53. {
  54. if(!x)return ;
  55. ll ret = 0ll;
  56. while(x)
  57. ret+=v[x],x-=(x&-x);
  58. return ret;
  59. }
  60. }tr;
  61. void init()
  62. {
  63. cnt=ct=;
  64. tim=;
  65. }
  66. void ap(int x,int y,int z,int t,int w,int k)
  67. {
  68. cnt++;
  69. p[cnt] = node(x,y,t,w,k,cnt);
  70. Z[cnt] = PR(z,cnt);
  71. }
  72. void Sort(int l,int r)
  73. {
  74. int mid = (l+r)>>;
  75. int i=l,j=mid+,k=l;
  76. while(i<=mid&&j<=r)
  77. {
  78. while(i<=mid&&tmp[i].y<=tmp[j].y)
  79. {
  80. sec[k]=tmp[i];
  81. i++,k++;
  82. }
  83. while(j<=r&&tmp[i].y>tmp[j].y)
  84. {
  85. sec[k]=tmp[j];
  86. j++,k++;
  87. }
  88. }
  89. while(i<=mid)
  90. {
  91. sec[k]=tmp[i];
  92. i++,k++;
  93. }
  94. while(j<=r)
  95. {
  96. sec[k]=tmp[j];
  97. j++,k++;
  98. }
  99. for(i=l;i<=r;i++)
  100. tmp[i]=sec[i];
  101. }
  102. void cdq2(int l,int r)
  103. {
  104. if(l==r)return ;
  105. int mid = (l+r)>>;
  106. cdq2(l,mid);cdq2(mid+,r);
  107. Sort(l,mid);Sort(mid+,r);
  108. int i,j;
  109. for(i=l,j=mid+;j<=r;j++)
  110. {
  111. while(i<=mid&&tmp[i].y<=tmp[j].y)
  112. {
  113. if(tmp[i].typ&&tmp[i].w)tr.up(tmp[i].z,tmp[i].w);
  114. i++;
  115. }
  116. if(kkk[tmp[j].t]&&!tmp[j].typ)ans[kkk[tmp[j].t]]+=1ll*tmp[j].k*tr.down(tmp[j].z);
  117. }
  118. for(i=i-;i>=l;i--)
  119. if(tmp[i].typ&&tmp[i].w)tr.up(tmp[i].z,-tmp[i].w);
  120. }
  121. void cdq1(int l,int r)
  122. {
  123. if(l==r)return ;
  124. int mid = (l+r)>>;
  125. cdq1(l,mid),cdq1(mid+,r);
  126. sort(p+l,p+mid+,cmpx);
  127. sort(p+mid+,p+r+,cmpx);
  128. int i=l,j=mid+,k=l;
  129. while(i<=mid&&j<=r)
  130. {
  131. while(i<=mid&&p[i].x<=p[j].x)
  132. {
  133. tmp[k]=p[i],tmp[k].typ=;
  134. i++,k++;
  135. }
  136. while(j<=r&&p[i].x>p[j].x)
  137. {
  138. tmp[k]=p[j],tmp[k].typ=;
  139. j++,k++;
  140. }
  141. }
  142. while(i<=mid)
  143. {
  144. tmp[k]=p[i],tmp[k].typ=;
  145. i++,k++;
  146. }
  147. while(j<=r)
  148. {
  149. tmp[k]=p[j],tmp[k].typ=;
  150. j++,k++;
  151. }
  152. cdq2(l,r);
  153. }
  154. int main()
  155. {
  156. T=rd();
  157. while(T--)
  158. {
  159. init();
  160. Q = rd();
  161. for(int ax,ay,az,bx,by,bz,i=;i<=Q;i++)
  162. {
  163. typ=rd();
  164. if(typ==)
  165. {
  166. ax=rd(),ay=rd(),az=rd();
  167. ap(ax,ay,az,tim,,);
  168. }else
  169. {
  170. ax=rd(),ay=rd(),az=rd(),bx=rd(),by=rd(),bz=rd();
  171. tim++,ct++;
  172. kkk[tim]=ct;
  173. ax--,ay--,az--;
  174. ap(ax,ay,az,tim,,-);
  175. ap(ax,ay,bz,tim,,);
  176. ap(ax,by,az,tim,,);
  177. ap(ax,by,bz,tim,,-);
  178. ap(bx,ay,az,tim,,);
  179. ap(bx,ay,bz,tim,,-);
  180. ap(bx,by,az,tim,,-);
  181. ap(bx,by,bz,tim,,);
  182. tim++;
  183. }
  184. }
  185. sort(Z+,Z++cnt,cmp);
  186. for(int las=-,k=,i=;i<=cnt;i++)
  187. {
  188. if(las!=Z[i].x)
  189. {
  190. las = Z[i].x;
  191. k++;
  192. }
  193. p[Z[i].id].z = k;
  194. }
  195. cdq1(,cnt);
  196. for(int i=;i<=ct;i++)
  197. printf("%I64d\n",ans[i]);
  198. for(int i=;i<=ct;i++)
  199. ans[i]=;
  200. }
  201. return ;
  202. }

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. 51nod 1247 可能的路径(gcd)

    传送门 题意 略 分析 有以下结论 \(1.(x,y)->(y,x)\) \(2.(x,y)->(a,b)==>(a,b)->(x,y)\) 证明 做如下变换 \((a,b)- ...

  2. HDU6035:Colorful Tree(树形DP)

    传送门 题意 给出一棵最小生成树及每个节点的颜色,询问\(\frac{n(n-1)}2\)条路径的权值和,一条路径的权值为该路径的颜色种数 分析 勉强理解了ftae的做法,但是代码还是不太会,还是太弱 ...

  3. Codeforces277A 【dfs联通块】

    题意: 给出n个人会的语言类型,然后问这n个人里面还需要几个人学习一下语言就可以n个直接互通了.a会1,2,b会2,3,c会4,那么只要C学一下1或者2,或者3就好了...大致就是这个意思. 思路: ...

  4. 百度编辑器ueditor插件的基本使用

    注意:该插件是基于tpframe开发,请在tpframe框架上使用 插件下载地址:https://pan.baidu.com/s/1MOJbd1goQC0Bn5-7HcIdKA 插件下载下来后解压到a ...

  5. Typora练习测试

    目录 一级标题 二级标题 三级标题 一级标题 二级标题 三级标题 这是下划线 删除线 字体加粗ctrl+b 这是倾斜线 1111 牛奶 面包 鸡蛋 包子 蛋糕 测试 牛奶 面包 鸡蛋 电脑 鼠标 键盘 ...

  6. vs2010中的ADO控件及绑定控件

    要在项目中添加某一个ActiveX控件,则该ActiveX控件必须要注册.由于VS2010中,并没有自动注册ADO及ADO数据绑定控件(Microsoft ADO Data Control,Micro ...

  7. AtCoder Grand Contest 013 E - Placing Squares

    题目传送门:https://agc013.contest.atcoder.jp/tasks/agc013_e 题目大意: 给定一个长度为\(n\)的木板,木板上有\(m\)个标记点,距离木板左端点的距 ...

  8. 接口测试_RESTClient基本使用

    火狐浏览器插件RESTClient基本使用. 消息头: Content-Type : application/x-www-form-urlencoded

  9. 宏 函数 内联函数inline

    带参宏有时候可以代替函数作用:优点直接替代,省去函数调用过程的开销:但缺点也是很明显:容易出错,系统不做检查非常容易出错. 改进方案:内联函数:既有带参宏的直接替代(拷贝)的优点,又有系统检查的优点. ...

  10. PHP使用iconv函数遍历数组转换字符集

    /** * 字符串/二维数组/多维数组编码转换 * @param string $in_charset * @param string $out_charset * @param mixed $dat ...