0%

2025“钉耙编程”中国大学生算法设计暑期联赛(2)——1006半(将排列和这个询问一起排)

思路讲解

首先根据容斥原理,并集=全集-交集。

1
2
3
4
FOR(i,1,N){
ll ans=rka[i]+rkb[i]-2-jiao[i];
cout<<ans<<" ";
}

那么问题就来到了如何求这个交集。那么我们排列(首先根据rka)以后,只有前面的才有可能是在这个交集之中。

1
2
3
4
5
FOR(i,1,N){
ele.EB(rka[i],rkb[i],0);
ele.EB(rka[i],rkb[i],1);
}
sort(all(ele));

那么问题就来到了有几个jj,使得 rkbj<rkbirkb_j<rkb_i 了,这个可以用树状数组解决(类似于逆序对,我们只用考虑前面的比我们大的数字,这里我们也只用考虑前面的,因为后面 rkarka 不满足)。

1
2
3
4
5
6
7
8
for(auto &[x,y,isq]:ele){
ll a=A[x];
if(isq){
jiao[a]=tr.query(1,y-1);
}else{
tr.add(y,1);
}
}

AC代码

https://acm.hdu.edu.cn/contest/view-code?cid=1173&rid=10158

心路历程(WA,TLE,MLE……)