记录编号 114430 评测结果 AAAAAAAAAA
题目名称 [NOIP 2013]火柴排队 最终得分 100
用户昵称 Gravatar高哥 是否通过 通过
代码语言 C++ 运行时间 0.505 s
提交时间 2014-07-29 15:16:48 内存使用 19.39 MiB
显示代码纯文本
/*离散化+逆序对:
1.先将原始数据按大小离散化成1,2,3,4……
  如:
  原始数据:8 5 7 9 10 
  离散化后:3 1 2 4 5
  两组数据都要这样做;
2.然后对第一组数据离散后的数组标上位置数:
  如(前面的例子):3 1 2 4 5
  标上位置数后:    1 2 3 4 5
3.把第二组数据(离散化后)映射成第一组数据
  如第二组数据离散化后为: 5 3 1 2 4
  根据第一组数据映射后为: 5 1 2 3 4
4.最后对第二组数据(映射后的)进行逆序对即可;
  */ 
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#define INF 1000100
#define c 99999997
using namespace std;
map<int,int> pre1;
map<int,int> pre2;
map<int,int> pre3;
int a[INF],a1[INF],b[INF],b1[INF],n; 
int p[INF];
long long ans;
int megersort(int l,int mid,int r)
{
	int i=l,j=mid+1;
	int k=i;
	while(i<=mid && j<=r)
	{
		if(b1[i]>b1[j])
		{
		  p[k++]=b1[j++];
		  ans+=mid-i+1;
		  ans%=c;
		}
		else
		  p[k++]=b1[i++];
	}
	while(i<=mid)
	  p[k++]=b1[i++];
	while(j<=r)
	  p[k++]=b1[j++];
	for(int i=l;i<=r;i++)
	  b1[i]=p[i];
}
void meger(int l,int r)
{
	if(l==r)
	 return ;
	int mid=(l+r)>>1;
	meger(l,mid);
	meger(mid+1,r);
	megersort(l,mid,r);
}
int input()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	  {scanf("%d",&a[i]);a1[i]=a[i];}
	for(int i=1;i<=n;i++)
	  {scanf("%d",&b[i]);b1[i]=b[i];}
}
int work()
{
	input();
	sort(a+1,a+n+1);
	sort(b+1,b+n+1);
	
	for(int i=1;i<=n;i++)
	{
		pre1[a[i]]=i;
		pre2[b[i]]=i;
	}
	for(int i=1;i<=n;i++)
	{
		a1[i]=pre1[a1[i]];
		b1[i]=pre2[b1[i]];
	}// 对两组数据离散化操作 
	
	for(int i=1;i<=n;i++)
		pre3[a1[i]]=i;   //对第一组数据(离散化后)标上位置数 
	for(int i=1;i<=n;i++)
	    b1[i]=pre3[b1[i]];
	// 把第二组数据映射 

	meger(1,n);//对第二组数据逆序对 
	printf("%lld\n",ans%c);
	
}
int main()
{
	 freopen("MatchNOIP2013.in","r",stdin);
	 freopen("MatchNOIP2013.out","w",stdout);
	 work();
	 return 0;
}