csp信奥赛C++标准模板库STL案例应用1

binary_search实践
题目描述
虽然 Miss Medusa 到了北京,领了科技创新奖,但是她还是觉得不满意。原因是:她发现很多人都和她一样获了科技创新奖,特别是其中的某些人,还获得了另一个奖项------特殊贡献奖。而越多的人获得了两个奖项,Miss Medusa 就会越眼红。于是她决定统计有哪些人获得了两个奖项,来知道自己有多眼红。
输入格式
第一行两个整数 n , m n, m n,m,表示有 n n n 个人获得科技创新奖, m m m 个人获得特殊贡献奖。
第二行 n n n 个正整数,表示获得科技创新奖的人的编号。
第三行 m m m 个正整数,表示获得特殊贡献奖的人的编号。
输出格式
输出一行,为获得两个奖项的人的编号,按在科技创新奖获奖名单中的先后次序输出。
输入输出样例 1
输入 1
4 3
2 15 6 8
8 9 2
输出 1
2 8
说明/提示
对于 60 % 60\% 60% 的数据, 0 ≤ n , m ≤ 1000 0 \leq n, m \leq 1000 0≤n,m≤1000,获得奖项的人的编号 < 2 × 1 0 9 \lt 2 \times 10^9 <2×109;
对于 100 % 100\% 100% 的数据, 0 ≤ n , m ≤ 1 0 5 0 \leq n, m \leq 10^5 0≤n,m≤105,获得奖项的人的编号 < 2 × 1 0 9 \lt 2 \times 10^9 <2×109。
输入数据保证第二行任意两个数不同,第三行任意两个数不同。
题目分析
问题理解:本题要求找出同时获得科技创新奖和特殊贡献奖的人,并按照科技创新奖名单中的先后顺序输出这些人的编号。
核心思路:
- 科技创新奖名单的顺序必须保持,不能打乱
- 特殊贡献奖名单可以用来快速判断某个人是否也获得了该奖项
- 需要对科技创新奖名单中的每个人,检查是否在特殊贡献奖名单中
算法选择分析:
- 直接暴力查找(O(n×m))会超时,因为n和m最大可达10^5
- 使用排序+二分查找的方法,时间复杂度为O(m log m + n log m)
代码实现
cpp
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10; // 定义数组大小,满足题目最大数据范围
int n,m,a[N],b[N]; // a[]存储科技创新奖名单,b[]存储特殊贡献奖名单
int main(){
cin>>n>>m;
// 读入科技创新奖名单(保持原始顺序)
for(int i=1;i<=n;i++) cin>>a[i];
// 读入特殊贡献奖名单
for(int i=1;i<=m;i++) cin>>b[i];
// 对特殊贡献奖名单进行排序,为二分查找做准备
// 排序后b[1]到b[m]按升序排列
sort(b+1,b+m+1);
// 遍历科技创新奖名单中的每个人
for(int i=1;i<=n;i++){
// 在排序后的特殊贡献奖名单中二分查找a[i]
// binary_search返回布尔值,表示是否找到
bool found=binary_search(b+1,b+m+1,a[i]);
// 如果找到,说明该人同时获得两个奖项
if(found) cout<<a[i]<<" ";
}
return 0;
}
功能分析
优点:
- 时间复杂度合理:O(m log m + n log m) ≈ O(10^5 log 10^5),可以在1秒内完成
- 保持顺序:按照科技创新奖名单的原始顺序输出,满足题目要求
- 空间效率:只使用了两个数组,空间复杂度O(n+m)
时间复杂度分析:
- 排序特殊贡献奖名单:O(m log m)
- n次二分查找:O(n log m)
- 总复杂度:O((n+m) log m) ≈ 10^5 × 17 = 1.7×10^6次操作,非常高效
空间复杂度分析:
- 两个数组:O(n+m) = O(2×10^5) ≈ 800KB,非常小
边界情况处理:
- n=0或m=0时,程序也能正确处理
- 所有编号都不同,不需要考虑重复问题
- 使用binary_search时,b数组必须先排序
各种学习资料,助力大家一站式学习和提升!!!
cpp
#include<bits/stdc++.h>
using namespace std;
int main(){
cout<<"########## 一站式掌握信奥赛知识! ##########";
cout<<"############# 冲刺信奥赛拿奖! #############";
cout<<"###### 课程购买后永久学习,不受限制! ######";
return 0;
}
- 一、CSP信奥赛C++通关学习视频课:
- C++语法基础
- C++语法进阶
- C++算法
- C++数据结构
- CSP信奥赛数学
- CSP信奥赛STL
- 二、CSP信奥赛C++竞赛拿奖视频课:
- 信奥赛csp-j初赛高频考点解析
- CSP信奥赛C++复赛集训课(12大高频考点专题集训)
- 三、考级、竞赛刷题题单及题解:
- GESP C++考级真题题解
- CSP信奥赛C++初赛及复赛高频考点真题解析
- CSP信奥赛C++一等奖通关刷题题单及题解
详细内容:
1、csp/信奥赛C++,完整信奥赛系列课程(永久学习):
https://edu.csdn.net/lecturer/7901 点击跳转



2、CSP信奥赛C++竞赛拿奖视频课:
https://edu.csdn.net/course/detail/40437 点击跳转

3、csp信奥赛冲刺一等奖有效刷题题解:
CSP信奥赛C++初赛及复赛高频考点真题解析(持续更新):https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转
- 2025 csp-j 复赛真题及答案解析(最新更新)
- 2025 csp-x(山东) 复赛真题及答案解析(最新更新)
- 2025 csp-x(河南) 复赛真题及答案解析(最新更新)
- 2025 csp-x(辽宁) 复赛真题及答案解析(最新更新)
- 2025 csp-x(江西) 复赛真题及答案解析(最新更新)
- 2025 csp-x(广西) 复赛真题及答案解析(最新更新)
- 2020 ~ 2024 csp 复赛真题题单及题解
- 2019 ~ 2022 csp-j 初赛高频考点真题分类解析
- 2021 ~ 2024 csp-s 初赛高频考点解析
- 2023 ~ 2024 csp-x (山东)初赛真题及答案解析
- 2024 csp-j 初赛真题及答案解析
- 2025 csp-j 初赛真题及答案解析(最新更新)
- 2025 csp-s 初赛真题及答案解析(最新更新)
- 2025 csp-x (山东)初赛真题及答案解析(最新更新)
- 2025 csp-x (江西)初赛真题及答案解析(最新更新)
- 2025 csp-x (辽宁)初赛真题及答案解析(最新更新)
CSP信奥赛C++一等奖通关刷题题单及题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12673810.html 点击跳转
- 129 道刷题练习和详细题解,涉及:模拟算法、数学思维、二分算法、 前缀和、差分、深搜、广搜、DP专题、 树和图
4、GESP C++考级真题题解:

GESP(C++ 一级+二级+三级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12858102.html 点击跳转

GESP(C++ 四级+五级+六级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12869848.html 点击跳转
· 文末祝福 ·
cpp
#include<bits/stdc++.h>
using namespace std;
int main(){
cout<<"跟着王老师一起学习信奥赛C++";
cout<<" 成就更好的自己! ";
cout<<" csp信奥赛一等奖属于你! ";
return 0;
}