1. 程式人生 > >1073B Vasya and Books

1073B Vasya and Books

 

題意:有n本書,按照a那種順序疊在一起,按照b那種順序取書,如果取的這本書上面還有書,那就一起拿走裝進包裡,

輸出按照b的順序每次能拿幾本書。

題解:模擬 先把最開始書籍的順序(下標)記錄下來,然後按照b的順序遍歷a中的下標,並且記錄上一次拿書的下標,最開始為0,如果當前要拿的數下標在原始順序中上面有書,就拿下標減上一次拿的下標,如果小於就說明沒有書可拿。

c++:

#include<bits/stdc++.h>
using namespace std;
int a[200010],val;
int b[200010];
int main()
{
    int n;
    scanf("%d",&n);
   for(int i=1;i<=n;i++)
   {
       scanf("%d",&val);
       a[val]=i;
   }
   int maxx=0;
   for(int i=1;i<=n;i++)
   {
       scanf("%d",&b[i]);
       if(a[b[i]]>maxx)
       {
           printf("%d ",a[b[i]]-maxx);
           maxx=a[b[i]];
       }
       else printf("0 ");
   }
   printf("\n");
    return 0;
}

python:python最開始沒記錄下標,直接呼叫下標會超時,應該是底層原始碼中有循序遍歷,所以超時了...

超時程式碼:

n=int(input())
a=list(map(int,input().split()))
b=list(map(int,input().split()))
maxx=0;
for i in b:
    if a.index(i)+1>maxx:
        print(a.index(i)+1-maxx,end=" ")
        maxx=a.index(i)+1

ac程式碼:還是像c那樣先記錄原來順序

n=int(input())
a=list(map(int,input().split()))
b=list(map(int,input().split()))
cnt=[0]*(n+1);
maxx=0
for i in range(n):
    cnt[a[i]]=i+1
for i in range(n):
    print(max(0,cnt[b[i]]-maxx),end=" ")
    maxx=max(maxx,cnt[b[i]])