原来这题是每日一题......?这题可以用树状数组求逆序对解决,首先我们可以知道..我们把其中一维排序,另外一维按第一维的顺序插入就会产生一组答案.对于可计数的答案来说,我们考虑两种,第一种是我第一维大于它的第二维,我的第二维小于它的第二维,第三维未知但是算出来的答案重复次数只会是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;
} 
京公网安备 11010502036488号