萌新求助cdq,样例没过
查看原帖
萌新求助cdq,样例没过
32490
memory_frv楼主2021/11/1 21:36

对于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;
}
2021/11/1 21:36
加载中...