Codeforces Round #324 (Div. 2) E
这题贪心,考虑先放第一个,然后从第一个数在p中的位置, 不断的往前走,和在他后面的那些数组进行交换,因为这样交换可以提高最大的效率,就是说你花费了1但是使得两个点都朝他的木匾节点减少了1
#include <iostream> #include <algorithm> #include <cstdio> #include <vector> #include <cmath> using namespace std; const int maxn=2000005; int A[maxn],B[maxn],idx[maxn],D[maxn]; pair<int,int>P[maxn]; int main() { int N; while(scanf("%d",&N)==1) { for(int i=1; i<=N; i++) { scanf("%d",&B[i]); idx[B[i]]=i; } for(int i=1; i<=N; i++) { scanf("%d",&D[i]); A[D[i]]=i; } int cost=0,num=0; for(int i=1; i<=N; i++) { int d=D[i]; if(d==B[i])continue; int Loc=idx[d]; for(int i=idx[d]-1; i>0;i--) { int d1=B[i]; if( idx[d] == A[d] )break; if(A[d1]>=Loc){ cost+=abs(idx[d1]-idx[d]); swap(idx[d1],idx[d]); P[num++]=make_pair(idx[d1],idx[d]); swap(B[i],B[Loc]); Loc=i; } } } printf("%d\n",cost); printf("%d\n",num); for(int i=0 ; i<num; i++) printf("%d %d\n",P[i].first,P[i].second); } return 0; }