CF1279C-Stack of Presents

题目: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 }
原文地址:https://www.cnblogs.com/yanying7/p/12336889.html