对于cdq的理解依旧不透彻,我按照题解里第一篇的大佬那样按照三维偏序的模板写法进行两次cdq,但是最后样例也没过,害,球球各位帮我调调吧
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
struct des{
int pos,val,time,ans;
}a[1000001];
int tree[1000001],n,m,vis[1000001],chushi=0;
inline int lowbit(int x){
return x&-x;
}
inline void add(int x,int ad){
for(int i=x;i<=n+1;i+=lowbit(i)){
tree[i]+=ad;
}
}
inline int sum(int x){
int res=0;
for(int i=x;i;i-=lowbit(i)){
res+=tree[i];
}
return res;
}
inline bool cmp(des a,des b){
return a.time<b.time||
a.time==b.time&&a.val<b.val||
a.time==b.time&&a.val==b.val&&a.pos>b.pos;
}
inline bool cmp1(des a,des b){
return a.val<b.val||
a.val==b.val&&a.pos>b.pos;
}
inline bool cmp2(des a,des b){
return a.time<b.time||
a.time==b.time&&a.val>b.val||
a.time==b.time&&a.val==b.val&&a.pos<b.pos;
}
inline bool cmp3(des a,des b){
return a.val>b.val||
a.val==b.val&&a.pos<b.pos;
}
inline bool cmp4(des a,des b){
return a.time<b.time;
}
inline void cdq(int l,int r){
if(l==r) return ;
int mid=(l+r)>>1;
cdq(l,mid);cdq(mid+1,r);
sort(a+l,a+mid+1,cmp1);
sort(a+mid+1,a+r+1,cmp1);
int i=mid+1,j=l;
while(i<=r){
while(a[j].val<a[i].val&&j<=mid){
add(a[j].pos,1);j++;
}
a[i].ans+=sum(n+1)-sum(a[i].pos);
i++;
}
for(i=l;i<j;i++) add(a[i].pos,-1);
}
inline 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,cmp3);
sort(a+mid+1,a+r+1,cmp3);
int i=mid+1,j=l;
while(i<=r){
while(a[j].val>a[i].val&&j<=mid){
add(a[j].pos,1);j++;
}
a[i].ans+=sum(a[i].pos);
i++;
}
for(i=l;i<j;i++) add(a[i].pos,-1);
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
scanf("%d",&a[i].val);
vis[a[i].val]=i;
a[i].pos=i;
a[i].time=m+1;
}
for(int i=1;i<=m;i++){
int t;
scanf("%d",&t);
a[vis[t]].time=i;
}
for(int i=1;i<=n;i++){
chushi+=sum(n+1)-sum(a[i].val);add(a[i].val,1);
}
for(int i=1;i<=n;i++){
add(a[i].val,-1);
}
sort(a+1,a+1+n,cmp);
cdq(1,n);
sort(a+1,a+1+n,cmp2);
cdq1(1,n);
sort(a+1,a+1+n,cmp4);
for(int i=1;i<=n;i++){
cout<<chushi<<endl;
chushi-=a[i].ans;
}
return 0;
}