蓝桥杯 日志统计 STL尺取

该代码实现了一个解决区间覆盖问题的算法,利用滑动窗口思路,维护一个集合st来存储满足条件的元素。输入包含n个区间,每个区间由开始和结束时间组成,目标是找出所有连续时间d内出现次数大于等于k的元素。算法首先对区间按开始时间排序,然后通过移动左边界l和右边界r来更新元素计数,并将符合条件的元素插入集合。最后输出集合中的所有元素。

原题链接 来自蓝桥云课icon-default.png?t=M276https://www.lanqiao.cn/problems/179/learning/ 

#include  <bits/stdc++.h>
using namespace std;

map<int, int> mp;
set<int> st;
set<int>::iterator p;
pair<int, int> v[100100];

int work()
{
    int i, j, t;
    int n, d, k;
    scanf("%d%d%d", &n, &d, &k);

    for (i = 0; i < n; i++) scanf("%d%d", &v[i].first, &v[i].second);
    sort(v, v+n);

    int l = 0, r = 0;
    while (r < n)
    {
      while (v[r].first - v[l].first < d && r < n)
      {
        mp[v[r].second]++;
        if (mp[v[r].second] >= k)
        {
          st.insert(v[r].second);
        }
        r++;
      }
      while (v[r].first - v[l].first >= d)
      {
        mp[v[l].second]--;
        l++;
      }
    }

    for (p = st.begin(); p != st.end(); p++)
      printf ("%d\n", *p);

    return 0;
}

int main()
{
    int T = 1;
    //scanf("%d", &T);
    while (T--) work();
    return 0;
}

<think>嗯,用户让我帮忙找能用在蓝桥杯上的STL。首先,我需要了解蓝桥杯的竞赛要求。蓝桥杯通常允许使用C++STL,所以得整理常用的STL容器和算法,这些在比赛中能提高效率。 首先,用户可能对STL不太熟悉,或者想确认哪些部分最有用。需要分点列出常用的容器,比如vector、string、queue这些,每个容器要说明用途和常见操作,比如vector的插入、删除,以及注意事项,比如提前reserve节省时间。 然后,算法部分也很重要。比如sort、lower_bound这些,可能在排序和查找题目中常用。需要提醒用户注意算法的使用场景,比如sort需要随机访问迭代器,所以不能用于list。 接下来是关联容器,比如set和map。这些在处理需要自动排序或者快速查找的情况很有用。比如map可以用于计数,但得提到插入和访问的时间复杂度,O(log n)。 还有适配器,比如stack和queue,可能在特定题目中使用,比如括号匹配或者BFS。这时候需要给出例子,比如用栈处理表达式。 可能用户还会需要一些高级的数据结构,比如priority_queue,用于贪心或Dijkstra算法。这时候需要说明如何定义比较函数,最大堆还是最小堆。 另外,字符串处理方面,string的substr、find等方法可能会有用,提醒用户注意这些函数的参数和返回值。 还需要考虑一些常见问题,比如性能优化。比如vector的reserve,或者unordered_map在C++11中的支持,但得确认比赛是否允许C++11,因为蓝桥杯可能有限制。 可能用户还会漏掉一些有用的工具,比如pair和tuple,这些在组合数据时很有帮助。或者bitset处理位操作的问题,这时候需要举例子说明。 最后,需要总结一下,建议用户熟悉这些容器和算法的基本操作,多练习,避免比赛时忘记语法。同时提醒注意时间复杂度,选择合适的结构,比如在频繁查找时用map而不是线性搜索。</think>在蓝桥杯算法竞赛中,C++ STL(标准模板库)能显著提升编码效率。以下是经过整理的实用STL组件及其典型应用场景: --- ### 一、序列容器 1. **`vector`动态数组** - 场景:替代原生数组,支持动态扩容 - 核心操作: ```cpp v.push_back(x); // 尾部插入 v.pop_back(); // 尾部删除 v.resize(n); // 调整大小 v.reserve(100); // 预分配空间(减少扩容耗时) ``` - 注意:随机访问O(1),中间插入/删除O(n) 2. **`string`字符串** - 场景:字符串处理 - 实用方法: ```cpp s.substr(pos, len); // 子串 s.find("abc"); // 查找子串 stoi(s); // 字符串转整数 ``` --- ### 二、适配器容器 1. **`stack`栈** - 场景:括号匹配、DFS非递归实现 - 示例: ```cpp stack<int> st; st.push(10); int top = st.top(); st.pop(); ``` 2. **`queue`队列** - 场景:BFS广度优先搜索 - 注意:优先使用`deque`的`push_back`和`pop_front` --- ### 三、关联容器 1. **`set`有序集合** - 特性:自动排序、元素唯一 - 关键操作: ```cpp s.insert(5); // 插入元素 auto it = s.find(3); // O(log n)查找 s.erase(it); // 删除迭代器指向元素 ``` 2. **`map`键值对** - 典型应用:统计词频 - 示例: ```cpp map<string, int> mp; mp["apple"]++; // 自动初始化为0 for(auto &[k,v] : mp) // C++17结构化绑定 ``` --- ### 四、高效算法 1. **快速排序与查找** ```cpp sort(v.begin(), v.end()); // 默认升序 sort(v.rbegin(), v.rend()); // 降序排列 auto pos = lower_bound(v.begin(), v.end(), 42); // 首个≥42的位置 ``` 2. **全排列生成** ```cpp string s = "abc"; do { cout << s << endl; } while(next_permutation(s.begin(), s.end())); ``` --- ### 五、其他实用工具 1. **`priority_queue`优先队列** - 场景:Dijkstra算法、哈夫曼编码 - 定义方式: ```cpp // 小根堆(默认大根堆) priority_queue<int, vector<int>, greater<int>> pq; ``` 2. **`bitset`位操作** - 场景:状态压缩、位运算优化 - 示例: ```cpp bitset<32> bs(0xff); if(bs.test(3)) { /*检查第3位是否为1*/ } ``` --- ### 六、注意事项 1. 提前熟悉STL的时间复杂度(如`unordered_map`平均O(1)但可能冲突) 2. 蓝桥杯环境通常支持C++11标准,但需确认是否允许使用`#include <bits/stdc++.h>` 3. 推荐练习题目:表达式求值(栈)、KMP优化(字符串)、最短路(优先队列) 建议结合《算法笔记》等教材进行专项训练,重点掌握各容器的API边界条件(如`vector`的`end()`指向末尾后一位),这将帮助您在比赛中快速实现算法思路。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值