当前位置: 首页 > article >正文

洛谷 P10288 [GESP样题 八级] 区间 C++ 完整题解(STL二分法)

本文并非最优解,但能通过。

一、题目链接

P10288 [GESP样题 八级] 区间 - 洛谷

二、解题思路

**本题的大意就是求出a[l~r]间x出现的次数,由于数据较大、较多,所以暴力容易超时。**

首先新建一个mp,mp[x]是一个vector,里面存放从前到后x出现的下标。

map<int, vector<int> > mp;

如下,在输入时录入每个下标。

for (int i = 1; i <= n; i++) {
    int x;
    cin >> x;
    mp[x].push_back(i);
}

接下来就是查询:

首先认识两个函数

简单用法:
upper_bound(起点, 终点, x);
返回从起点到终点第一个【大于】x的位置 返回类型是iterator。
例如upper_bound(v.begin(), v.end(), x)

lower_bound(起点, 终点, x);
返回从起点到终点第一个【不小于】x的位置 返回类型是iterator。
例如lower_bound(v.begin(), v.end(), x)

!!!如果找不到, 返回最后一个元素后面的位置

所以:

while (q--) {
    int l, r, x;
    cin >> l >> r >> x;
    cout << upper_bound(mp[x].begin(), mp[x].end(), r) - lower_bound(mp[x].begin(), mp[x].end(), l) << endl;
}

三、完整代码

温馨提示:看最后面的代码。

#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;


int main() {
    int T;
    cin >> T;
    while (T--) {
        int n, q;
        map<int, vector<int> > mp;
        cin >> n;
        for (int i = 1; i <= n; i++) {
            int x;
            cin >> x;
            mp[x].push_back(i);
        }
        cin >> q;
        while (q--) {
            int l, r, x;
            cin >> l >> r >> x;
            cout << upper_bound(mp[x].begin(), mp[x].end(), r) - lower_bound(mp[x].begin(), mp[x].end(), l) << endl;
        }
    }
    return 0;
}

居然超时

在这里,加上ios::sync...也没有AC,我们需要把cin, cout改成scanf, printf或快读快写。

#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;

map<int, vector<int> > mp;

int main() {
    int T;
    scanf("%d", &T);
    while (T--) {
        mp.clear();
        int n, q;
        scanf("%d", &n);
        for (int i = 1; i <= n; i++) {
            int x;
            scanf("%d", &x);
            mp[x].push_back(i);
        }
        scanf("%d", &q);
        while (q--) {
            int l, r, x;
            scanf("%d%d%d", &l, &r, &x);
            printf("%d\n", upper_bound(mp[x].begin(), mp[x].end(), r) - lower_bound(mp[x].begin(), mp[x].end(), l));
        }
    }
    return 0;
}

有错请大方指出谢谢!

有错别字请大方指出谢谢! 


http://www.kler.cn/a/527484.html

相关文章:

  • HTML(快速入门)
  • 玩转大语言模型——使用langchain和Ollama本地部署大语言模型
  • python | OpenCV小记(一):cv2.imread(f) 读取图像操作(待更新)
  • 渗透测试技法之口令安全
  • pytorch实现半监督学习
  • 全程Kali linux---CTFshow misc入门(14-24)
  • MySQL为什么默认引擎是InnoDB ?
  • 【Leetcode算题记录】枚举技巧(枚举右,维护左)
  • VisionMamba安装
  • Java小白入门教程:三种注释+快捷方式
  • 三傻排序的比较(选择,冒泡,插入)
  • C++——类和对象(下)
  • js基础(黑马)
  • 基于Scrapy采集豆瓣电影Top250的详细数据
  • Java小白入门教程:类?方法?变量?
  • 【LLM-agent】(task1)简单客服和阅卷智能体
  • Hugging Face 推出最小体积多模态模型,浏览器运行成为现实!
  • 学习Python编程,需要哪些编程语言基础?如何开始学习Python?
  • 概述、 BGP AS 、BGP 邻居、 BGP 更新源 、BGP TTL 、BGP路由表、 BGP 同步
  • Python微服务框架Nameko | python 小知识
  • 实现使用K210单片机进行猫脸检测,并在检测到猫脸覆盖屏幕50%以上时执行特定操作
  • Koa 基础篇(二)—— 路由与中间件
  • 事务04之死锁,锁底层和隔离机制原理
  • 【C++语言】卡码网语言基础课系列----4. A+B问题IV
  • 使用 Tauri 2 + Next.js 开发跨平台桌面应用实践:Singbox GUI 实践
  • Flask 使用Flask-SQLAlchemy操作数据库