四维偏序

题意:

给定\(n\)个元素,每个元素有四个属性\(a,b,c,d\),求序列中满足\(a_i< a_j\)\(b_i< b_j\)\(c_i< c_j\)\(d_i< d_j\)的数对\((i,j)\)的个数。

对于\(100%\)的数据,\(1<=n<=50000\),保证所有的\(ai,bi,ci,di\)分别组成四个\(1\)~\(n\)的排列。

思路:

第一维排序。
第二维cdq分治,在保持第二维有序的情况下,记录第一维的顺序(即此元素是否可以更新其他元素或是否可以被更新)
第三维继续cdq分治,维持第三维有序性
第四维在以上的前提下,用树状数组维护统计答案

注意事项:

谨防手残

code:

#include
using namespace std;
const int N=50005;
int n,ans;
struct node{int a,b,c,d,tp;}q[N],tmp1[N],tmp2[N];
inline bool cmp1(node x,node y){return x.a>1;
    cdq3d(l,mid);cdq3d(mid+1,r);
    int i=l,j=mid+1,cnt2=l;
    while(j<=r)
    {
        while(tmp1[i].c>1;
    cdq2d(l,mid);cdq2d(mid+1,r);
    int i=l,j=mid+1,cnt1=l;
    while(j<=r)
    {
        while(q[i].b

你可能感兴趣的:(四维偏序)