题目
https://vjudge.net/problem/Gym-100247K
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e5+10000;
struct node
{
int a,b,c,ans;
}a[maxn],tmp[maxn];
bool cmp(node a,node b)
{
return a.a < b.a;
}
ll n,ans;
int T[maxn];
int lb(int x){
return x&(-x);
}
void add(int x,int op)
{
for(int i = x;i <= maxn-100;i+=lb(i)) T[i] += op;
}
int que(int x)
{
int ans = 0;
for(int i = x;i > 0;i -= lb(i)) ans += T[i];
return ans;
}
void cdq(int l,int r)
{
if(l == r) return ;
int mid = (l + r) / 2;
cdq(l,mid),cdq(mid+1,r);
int i = l;
int j = mid + 1;
int tot = l - 1;
while(i <= mid&&j <= r)
{
if(a[i].b <= a[j].b)
{
tmp[++tot] = a[i];
add(a[i].c,1);
i++;
}
else{
a[j].ans += que(a[j].c-1);
tmp[++tot] = a[j];
j++;
}
}
while(i <= mid){
tmp[++tot] = a[i];
add(a[i].c,1);
i++;
}
while(j <= r){
a[j].ans += que(a[j].c-1);
tmp[++tot] = a[j];
j++;
}
for( i = l;i <= mid;i++) add(a[i].c,-1);
for( i = l;i <= r;i++) a[i] = tmp[i];
}
int main(){
scanf("%lld",&n);
for(int i = 1;i <= n;i++)
{
scanf("%d%d%d",&a[i].a,&a[i].b,&a[i].c);
}
sort(a+1,a+1+n,cmp);
cdq(1,n);
ans = n*(n-1)/2;
for(int i = 1;i <= n;i++)
ans -= a[i].ans;
printf("%lld\n",ans);
return 0;
}