CodeForces Round #119 (187A) - Permutations

来源:岁月联盟 编辑:exp 时间:2012-09-01

  这题突破点或者说关键之处就在第二列最后一个数在第一列中的位置...
      设第二列最后一个数为x...设x在第一列位置为i..1~i的顺序是符合第二列中数字前后关系的话..那易得所需的最小移动步数就是不断抽第一列最后的数使得x到第n位..
      若是1~i不是按第二列的数字关系递增的话..也很好想到将x移到第k+1位..其中1~k是最长的按第二列的数字关系递增的..再不断的抽第一列最后的数使得x到第n位..

Program:
[cpp]
#include<iostream> 
#include<algorithm> 
#include<stdio.h> 
#include<string.h> 
#include<cmath> 
#include<queue> 
#define oo 2000000000 
#define ll long long 
using namespace std; 
int sa[200005],sb[200005],a[200005],b[200005]; 
int main() 
{        
       int i,n,ans; 
       scanf("%d",&n); 
       for (i=1;i<=n;i++) 
       { 
             scanf("%d",&a[i]); 
             sa[a[i]]=i; 
       } 
       for (i=1;i<=n;i++)  
       { 
             scanf("%d",&b[i]); 
             sb[b[i]]=i; 
       } 
       for (i=2;i<=n;i++) 
          if (sb[a[i-1]]>sb[a[i]]) break; 
       i--; 
       if (i!=sa[b[n]]) ans=n-i; 
          else  ans=n-sa[b[n]]; 
       printf("%d/n",ans);  
       return 0;