题意的话,看原题英语,(英语不好,就不翻译了,主要讲一下我的解题方法)
一开始看得一头雾水,但观察样例可以很快看出端倪,(没错,观察很重要),b数组中的元素与a数组中的元素一毛一样,只是位置不同;我们记ans数组为要输出的结果,ans[i]对应b[i],在a数组中找到与b[i]相同的a[i],从这个a[i]起往左数有多少个没被记录的a[i],记下个数,这个数值就是ans[i](当然,第一次记录时,肯定是往左数到第一个数值),这个过程,其实也是题意的模拟,也算水题,不过挺不错的,值得一做。话不多说,上两份代码,啃代码才是王道。
c++代码如下:
#include<bits/stdc++.h> using namespace std; const int M = 2e5 + 5; int a[M]; int ans[M]; int main() { int n,x; scanf("%d", &n); for (int i=1; i<=n; i++){ scanf("%d", &x); a[x] = i; } int cur = 0; for (int i=1; i<=n; i++){ scanf("%d", &x); ans[i] = (a[x] > cur) ? a[x] - cur : 0; cur = (a[x] > cur) ? a[x] : cur; } for (int i=1; i <= n; i++) printf("%d ", ans[i]); printf("\n"); }
python代码如下:
n = int(input()) c = [0]*(n+1) a = list(map(int, input().split())) for i in range(n): c[a[i]] = i+1 b = [int(x) for x in input().split()] cur = 0 for i in b: print(max(c[i]-cur, 0), end = ' ') cur = max(c[i], cur)