题目:https://vjudge.net/problem/CodeForces-1279C
分析:用一个数组记录每个序号的礼物所在的位置,从第二个礼物开始,如果位置比之前的位置最大的礼物小,那在之前肯定已经排好了,时间加1;否则因为靠前的礼物无法改变靠后的,那么时间加上该位置之前的礼物数量乘2再加1。
1 #include <stdio.h> 2 int main(void){ 3 int t; 4 scanf("%d",&t); 5 while(t--){ 6 int n,m; 7 scanf("%d %d",&n,&m); 8 int b[100100]={0};//b用序号记位置 9 for(int i=1;i<=n;i++){ 10 int q; 11 scanf("%d",&q); 12 b[q]=i; 13 } 14 int x; 15 scanf("%d",&x); 16 m--; 17 long long time=0,maxp=x;//记录读过的最大的位置 18 time+=2*(b[x]-1)+1; 19 int k=1;//记录已经取出的数量 20 while(m--){ 21 int xx; 22 scanf("%d",&xx); 23 if(b[xx]<b[maxp]) time++; 24 else{ 25 time+=2*(b[xx]-1-k)+1; 26 maxp=xx; 27 } 28 k++; 29 } 30 printf("%lld ",time); 31 } 32 return 0; 33 }