给定四元组(d1,d2,d3,d4)求d1
沿用cdq三维偏序的思想,先保证d1有序,对d1分治->(l,d2,d3,d4),(r,d2,d3,d4),然后我们对d2进行合并->(l/r,l/r,d3,d4),(l/r,l/r,d3,d4),然后就是三维偏序的模板,但是只有(l,l,d3,d4)这种组才会对(r,r,d3,d4)这种组有影响。
#include
using namespace std;
const int Maxn=50005;
inline int getint(){
register char c;register int x=0,f=1;
for(c=getchar();c<'0'||c>'9';c=getchar())if(c=='-')f=-1;
while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c-'0'),c=getchar();
return x*f;
}
int n,d[Maxn],f[Maxn];
struct info{
int d1,d2,d3,d4,idx,part;
}a[Maxn],t[Maxn];
bool cmpd2(const info&A,const info&B){
return A.d20;x-=lowbit(x))ret+=arr[x];
return ret;
}
}bit;
void cdq2(int l,int r){
if(l>=r)return ;
int mid=l+r>>1;
cdq2(l,mid),cdq2(mid+1,r);
sort(t+l,t+mid+1,cmpd3),sort(t+mid+1,t+r+1,cmpd3);
int i=l,j=mid+1;
for(;j<=r;++j){
for(;i<=mid&&t[i].d3=l)if(t[i].part==-1)bit.add(t[i].d4,-1);
}
void cdq1(int l,int r){
if(l>=r)return ;
int mid=l+r>>1;
cdq1(l,mid),cdq1(mid+1,r);
sort(a+l,a+mid+1,cmpd2),sort(a+mid+1,a+r+1,cmpd2);
int i=l,j=mid+1,cnt=0;
while(i<=mid&&j<=r){
if(a[i].d2<=a[j].d2){
t[++cnt]=a[i++],t[cnt].part=-1;
}else {
t[++cnt]=a[j++],t[cnt].part=1;
}
}
while(i<=mid)t[++cnt]=a[i++],t[cnt].part=-1;
while(j<=r)t[++cnt]=a[j++],t[cnt].part=1;
cdq2(1,cnt);
}
void discrete(){
for(int i=1;i<=n;++i)
d[i]=a[i].d4;
sort(d+1,d+n+1);
int siz=unique(d+1,d+n+1)-d-1;
for(int i=1;i<=n;++i)
a[i].d4=lower_bound(d+1,d+siz+1,a[i].d4)-d;
}
int main(){
freopen("partial_order.in","r",stdin);
freopen("partial_order.out","w",stdout);
n=getint();
for(int i=1;i<=n;++i)
a[i].idx=a[i].d1=i;
for(int i=1;i<=n;++i)
a[i].d2=getint();
for(int i=1;i<=n;++i)
a[i].d3=getint();
for(int i=1;i<=n;++i)
a[i].d4=getint();
discrete();
cdq1(1,n);
long long Ans=0;
for(int i=1;i<=n;++i)Ans+=f[i];
cout<