求大佬解释,为什么这一句加上是10分,不加就A了
查看原帖
求大佬解释,为什么这一句加上是10分,不加就A了
49956
清衡楼主2018/6/14 15:03
#include<cstdio>
#include<algorithm>
using namespace std;
int n,t=0;
long long ans;
int aa[500050],e[500050];
struct wfq{
	int v,ord;
}a[500050];
int cmp(const wfq &a,const wfq &b){return a.v<b.v;}
int lowbit(int x){return x&(-x);}
void Add(int x)
{
	int a1=0,a2=0;
	for(int i=x;i<=n;i+=lowbit(i))e[i]+=1;
	for(int i=n;i>0;i-=lowbit(i))a1+=e[i];
	for(int i=x;i>0;i-=lowbit(i))a2+=e[i];
	ans+=a1-a2;
	return;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++){scanf("%d",&a[i].v),a[i].ord=i;}
	stable_sort(a+1,a+n+1,cmp);
	for(int i=1;i<=n;i++)
	{
		if(i>=2&&a[i].v==a[i-1].v)t++;//就是这一句; 
		aa[a[i].ord]=i-t;
	}
	for(int i=1;i<=n-t;i++){Add(aa[i]);}
	printf("%lld\n",ans);
	return 0;
}

我加这一句是为了在离散化时,遇到相同的数会离散化出相同的结果。 如 4 7 9 2 9 5 7 3这个数列 加上这一句变成了 3 5 6 1 6 4 5 2 而不加这一句则是 3 5 7 1 8 4 6 2 自认为挺对,,,,

2018/6/14 15:03
加载中...