原来这题是每日一题......?这题可以用树状数组求逆序对解决,首先我们可以知道..我们把其中一维排序,另外一维按第一维的顺序插入就会产生一组答案.对于可计数的答案来说,我们考虑两种,第一种是我第一维大于它的第二维,我的第二维小于它的第二维,第三维未知但是算出来的答案重复次数只会是1,因为第三维可能是继续大于,那么只会和第二种重复,要么小于只会和第一种重复...好了,牛客的每日一题,假如我没做过,还是可以做一下的...毕竟有很多题解,对于萌新可真是太友好了.

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
struct vv{
    ll a,b,c;
}w[N];
bool cmp1(vv x,vv y)    {  return x.a<y.a;  }
bool cmp2(vv x,vv y)    {  return x.b<y.b;  }
ll n,sum[N];
ll lowbit(ll x) {  return x&(-x);  }
void add(ll pos,ll val)
{
    while(pos<=n)
    {
        sum[pos]+=val;
        pos+=lowbit(pos);
    }
}
ll query(ll pos)
{
    ll res=0;
    while(pos)
    {
        res+=sum[pos];
        pos-=lowbit(pos);
    }
    return res;
}

int main()
{
    ll ans=0;
    scanf("%lld",&n);
    for(ll i=1;i<=n;i++)
    {
        scanf("%lld%lld%lld",&w[i].a,&w[i].b,&w[i].c);
    }
    sort(w+1,w+1+n,cmp1);
    for(ll i=1;i<=n;i++)
    {
        add(w[i].b,1);
        ans+=i-query(w[i].b);
    }
    for(ll i=1;i<=n;i++)
    {
        add(w[i].b,-1);
    }
    for(ll i=1;i<=n;i++)
    {
        add(w[i].c,1);
        ans+=i-query(w[i].c);
    }
    for(ll i=1;i<=n;i++)
    {
        add(w[i].c,-1);
    }
    sort(w+1,w+1+n,cmp2);
    for(ll i=1;i<=n;i++)
    {
        add(w[i].c,1);
        ans+=i-query(w[i].c);
    }
    printf("%lld\n",ans/2);
    return 0;
}