又是一道看懂但不会写的题 翻开题解是大大的三维偏序(不会...)
只能又是翻题解又是开博客 终于弄明白了一点
我们通常说的三维偏序就是 第一维用sort 第二维用cdq分治 第三维用树状数组
(看到一个邪道做法是cdq套cdq一直套下去....菜鸡根本看不懂)
我们来理解题意 他要能互相都认为强的队伍 如果正解的话一看就是n2算法 复杂度过不了
于是我们采用容斥思想 先算所有队伍 在减去不可能的队伍即三场都小于另一个队伍
这就变成了一个裸的三维偏序题
建议到网上查阅CDQ分治或者三维偏序的讲解,那里会有更具体的解法(菜鸡自己都看的迷迷糊糊...)
就不写出来祸害各位大佬了
贴一个板子吧

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int mod=998244353;
const int maxn=2e5+5;
ll n,ans,c[maxn];
struct node{
    ll a,b,c;
}p[maxn],p1[maxn];
bool cmp(node a,node b){
    return a.a<b.a;
}
int lowbit(int x){
    return x&(-x);
}
void add(int x,ll v){
    while(x<maxn){
        c[x]+=v;
        x+=lowbit(x);
    }
}
ll query(int x){
    ll res=0;
    while(x){
        res+=c[x];
        x-=lowbit(x);
    }
    return res;
}
void cdq(int l,int r){///cdq板子
    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(p[i].b<p[j].b)add(p[i].c,1),p1[k++]=p[i++];
        else ans+=query(p[j].c),p1[k++]=p[j++];
    }
    while(i<=mid)add(p[i].c,1),p1[k++]=p[i++];
    while(j<=r)ans+=query(p[j].c),p1[k++]=p[j++];
    for(int i=l;i<=mid;i++)add(p[i].c,-1);
    for(int i=l;i<=r;i++)p[i]=p1[i];
}
int main()
{
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n;i++)cin>>p[i].a>>p[i].b>>p[i].c;
    sort(p+1,p+1+n,cmp);
    cdq(1,n);
    cout<<n*(n-1)/2-ans<<endl;
    return 0;
}