一句话题意:给你三个数列{a_i},{b_i},{c_i},保证每个数列都恰好是一个排列。你需要求出满足\(a_i<a_j,b_i<b_j,c_i<c_j\)的有序对\((i,j)\)的数目。

提示:为了避免过量的输入对程序的运行效率产生影响,数列为生成的。

数据范围:

对于 100% 的数据,保证\(1≤n≤ 2*10^6\),

看似一个三维偏序,实际上cdq分治只能36分,还得卡常才能获得高于36分的好成绩。

事实上,因为这三个序列是排列,所以我们可以将其转化为3个二维偏序,如下:

\[x=\sum_{i,j}[a_i<a_j][b_i<b_j]
\]

\[y=\sum_{i,j}[a_i<a_j][c_i<c_j]
\]

\[z=\sum_{i,j}[b_i<b_j][c_i<c_j]
\]

我们知道合法方案必定满足上面任意一个二维偏序,而不合法方案最多满足上面的一个二维偏序,因为如果满足两个,就能满足第三个。

所以可以设合法方案数为sum,不合法方案数为k

那么有:

\[x+y+z=3*sum+k
\]

然后考虑怎么去掉不合法方案

我们知道每一个数对\((i,j)\)可能合法也可能不合法,所以所有的数对\((i,j)\)就包括\((sum+k)\),数对总数就是组合数啦\(C^2_n\)

代码:

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. const int N = 2e6+5;
  5. unsigned int SA,SB,SC;int n,d[N],b[N],c[N];
  6. unsigned int rd(){
  7. SA^=SA<<16;SA^=SA>>5;SA^=SA<<1;
  8. unsigned int t=SA;SA=SB;SB=SC;SC^=t^SA;return SC;
  9. }
  10. void gen(int *P){
  11. for (int i=1;i<=n;++i) P[i]=i;
  12. for (int i=1;i<=n;++i) swap(P[i],P[1+rd()%n]);
  13. }
  14. #define mid ((l+r)>>1)
  15. #define lowbit(i) (i&(-i))
  16. int f[N];long long ans,x,y,z;
  17. struct oo{int a,b,c;}a[N];
  18. void add(int x){for(int i=x;i<=n;i+=lowbit(i))f[i]++;}
  19. int get(int x){int ans=0;for(int i=x;i;i-=lowbit(i))ans+=f[i];return ans;}
  20. bool cmp1(oo a,oo b){return a.a<b.a;}
  21. bool cmp2(oo a,oo b){return a.b<b.b;}
  22. int main()
  23. {
  24. scanf("%d%u%u%u",&n,&SA,&SB,&SC);
  25. gen(d);gen(b);gen(c);
  26. for(int i=1;i<=n;i++)a[i]=(oo){d[i],b[i],c[i]};
  27. sort(a+1,a+n+1,cmp1);
  28. for(int i=1;i<=n;i++)x+=get(a[i].b),add(a[i].b);
  29. for(int i=1;i<=n;i++)f[i]=0;
  30. for(int i=1;i<=n;i++)y+=get(a[i].c),add(a[i].c);
  31. for(int i=1;i<=n;i++)f[i]=0;
  32. sort(a+1,a+n+1,cmp2);
  33. for(int i=1;i<=n;i++)z+=get(a[i].c),add(a[i].c);
  34. ans=1ll*n*(n-1)/2;
  35. printf("%lld\n",(x+y+z-ans)>>1);
  36. }

cdq(2018.10.18)的更多相关文章

  1. 2018.10.18 bzoj1185: [HNOI2007]最小矩形覆盖(旋转卡壳)

    传送门 不难看出最后的矩形一定有一条边与凸包某条边重合. 因此先求出凸包,然后旋转卡壳求出当前最小矩形面积更新答案. 代码: #include<bits/stdc++.h> #define ...

  2. hard(2018.10.18)

    题意:给你一棵\(n\)个节点的树,\(q\)个询问,每次询问读入\(u,v,k,op\),需要满足树上有\(k\)对点的简单路径交都等于\(u,v\)之间的简单路径,\(op=1\)表示\(k\)对 ...

  3. 【2018.10.18】noip模拟赛Day2 地球危机(2018年第九届蓝桥杯C/C++A组省赛 三体攻击)

    题目描述 三体人将对地球发起攻击.为了抵御攻击,地球人派出了 $A × B × C$ 艘战舰,在太 空中排成一个 $A$ 层 $B$ 行 $C$ 列的立方体.其中,第 $i$ 层第 $j$ 行第 $k ...

  4. 2018.10.18 NOIP训练 01矩阵(组合数学)

    传送门 组合数学好题. 题目要求输出的结果成功把概率转化成了种类数. 本来可以枚举统计最小值为iii时的概率. 现在只需要统计最小值为iii时的方案数,每一行有不少于iii个1的方案数. 显然一行选i ...

  5. 2018.10.18 NOIP训练 [SCOI2018]Pipi 酱的日常(线段树)

    传送门 线段树好题啊. 题目要求的是sum−a−b−c+maxsum-a-b-c+maxsum−a−b−c+max{∣a+v∣+∣b+v∣+∣c+v∣|a+v|+|b+v|+|c+v|∣a+v∣+∣b ...

  6. 2018.10.18 NOIP训练 ZUA球困难综合征(线段树)

    传送门 考虑到模数等于7 * 13 * 17 * 19. 那么只需要维护四棵线段树求出每个数处理之后模7,13,17,197,13,17,197,13,17,19的值再用crtcrtcrt合并就行了. ...

  7. 2018.10.18 poj2187Beauty Contest(旋转卡壳)

    传送门 旋转卡壳板子题. 就是求凸包上最远点对. 直接上双指针维护旋转卡壳就行了. 注意要时刻更新最大值. 代码: #include<iostream> #include<cstdi ...

  8. 2018.10.18 bzoj4105: [Thu Summer Camp 2015]平方运算(线段树)

    传送门 线段树妙题. 显然平方几次就会循环(打表证明不解释). 然后所有环长度的lcmlcmlcm不大于70. 因此维护一下当前区间中的节点是否全部在环上. 不是直接暴力到叶子节点修改. 否则整体打标 ...

  9. 【2018.10.18】CXM笔记(动态规划)

    1.给你一棵树,让你修任意多条点不相交的铁路(每条铁路都是一根链),定义一个点的代价为它到根节点的路径中不在铁路上的边数,求一种设计方案代价最大的点最小. 铁路点不相交与 每个点连出去的铁路条数 $\ ...

随机推荐

  1. 【智能无线小车系列八】在树莓派上使用USB网卡

    在这个腾“云”驾“物”(云:云计算,物:物联网)的时代,什么都可以没有,就是不能没有网络,树莓派也离不开它.本章节将详细介绍如何将树莓派接入互联网,因为有一些后期将要使用到的小软件需要联网进行下载和安 ...

  2. 如何缓存hbase数据以减少下次取数据的时间

    缓存从hbase取得的数据的好处是显而易见的,缓存到本地以后,如果下次的输入能够直接从已缓存的本地文件中取得数据就无需再次访问hbase数据库,这样一来数据量大的话可以节省大量的访问hbase数据库的 ...

  3. platform_set_drvdata 和 platform_get_drvdata

    ndev是我们在probe函数中定义的局部变量,如果我想在其他地方使用它怎么办呢? 这就需要把它保存起来.内核提供了这个方法,使用函数platform_set_drvdata()可以将ndev保存成平 ...

  4. struts2中<s:if>标签的使用

    转载:http://blog.sina.com.cn/s/blog_5f9938640100v2kr.html A:<s:if>判断字符串的问题: 1.判断单个字符:<s:if te ...

  5. spring mvc提交日期类型参数

    如题,spring mvc直接提交Date类型参数会报错,400 bad request的错误.在controller里加上 @InitBinder protected void initBinder ...

  6. Linux GCC常用命令学习

    1简介 GCC 的意思也只是 GNU C Compiler 而已.经过了这么多年的发展,GCC 已经不仅仅能支持 C 语言:它现在还支持 Ada 语言.C++ 语言.Java 语言.Objective ...

  7. 使用diskpart命令修复U盘分区

    前段时间在论坛上讨论封装PE到u盘里热闹的,就想自己也封装一个,随便下载了一个WIN7的PE封装后发现还不错,本来就是做测试用的,测试完了就想把u盘在恢复成以前的样子,可是发现恢复并不是这么容易 如下 ...

  8. 在KitKat(Android 4.4.2) 推送网址给手机

    弱者才会回避问题. 最近想把网址推送给手机实现后台下载,打算故技重施,用短信传送然后中断广播的方法实现隐蔽传送.试了半天发现怎么现在拦不住短信了.查了一下才发现原来Android4.4增加了一个安全机 ...

  9. Linux 下Input系统应用编程实战

    作者:杨源鑫(也是我们的校园代理) 经授权转载于公众号嵌入式开发圈,有些许修改. 什么是input子系统?不管是什么操作系统,都有一个程序用于管理各种输入设备,哪些是输入设备?比如,电脑键盘.鼠标,智 ...

  10. python 去停用词

    Try caching the stopwords object, as shown below. Constructing this each time you call the function ...