题目大意
给你一个由 nnn 个正整数 a=(a1,a2,…,an)a = (a_1, a_2, \dots, a_n)a=(a1,a2,…,an) 组成的数列。让你求出对于每个iii前面111到i−1i-1i−1中aia_iai这个数最晚出现的的位置,如果没有就输出−1-1−1。
解法
可以见得直接暴力枚举的复杂度是O(n2)O(n^2)O(n2)的,很明显会超时。但是我们可以想到当你从111开始遍历到多个重复的aia_iai时,输出的答案只跟最后遍历到的aia_iai的位置有关,因此我们可以拿一个桶ttt来记录最后遍历到的aia_iai的位置即可,当再次遍历到aia_iai时只需输出tait_{a_i}tai的值,并使tai=it_{a_i}=itai=i即可。
代码
#include<bits/stdc++.h>
using namespace std;
int n,a[500005];
//因为a的数据范围是1~1e9因此t要用map来存储。
map<int,int> t;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
//如果前面没有a[i]出现过就输出-1,否则输出t[a[i]]。
if(t[a[i]]==0) cout<<"-1 ";
else cout<<t[a[i]]<<" ";
//更新t[a[i]]的值为i。
t[a[i]]=i;
}
return 0;
}