题目描述

博览馆正在展出由世上最佳的 m 位画家所画的图画。

游客在购买门票时必须说明两个数字,a 和 b,代表他要看展览中的第 a 幅至第 b 幅画(包含 a,b)之间的所有图画,而门票的价钱就是一张图画一元。

Sept 希望入场后可以看到所有名师的图画。当然,他想最小化购买门票的价格。

请求出他购买门票时应选择的 a,b,数据保证一定有解。

若存在多组解,输出 a 最小的那组

输入格式

第一行两个整数 n,m,分别表示博览馆内的图画总数及这些图画是由多少位名师的画所绘画的。

第二行包含 n 个整数 ai​,代表画第 i 幅画的名师的编号。

输出格式

一行两个整数 a,b。

输入输出样例

输入 #1

12 5
2 5 3 1 3 2 4 1 1 5 4 3

输出 #1

2 7

说明/提示

数据规模与约定

  • 对于 30% 的数据,有 n≤200,m≤20。
  • 对于 60% 的数据,有 n≤105,m≤103。
  • 对于 100% 的数据,有 1≤n≤106,1≤ai​≤m≤2×103。

题目大意

此题想让我们从给定数列中找一个包含m个不同值的区间

这道题我们来用双指针(尺取法)来做

思路大概是这样的:

1. 先定义两个变量L和R。

2. 固定左端点L,向后挪动右端点R,直到当前区间[L, R]出现m个不同的值

3. 再挪移左端点L,如果区间[L, R]还满足包含m个不同的值,判断此区间是否优于第二步求出的区间,更新数据;如果区间[L, R]不满足包含m个不同的值,那就挪移右端点R直到满足条件,再判断此区间是否优于第二步求出的区间,更新数据。

来看代码(注意看注释)

#include <iostream>
using namespace std;
const int N0 = 1e6 + 5;
const int N10 = 2e3 + 5;
int N, M;
int a[N0];//原数组
int h[N10];//桶排数组
int cnt;//计数,看此区间内包含几个不同的值
int l, r;//临时的左端点和右端点
int lb, rb, sz;//分别表示最终的左端点,右端点和大小
int main(){ios::sync_with_stdio(false);cin >> N >> M;for(int i = 1; i <= N; i++){cin >> a[i];}l = 1;//初始化for(r = 1; r <= N; r++){if(h[a[r]] == 0){//判断a[r]有没有在之前的数组中出现,如果没有,那cnt++cnt++;}h[a[r]]++;if(cnt == M){sz = r - l + 1;lb = l;rb = r;break;}}for(l = 2; l <= N; l++){if(h[a[l - 1]] == 1) cnt--;h[a[l - 1]]--;while(cnt < M && r + 1 <= N){//数组中有不到m个不同的值,挪移rr++;if(h[a[r]] == 0) cnt++;h[a[r]]++;}if(cnt == M){//如果数组中有m个不同的值,判断是否更新if(r - l + 1 < sz){sz = r - l + 1;rb = r;lb = l;}}}cout << lb << " " << rb;//输出return 0;
}

洛谷P1638 逛画展相关推荐

  1. 洛谷 P1638 逛画展

    洛谷 P1638 逛画展 题目链接 题目描述 博览馆正在展出由世上最佳的 M 位画家所画的图画. wangjy想到博览馆去看这几位大师的作品. 可是,那里的博览馆有一个很奇怪的规定,就是在购买门票时必 ...

  2. 洛谷 [P1638 逛画展] (尺取法)

    Link https://www.luogu.org/problemnew/show/P1638 Description  博览馆正在展出由世上最佳的 M 位画家所画的图画.wangjy想到博览馆去看 ...

  3. 洛谷P1638 逛画展-最简单的双指针做法

    思路:定义双指针x和y代表[x,y]区间,初始化x=y=0开始遍历,刚开始时一直增加y直到包含了所有作家的画,然后就从左边x开始删区间有重复作家的画就行.注意不要把任何一个作家的画删到0!! 代码如下 ...

  4. 【洛谷 P1638】 【单调队列】 逛画展

    [洛谷 P1638] [单调队列] 逛画展 题目 解题思路 先求出最前面囊括所有画的位置 然后如果左边界的画不止存在一次,左边界右移 不断扩展右边界,求取答案 代码 #include<iostr ...

  5. 尺取法 P1638 逛画展

    P1638 逛画展 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 其实就是求刚好拥有所有m种数字的最短区间 思路: 尺取法 当区间内数字种数刚好为m时记录一下最小区间长度 ...

  6. P1638 逛画展(尺取)

    逛画展 - 洛谷https://www.luogu.com.cn/problem/P1638 #include <iostream> #include <cstdio> #in ...

  7. P1638 逛画展——尺取法的妙用

    题目描述 博览馆正在展出由世上最佳的 mm 位画家所画的图画. 游客在购买门票时必须说明两个数字,aa 和 bb,代表他要看展览中的第 aa 幅至第 bb 幅画(包含 a,ba,b)之间的所有图画,而 ...

  8. 洛谷 P3953 逛公园

    原题链接 题目描述 策策同学特别喜欢逛公园.公园可以看成一张 NN 个点 MM 条边构成的有向图,且没有 自环和重边.其中 11 号点是公园的入口,NN 号点是公园的出口,每条边有一个非负权值, 代表 ...

  9. 洛谷P3953 逛公园(dp 拓扑排序)

    题意 题目链接 Sol 去年考NOIP的时候我好像连最短路计数都不会啊qwq.. 首先不难想到一个思路,\(f[i][j]\)表示到第\(i\)个节点,与最短路之差长度为\(j\)的路径的方案数 首先 ...

最新文章

  1. 电子学会青少年编程等级考试四级题目解析07
  2. 有哪些好用的企业目标管理和任务协作软件?
  3. ubuntu下安装wine
  4. ​ RROR 1221 (HY000): Incorrect usage of spatial/fulltext/hash index and explicit index orde ​
  5. 徒手撸了个markdown笔记平台
  6. 【C++学习之路】第二章——C++基础语法学习(1)之黑客攻击系统
  7. Linux文件、文件内容搜索大全(find,grep命令)
  8. 两款Docker管理UI:DockerUI Shipyard
  9. 《软件测试方法和技术》电子课件下载
  10. Rasa课程、Rasa培训、Rasa面试系列之: Rasa客户案例nib Group 保险公司
  11. 基带传输编码方式HDB3码的快速编码步骤、原理及举例
  12. 华为php工程师待遇,【博士Offer求比较】211vs华为vs半导体设备商 - 找工作啦(Job)版 - 北大未名BBS...
  13. excel更改日期格式无效_Excel日期不会更改格式
  14. 电商平台中的9种共性推荐策略
  15. 前端使用高德地图url实现地图定位
  16. 物联网卡是什么?物联网卡有哪些功能?
  17. UCEs(超保守元件)常见问题,系统发育和进化研究新方法(即用型脊椎动物(辐鳍鱼类,鲈形目,骨鳔类) 无脊椎动物(蛛形纲,蜘蛛目,鞘翅目,双翅目,半翅目,膜翅目,鳞翅目)UCE探针,其他可定制)
  18. Dev --gridView中CheckItem的多选设置
  19. 堆栈溢出:Stack overflow (参数: 0x0000000000000001, 0x0000005410A03FF8)
  20. 知乎搜索排序模型的演进

热门文章

  1. STM32F103CB控制超声波HCSR04可用程序
  2. TCL info命令
  3. 特斯拉AI Day:车企能造好机器人吗?
  4. c语言大数运算知乎,为什么知乎上大多数人不推荐C语言入门?
  5. nodejs websocket 实现简易聊天室功能
  6. “5G消息”应用案例!七大银行试商用情况汇总!
  7. Leetcode- 岛屿数量
  8. java多元_Java多元运算符-WEB资讯专栏-DMOZ中文网站分类目录-免费收录各类优秀网站的中文网站目录....
  9. 编程练习:编写一个函数,用于计算某长方形面积的函数
  10. 一支口红用了5年_一支口红用多久最好 口红一般用多久