[COGS2479]偏序

题目大意:

\(n(n\le50000)\)个四元组,求四维偏序。

思路:

CDQ分治套CDQ分治套树状数组。

细节:

第二层CDQ之前要备份数组\(a\),否则第二层CDQ结束以后\(a\)就不对了。

源代码:

  1. #include<cstdio>
  2. #include<cctype>
  3. #include<algorithm>
  4. inline int getint() {
  5. register char ch;
  6. while(!isdigit(ch=getchar()));
  7. register int x=ch^'0';
  8. while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
  9. return x;
  10. }
  11. const int N=50001;
  12. int n,ans;
  13. struct Node {
  14. int id,x,y,z,type;
  15. };
  16. Node a[N],tmp[N];
  17. inline bool cmp1(const Node &p1,const Node &p2) {
  18. return p1.x<p2.x;
  19. }
  20. inline bool cmp2(const Node &p1,const Node &p2) {
  21. return p1.y<p2.y;
  22. }
  23. class FenwickTree {
  24. private:
  25. int val[N];
  26. int lowbit(const int &x) const {
  27. return x&-x;
  28. }
  29. public:
  30. void modify(int p,const int &x) {
  31. for(;p<=n;p+=lowbit(p)) val[p]+=x;
  32. }
  33. int query(int p) const {
  34. int ret=0;
  35. for(;p;p-=lowbit(p)) ret+=val[p];
  36. return ret;
  37. }
  38. };
  39. FenwickTree t;
  40. void cdq2(const int &b,const int &e) {
  41. if(b==e) return;
  42. const int mid=(b+e)>>1;
  43. cdq2(b,mid);
  44. cdq2(mid+1,e);
  45. int p=b,q=mid+1;
  46. for(;q<=e;q++) {
  47. if(a[q].type==1) continue;
  48. for(;p<=mid&&a[p].y<a[q].y;p++) {
  49. if(a[p].type==1) t.modify(a[p].z,1);
  50. }
  51. ans+=t.query(a[q].z);
  52. }
  53. while(--p>=b) {
  54. if(a[p].type==1) t.modify(a[p].z,-1);
  55. }
  56. std::inplace_merge(&a[b],&a[mid]+1,&a[e]+1,cmp2);
  57. }
  58. void cdq1(const int &b,const int &e) {
  59. if(b==e) return;
  60. const int mid=(b+e)>>1;
  61. cdq1(b,mid);
  62. cdq1(mid+1,e);
  63. for(register int i=b;i<=mid;i++) a[i].type=1;
  64. for(register int i=mid+1;i<=e;i++) a[i].type=2;
  65. std::inplace_merge(&a[b],&a[mid]+1,&a[e]+1,cmp1);
  66. std::copy(&a[b],&a[e]+1,&tmp[b]);
  67. cdq2(b,e);
  68. std::copy(&tmp[b],&tmp[e]+1,&a[b]);
  69. }
  70. int main() {
  71. freopen("partial_order.in","r",stdin);
  72. freopen("partial_order.out","w",stdout);
  73. n=getint();
  74. for(register int i=1;i<=n;i++) a[i].id=i;
  75. for(register int i=1;i<=n;i++) a[i].x=getint();
  76. for(register int i=1;i<=n;i++) a[i].y=getint();
  77. for(register int i=1;i<=n;i++) a[i].z=getint();
  78. cdq1(1,n);
  79. printf("%d\n",ans);
  80. return 0;
  81. }

[COGS2479]偏序的更多相关文章

  1. cogs2479 偏序(CDQ套CDQ)

    题目链接 思路 四维偏序 \(CDQ\)套\(CDQ\),第一维默认有序.第二维用第一个\(CDQ\)变成有序的.并且对每个点标记上第一维属于左边还是右边.第二个\(CDQ\)处理第三维,注意两个\( ...

  2. cogs2479 偏序 cdq+树套树

    cdq+树状数组套替罪羊树. cdq归并a,树套树解决b,c. 记住平衡树树根不能暴力清零!!! // It is made by XZZ #include<cstdio> #includ ...

  3. 几道很Interesting的偏序问题

    若干道偏序问题(STL,分块) 找了4道题目 BZOJ陌上花开(权限题,提供洛谷链接) Cogs2479偏序 Cogs2580偏序II Cogs2639偏序++ 作为一个正常人,肯定先看三维偏序 做法 ...

  4. 【COGS2479】 HZOI2016—偏序

    http://cogs.pro/cogs/problem/problem.php?pid=2479 (题目链接) 题意 四维偏序. Solution CDQ套CDQ. 细节 第二次分治不能直接按照mi ...

  5. [COGS2479 && COGS2639]高维偏序(CDQ分治,bitset)

    COGS2479:四维偏序. CDQ套CDQ CDQ:对a分治,对b排序,再对a打标记,然后执行CDQ2 CDQ2:对b分治,对c归并排序,对d树状数组. #include<cstdio> ...

  6. COGS2479(四维偏序)

    题意:给定一个有n个元素的序列,元素编号为1~n,每个元素有三个属性a,b,c,求序列中满足i<j且ai<aj且bi<bj且ci<cj的数对(i,j)的个数. 分析:cdq分治 ...

  7. 【教程】CDQ套CDQ——四维偏序问题

    前言 上一篇文章已经介绍了简单的CDQ分治,包括经典的二维偏序和三维偏序问题,还有带修改和查询的二维/三维偏序问题.本文讲介绍多重CDQ分治的嵌套,即多维偏序问题. 四维偏序问题       给定N( ...

  8. c++模板函数实例化的偏序机制

    一:废话 今天在stackoverflow上看到一个关于c++模板specialization的问题: http://stackoverflow.com/questions/18283851/temp ...

  9. COGS 2479 偏序 题解

    [题意] 给定一个有n个元素的序列,元素编号为1~n,每个元素有三个属性a,b,c,求序列中满足i<j且ai<aj且bi<bj且ci<cj的数对(i,j)的个数. 对于30%的 ...

随机推荐

  1. macOS 安装 pcl 1.8.0

    Mac 上的 pcl 一直有问题. 找不到 pcl_viewer 查看 pcd 文件.写个程序用 pcl::visualization::CloudViewer 查看点云,遇到 Runtime Exc ...

  2. Java基础break、continue语句的用法

    break适用范围:只能用于switch或者是循环语句中.当然可以用于增强for循环. break作用: 1. break用于switch语句的作用是结束一个switch语句. 2. break用于循 ...

  3. 基于NIO的同步非阻塞编程完整案例,客户端发送请求,服务端获取数据并返回给客户端数据,客户端获取返回数据

    这块还是挺复杂的,挺难理解,但是多练几遍,多看看研究研究其实也就那样,就是一个Selector轮询的过程,这里想要双向通信,客户端和服务端都需要一个Selector,并一直轮询, 直接贴代码: Ser ...

  4. Virut样本取证特征

    1.网络特征 ant.trenz.pl ilo.brenz.pl 2.文件特征 通过对文件的定位,使用PEID查看文件区段,如果条件符合增加了7个随机字符区段的文件,则判定为受感染文件. 3.受感染特 ...

  5. Java不为人知的小秘密

    Java中的main方法必须有一个外壳类,而且必须是静态的! Java中的所有函数都属于某个类的方法,所以main方法也不例外,必须放在一个类中才能编译运行. 例如: public class tex ...

  6. strace使用详解(未研究)

    (一) strace 命令    用途:打印 STREAMS 跟踪消息. 语法:strace [ mid sid level ] ... 描述:没有参数的 strace 命令将所有的驱动程序和模块中的 ...

  7. 编译器是如何实现32位整型的常量整数除法优化的?[C/C++]

    引子 在我之前的一篇文章[ ThoughtWorks代码挑战——FizzBuzzWhizz游戏 通用高速版(C/C++ & C#) ]里曾经提到过编译器在处理除数为常数的除法时,是有优化的,今 ...

  8. Java项目打war包的方法

    我们可以运用DOS命令来手工打war包: 首先,打开DOS命令行,敲入“jar”,我们发现它提示不是内部或外部的命令这样的错误,这时八成是你的JAVA环境没有配置好,我们可以用JAVA_HOME方式或 ...

  9. 栈应用之 背包问题(Python 版)

    栈应用之 背包问题 背包问题描述:一个背包里可以放入重量为weight的物品,现有n件物品的集合s,其中物品的重量为别为w0,w1,...,wn-1.问题是能否从中选出若干件物品,其重量之和正好等于w ...

  10. 使用html+css+js实现魔性的舞蹈

    使用html+css+js实现魔性的舞蹈,让我们燥起来!!! 效果图: 代码如下,复制代码即可使用: <!DOCTYPE html> <html > <head> ...