题意:给你三个1~n的排列a,b,c,问你在 (i,j)(1<=i<=n,1<=j<=n,i≠j),有多少个有序实数对(i,j)满足在三个排列中,i都在j的前面。

暴力求的话是三维偏序,相对比较困难。但是我们可以用一些简单的方法。

设在a中i在j前面的有序实数对数为A,b中为B,c中为C。(其实显然A=B=C=n*(n-1)/2)

要求的即为A∩B∩C。

利用容斥原理A+B+C-A∩B-A∩C-B∩C+A∩B∩C=A∪B∪C ①,以及Ω-A∪B∪C=A∩B∩C ②可容易求得。(显然Ω=n*(n-1))

②式怎么来的呢?显然,在三个序列中均满足i在j前面的有序实数对(i,j),必然与在三个序列中都未出现的有序实数对(j,i)一一对应,证毕。

而A∩B、A∩C、B∩C都可以通过二维偏序(排序+树状数组)求得。

所以最后答案就是(n*(n-1)-(n*(n-1)/2*3-A∩B-A∩C-B∩C))/2。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int n;
int d[200005];
void Update(int p){for(;p<=n;p+=(p&(-p))) ++d[p];}
int Query(int p){int res=0; for(;p;p-=(p&(-p))) res+=d[p]; return res;}
ll A[3];
struct data{
int x,y;
data(const int &x,const int &y){
this->x=x;
this->y=y;
}
data(){}
}a[200005],b[200005],c[200005],p[3][200005];
bool operator < (const data &a,const data &b){
return a.x<b.x;
}
int main(){
// freopen("g.in","r",stdin);
scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%d",&a[i].x);
a[i].y=i;
}
sort(a+1,a+n+1);
for(int i=1;i<=n;++i){
scanf("%d",&b[i].x);
b[i].y=i;
}
sort(b+1,b+n+1);
for(int i=1;i<=n;++i){
scanf("%d",&c[i].x);
c[i].y=i;
}
sort(c+1,c+n+1);
for(int i=1;i<=n;++i){
p[0][i]=data(a[i].y,b[i].y);
p[1][i]=data(a[i].y,c[i].y);
p[2][i]=data(b[i].y,c[i].y);
}
for(int i=0;i<3;++i){
sort(p[i]+1,p[i]+n+1);
memset(d,0,sizeof(d));
for(int j=1;j<=n;++j){
A[i]+=(ll)Query(p[i][j].y);
Update(p[i][j].y);
}
}
printf("%I64d\n",((ll)n*(ll)(n-1)-((ll)n*(ll)(n-1)/2ll*3ll-A[0]-A[1]-A[2]))/2ll);
return 0;
}

【容斥原理】【推导】【树状数组】Gym - 101485G - Guessing Camels的更多相关文章

  1. HDU 4777 Rabbit Kingdom --容斥原理+树状数组

    题意: 给一个数的序列,询问一些区间,问区间内与区间其他所有的数都互质的数有多少个. 解法: 直接搞有点难, 所谓正难则反,我们求区间内与其他随便某个数不互质的数有多少个,然后区间长度减去它就是答案了 ...

  2. Codeforces Gym 100114 H. Milestones 离线树状数组

    H. Milestones Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Descripti ...

  3. Gym 101908C - Pizza Cutter - [树状数组]

    题目链接:https://codeforces.com/gym/101908/problem/C 题意: 一块正方形披萨,有 $H$ 刀是横切的,$V$ 刀是竖切的,不存在大于等于三条直线交于一点.求 ...

  4. Codeforces Gym 100269F Flight Boarding Optimization 树状数组维护dp

    Flight Boarding Optimization 题目连接: http://codeforces.com/gym/100269/attachments Description Peter is ...

  5. Gym - 101630G The Great Wall (前缀和+树状数组+二分)

    题意:有一个序列,一开始所有的元素都是ai,你可以选择两个长度相等的区间,如果某个元素被一个区间覆盖,那么变为bi,如果被两个区间都覆盖,那么变为ci.问所有区间的选择方法中产生的第k小的元素总和. ...

  6. HDU 4947 GCD Array 容斥原理+树状数组

    GCD Array Time Limit: 11000/5500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  7. Gym 100960G (set+树状数组)

    Problem Youngling Tournament 题目大意 给一个序列a[i],每次操作可以更改一个数,每次询问 将序列排序后有多少个数a[i]>=sum[i-1]. n<=10^ ...

  8. Gym - 101755G Underpalindromity (树状数组)

    Let us call underpalindromity of array b of length k the minimal number of times one need to increme ...

  9. Gym - 100269F Flight Boarding Optimization(dp+树状数组)

    原题链接 题意: 现在有n个人,s个位置和你可以划分长k个区域你可以把s个位置划分成k个区域,这样每个人坐下你的代价是该区域内,在你之前比你小的人的数量问你怎么划分这s个位置(当然,每个区域必须是连续 ...

随机推荐

  1. 【洛谷P1104】生日

    题目描述 cjf君想调查学校OI组每个同学的生日,并按照从大到小的顺序排序.但cjf君最近作业很多,没有时间,所以请你帮她排序. 输入输出格式 输入格式: 有2行,第1行为OI组总人数n:第2行至第n ...

  2. sublime出现卡顿的现象

    这几天,用sublime总是写一个代码就卡顿,卡卡卡,,,,要死的~ 最后,才发现是因为安装了一个插件:GitGutter插件,所以,小伙伴们请跟上我的节奏~~~~~ (1)Ctrl + Shift ...

  3. react CRA antd 按需加载配置 lessloader

    webpack配置 webpack.config.dev.js, webpack.config.prod同理. 'use strict'; const autoprefixer = require(' ...

  4. bzoj 3083 树链剖分

    首先我们先将树提出一个根变成有根树,那么我们可以通过树链剖分来实现对于子树的最小值求解,那么按照当前的根和询问的点的相对位置关系我们可以将询问变成某个子树和或者除去某颗子树之后其余的和,前者直接询问区 ...

  5. Linux系统调用、新增系统调用方法【转】

    转自:http://blog.chinaunix.net/uid-25374603-id-3401045.html 说明: 系统调用是内核和应用程序间的接口,应用程序要访问硬件设备和其他操作系统资源, ...

  6. s3c6410下移植sqlite3.7.8

    http://blog.chinaunix.NET/uid-30441-id-2133838.html 1.下载源代码http://www.sqlite.org/download.html 2.tar ...

  7. shell脚本自带变量的含义

    $0 Shell本身的文件名 $1-$n 添加到Shell的各参数值.$1是第1参数.$2是第2参数… $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process ...

  8. centos6.5 安装、启动vnc

    一.安装vnc 1.确保当前账号是root2.查看本机是否已经安装vncserver rpm -qa|grep tigervnc 3.安装vncserver yum -y install tigerv ...

  9. HDU 3085 Nightmare Ⅱ(双向BFS)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3085 题目大意:给你一张n*m地图上,上面有有 ‘. ’:路 ‘X':墙 ’Z':鬼,每秒移动2步,可 ...

  10. 【转】doxygen+graphviz生成工程中的类继承树及函数调用图

    转自----hequn8128 在阅读代码量比较多的项目时,类的继承树和函数调用图能够直观地向我们显示类之间或者函数之间的各种关系,方便我们了解程序的整体框架,很多时候可以起到事半功倍的作用.这里尝试 ...