http://codeforces.com/gym/101485
曾今的树状数组解法:https://blog.youkuaiyun.com/liufengwei1/article/details/79516418
今天终于来填坑了QAQ,就是个三维偏序裸题= =,甚至没有相等的,不用考虑去重
#include<bits/stdc++.h>
#define maxl 200010
using namespace std;
int n;
struct node
{
int a,b,c,id;
}a[maxl],t[maxl];
int b[maxl],c[maxl],ans[maxl];
inline void prework()
{
for(int i=1;i<=n;i++)
scanf("%d",&a[i].a);
int x;
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
b[x]=i;
}
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
c[x]=i;
}
for(int i=1;i<=n;i++)
{
a[i].b=b[a[i].a];
a[i].c=c[a[i].a];
a[i].id=i;
}
}
inline void add(int i,int x)
{
while(i<=n)
{
b[i]+=x;
i+=i&-i;
}
}
inline int sum(int i)
{
int ret=0;
while(i)
{
ret+=b[i];
i-=i&-i;
}
return ret;
}
inline void cdq(int l,int r)
{
if(l==r)
return;
int mid=(l+r)>>1;
cdq(l,mid);
cdq(mid+1,r);
int i=l,j=mid+1,k=l;
while(i<=mid && j<=r)
{
if(a[i].b<=a[j].b)
{
add(a[i].c,1);
t[k++]=a[i++];
}
else
{
ans[a[j].id]+=sum(a[j].c);
t[k++]=a[j++];
}
}
while(i<=mid)
{
add(a[i].c,1);
t[k++]=a[i++];
}
while(j<=r)
{
ans[a[j].id]+=sum(a[j].c);
t[k++]=a[j++];
}
for(int i=l;i<=mid;i++)
add(a[i].c,-1);
for(int i=l;i<=r;i++)
a[i]=t[i];
}
inline void mainwork()
{
for(int i=1;i<=n;i++)
b[i]=0;
cdq(1,n);
}
inline void print()
{
long long res=0;
for(int i=1;i<=n;i++)
res+=ans[i];
printf("%lld\n",res);
}
int main()
{
while(~scanf("%d",&n))
{
prework();
mainwork();
print();
}
return 0;
}