这道题刚一看数据范围,就知道一般的查找肯定会爆,只能用二分,但二分查找代码太过冗长,记不住怎么办?(凉拌 ),所以,我们就搬出STL压箱底的宝贝——lower_bound。
首先,先把所有数放到mulitset里面去,对于每个数的编号用一个map映射过来,方便输出。在处理的时候,用lower_bound来将大于等于当前待查数据的值存入it,如果it大于当前待查数据,说明这个数在序列中不存在,输出-1,否则输出it映射的值。
上代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 50;
#define IO ios::sync_with_stdio(false);cin.tie(0) //玄学加速
int n, m, a[maxn];
int main () {
IO;
cin >> n >> m;
multiset<int> ms; //定义mulitset
map<int, int> mp; //定义映射
for(int i = 0;i < n; i++) {
int k;
cin >> k;
ms.insert(k); //把数据放到multiset里
if(mp[k] == 0) mp[k] = i + 1; //存一组映射
}
while (m--) {
int t;
cin >> t;
int it = *ms.lower_bound(t); //lower_bound大显身手
if(it != t) cout << -1 << ' ';
else cout << mp[it] << ' ';
}
return 0;
}