题解 P2249 查找

这道题刚一看数据范围,就知道一般的查找肯定会爆,只能用二分,但二分查找代码太过冗长,记不住怎么办?(凉拌 ),所以,我们就搬出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;
}
发布了9 篇原创文章 · 获赞 1 · 访问量 515

猜你喜欢

转载自blog.csdn.net/live_now/article/details/105024738
今日推荐