WA0 求助cdq分治
查看原帖
WA0 求助cdq分治
164580
YGB_XU楼主2022/3/22 23:28

rt,讨论区里的样例试过没错。思路是时间倒流,把操作改为插入数字后,做前缀和求答案。

#include<bits/stdc++.h>
using namespace std;

inline int read(){
	int ret=0,f=1;
	char c=getchar();
	while(c<'0'||'9'<c){
		if(c=='-') f=-1;
		c=getchar();
	}
	while('0'<=c&&c<='9'){
		ret=(ret<<1)+(ret<<3)+(int)(c-'0');
		c=getchar();
	}
	return ret*f;
}

inline long long readll(){
	long long ret=0ll,f=1ll;
	char c=getchar();
	while(c<'0'||'9'<c){
		if(c=='-') f=-1ll;
		c=getchar();
	}
	while('0'<=c&&c<='9'){
		ret=(ret<<1ll)+(ret<<3ll)+(long long)(c-'0');
		c=getchar();
	}
	return ret*f;
}

inline void write(int x){
	if(x<0){
		putchar('-');
		x=-x;
	}
	if(x>=10) write(x/10);
	putchar('0'+x%10);
}

inline void writell(long long x){
	if(x<0ll){
		putchar('-');
		x=-x;
	}
	if(x>=10ll) writell(x/10ll);
	putchar('0'+x%10ll);
}

typedef long long LL;

#define int long long

const int NR=1e5+5;
int n,m;
int _pos[NR];
struct Node{
	int pos,v;
}a[NR];

int t[2][NR];
inline int lowbit(int x){
	return x&(-x);
}

inline void add(int x,int k,int num){
	while(x<=NR-5){
		t[num][x]+=k;
		x+=lowbit(x);
	}
}

inline int sum(int x,int num){
	int ret=0;
	while(x!=0){
		ret+=t[num][x];
		x-=lowbit(x);
	}
	return ret;
}

inline bool cmp1(int x,int y){
	return a[x].pos<a[y].pos;
}

inline bool cmp2(int x,int y){
	return a[x].pos>a[y].pos;
}

int top=0;
int tmp[2][NR],ans[NR];
inline void cdq(int l,int r){
	if(l==r) return;
	int mid=(l+r)>>1;
	top=0;
	for(int i=l;i<=r;i++){
		top++;
		tmp[0][top]=tmp[1][top]=i;
	}
	//比自己靠前而且比自己大的
	sort(tmp[0]+1,tmp[0]+top+1,cmp1);
	for(int i=1,pos;i<=top;i++){
		pos=tmp[0][i];
		if(pos<=mid){
			add(NR-5-a[pos].v,1,0);
		}else{
			ans[pos]+=sum(NR-5-a[pos].v,0);
		}
	}
	//比自己靠后而且比自己小的
	sort(tmp[1]+1,tmp[1]+top+1,cmp2);
	for(int i=1,pos;i<=top;i++){
		pos=tmp[1][i];
		if(pos<=mid){
			add(a[pos].v,1,1);
		}else{
			ans[pos]+=sum(a[pos].v,1);
		}
	}
	
	for(int i=1,pos;i<=top;i++){
		pos=tmp[0][i];
		if(pos<=mid){
			add(NR-5-a[pos].v,-1,0);
			add(a[pos].v,-1,1);
		}
	}
	cdq(l,mid);cdq(mid+1,r);
}

bool flag[NR];

signed main(){
//	ios::sync_with_stdio(false);
	n=read();m=read();
	for(int i=1;i<=n;i++) _pos[read()]=i;
	for(int i=1,ix;i<=m;i++){
		ix=read();
		flag[ix]=true;
		a[i]=Node{_pos[ix],ix};
	}
	int pos=1;
	for(int i=m+1;i<=n;i++){
		while(flag[pos]) pos++;
		a[i]=Node{_pos[pos],pos};
	}
	for(int i=1;i<=(n>>1);i++){
		swap(a[i],a[n-i+1]);
	}
	cdq(1,n);
	for(int i=1;i<=n;i++){
		ans[i]+=ans[i-1];
	}
	for(int i=n;i>=n-m+1;i--){
		writell(ans[i]);putchar('\n');
	}
	return 0;
}
2022/3/22 23:28
加载中...