思路:
三维偏序问题 固定某两位选手 计算逆序数对 会有重复计算排名高 和 排名低的情况 最终答案除以2即可
#include <bits/stdc++.h> using namespace std; #define LL long long #define ULL unsigned long long #define mes(x, a) memset(x, a, sizeof(x)); #define sca(a) scanf("%d", &a) #define lowbit(x) x&(-x) #define mk make_pair #define pb(x) push_back(x) #define all(x) (x).begin(), (x).end() #define fi first #define se second #define lson v << 1 #define rson v << 1 | 1 #define pii pair<int, int> inline void read(int &x) { x=0; int flag_read=1; char c=getchar(); while(c<'0'||c>'9') { if(c=='-') flag_read=-1; c=getchar(); } while(c>='0'&&c<='9') { x=(x<<3)+(x<<1)+c-'0'; c=getchar(); } x *= flag_read; } const int N = 200005; int a[N],b[N],c[N]; int t[N],sum[N]; int n; void update(int i,int x){ for(;i <= n;i += lowbit(i)){ sum[i] += x; } } LL query(int i){ LL res = 0; for(;i > 0;i -= lowbit(i)){ res += sum[i]; } return res; } LL solve(int a[],int b[]){ memset(sum,0,sizeof(sum)); for(int i = 1;i <= n;i ++){ t[a[i]] = b[i]; } LL res = 0; for(int i = 1;i <= n;i ++){ res += query(n) - query(t[i]); update(t[i],1); } return res; } int main(){ read(n); for(int i = 1;i <= n;i ++){ read(a[i]),read(b[i]),read(c[i]); } LL res = 0; res = solve(a,b) + solve(b,c) + solve(a,c); printf("%lld\n",res / 2); return 0; }