题解 P8184 [USACO22FEB] Photoshoot 2 B
乍一看这道题可能没什么头绪,不如先看看
以题中给出的样例
映射数组
容易发现最后的结果是对
即本题可转为类似 逆序对 的解法。
code:
c语言版本:
#include <stdio.h>
int n,a[100010],b[100010],c[100010];
int ans,maxn,i;
int main()
{
scanf("%d",&n);
for(i=1;i<=n;i++) scanf("%d",&a[i]);
for(i=1;i<=n;i++)
{
scanf("%d",&b[i]);
c[b[i]]=i;//建立映射数组
}
for(i=1;i<=n;i++) a[i]=c[a[i]];//用a[i]在映射数组中的位置,替换掉a数组
for(i=1;i<=n;i++)
{
//a[i]>maxn?maxn=a[i]:ans++; 三目运算写法
if(a[i]>maxn) maxn=a[i];
else ans++;
}
printf("%d",ans);
return 0;
}
c++版本:
#include <iostream>
#include <cstdio>
using namespace std;
const int N=1e5+10;
int n,a[N],b[N],c[N];
int ans,maxn;
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++)
{
cin>>b[i];
c[b[i]]=i;
}
for(int i=1;i<=n;i++) a[i]=c[a[i]];
for(int i=1;i<=n;i++) a[i]>maxn?maxn=a[i]:ans++;
cout<<ans;
return 0;
}