求助逆序对裸题
  • 板块P3149 排序
  • 楼主lmrttx
  • 当前回复2
  • 已保存回复2
  • 发布时间2020/12/12 12:19
  • 上次更新2023/11/5 06:14:44
查看原帖
求助逆序对裸题
344382
lmrttx楼主2020/12/12 12:19

WA了。。。

总的逆序对没有错(样例),后面要用后缀和时就WA了样例的一个输出。交上去全WA。

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define maxn 3000010
int a2[maxn],b[maxn],c[maxn],cnt,answer,change[maxn],n,m,q,ans1=-6,ans2;
struct node {
	int h,v,pos;
} a[maxn];
bool cmp(const node & x,const node & y) {
	return x.h<y.h;
}
inline int lowbit(int x) {
	return x&-x;
}
inline void add(int x,int val) {
	for(; x<=n; x+=lowbit(x))c[x]+=val;
}
inline int sum(int x) {
	int res=0;
	for(; x; x-=lowbit(x))res+=c[x];
	return res;
}
void lisan() {
	sort(a2+1,a2+1+cnt);
	cnt=unique(a2+1,a2+1+cnt)-a2-1;
}
signed main() {
	scanf("%lld%lld",&n,&m);
	for(register int i=1; i<=n; i++) {
		scanf("%lld",&a[i].h);
		a[i].pos=i;a2[++cnt]=a[i].h;
	}
	lisan();
	for(register int i=n; i>=1; i--) {
		a[i].h=lower_bound(a2+1,a2+cnt+1,a[i].h)-a2;
		a[i].v=sum(a[i].h);
		answer+=a[i].v;
		add(a[i].h,1);
	}
	printf("%lld\n",answer);
	sort(a+1,a+n+1,cmp);
	for(register int i=n-1; i>=1; i--)a[i].v+=a[i+1].v;
	for(register int i=1; i<=n; i++)change[a[i].pos]=1;
	for(register int i=1; i<=m; i++) {
		scanf("%lld",&q);
		if(a[change[q]].h>ans1) {
			printf("%lld\n",a[change[q]+1].v);
			ans1=a[change[q]].h;
			ans2=q;
		} else printf("%lld\n",a[change[ans2]+1].v);
	}
}
2020/12/12 12:19
加载中...