1073B Vasya and Books
阿新 • • 發佈:2018-12-29
題意:有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]])