P1638 逛画展(直尺法)】的更多相关文章

[洛谷P1638]逛画展 题目大意: 有\(n(n\le10^6)\)个格子,每个格子有一种颜色.颜色种数为\(m(m\le2000)\).求包含所有颜色的最小区间. 思路: 尺取法裸题. 思路: #include<cstdio> #include<cctype> #include<climits> inline int getint() { register char ch; while(!isdigit(ch=getchar())); register int x=…
P1638 逛画展 题目描述 博览馆正在展出由世上最佳的 M 位画家所画的图画. wangjy想到博览馆去看这几位大师的作品. 可是,那里的博览馆有一个很奇怪的规定,就是在购买门票时必须说明两个数字, a和b,代表他要看展览中的第 a 幅至第 b 幅画(包含 a 和 b)之间的所有图画,而门票 的价钱就是一张图画一元. 为了看到更多名师的画,wangjy希望入场后可以看到所有名师的图画(至少各一张). 可是他又想节省金钱... 作为wangjy的朋友,他请你写一个程序决定他购买门票时的 a 值和…
这道题是直尺法的模板题: #include<iostream> using namespace std; ; ; int n, m, a[maxn], vis[M]; int main(){ cin >> n >> m; ; i < n; ++i)cin >> a[i]; , en = , num = , res = n, l = , r = n; ){ while (en < n&&num < m){ )num++; }…
题目链接:https://www.luogu.com.cn/problem/P1638 题目大意: 给你一个长度为 \(n (\le 10^6)\) 的数组,数组中每个元素的范围在 \(1\) 至 \(m\) 之间(\(1 \le m \le 2000\)), 求一个最短的连续子序列包含 \(1\) 到 \(m\) 内的所有元素. 解题思路: 这道题目我的解法是开一个队列,队列里面的元素是连续的. 那么怎么保证这个队列是连续的呢? 我只需要从 1 到 n 将每个元素入队,然后在需要的时候讲队首元…
传送门啦 只需记录满足条件的一个区间的初始端点 $ (head, tail) $ ,不断删掉左端点 $ head $ ,不断更新右端点 $ tail $ : 开一个 $ vis[] $ 记录一下每幅画出现的次数, 删除左端点时,判断一下左端点对应的这幅画是否在 $ [ head+1, tail ] $ 区间里存在,即 $ vis[head]>0 $ ; 反之去更新,去寻找被删掉的点对应的下一幅画,更新 \(tail\) . #include <iostream> #include <…
题目描述 博览馆正在展出由世上最佳的 M 位画家所画的图画. wangjy想到博览馆去看这几位大师的作品. 可是,那里的博览馆有一个很奇怪的规定,就是在购买门票时必须说明两个数字, a和b,代表他要看展览中的第 a 幅至第 b 幅画(包含 a 和 b)之间的所有图画,而门票 的价钱就是一张图画一元. 为了看到更多名师的画,wangjy希望入场后可以看到所有名师的图画(至少各一张). 可是他又想节省金钱... 作为wangjy的朋友,他请你写一个程序决定他购买门票时的 a 值和 b 值. 输入输出…
题目描述 博览馆正在展出由世上最佳的 M 位画家所画的图画. wangjy想到博览馆去看这几位大师的作品. 可是,那里的博览馆有一个很奇怪的规定,就是在购买门票时必须说明两个数字, a和b,代表他要看展览中的第 a 幅至第 b 幅画(包含 a 和 b)之间的所有图画,而门票 的价钱就是一张图画一元. 为了看到更多名师的画,wangjy希望入场后可以看到所有名师的图画(至少各一张). 可是他又想节省金钱... 作为wangjy的朋友,他请你写一个程序决定他购买门票时的 a 值和 b 值. 输入输出…
原题传送门 思路这道题目可以通过尺取法来完成 (我才不管什么必须用队列)什么是尺取法呢?顾名思义,像尺子一样取一段,借用挑战书上面的话说,尺取法通常是对数组保存一对下标,即所选取的区间的左右端点,然后根据实际情况不断地推进区间左右端点以得出答案.之所以需要掌握这个技巧,是因为尺取法比直接暴力枚举区间效率高很多,尤其是数据量大的时候,所以尺取法是一种高效的枚举区间的方法,一般用于求取有一定限制的区间个数或最短的区间等等.当然任何技巧都存在其不足的地方,有些情况下尺取法不可行,无法得出正确答案. 首…
尺取法的经典题目: 博览馆正在展出由世上最佳的 mm 位画家所画的图画. 游客在购买门票时必须说明两个数字,aa 和 bb,代表他要看展览中的第 aa 幅至第 bb 幅画(包含 a,ba,b)之间的所有图画,而门票的价钱就是一张图画一元. Sept 希望入场后可以看到所有名师的图画.当然,他想最小化购买门票的价格. 请求出他购买门票时应选择的 a,ba,b,数据保证一定有解. 若存在多组解,输出 aa 最小的那组. 首次了解到有尺取法这个东西,实际上就是双指针维护.用从cnt[i]维护区间每种画…
题目大意:给定 N 个数字组成的序列,求刚好拥有所有 M 种数字的最短区间. 题解:双指针算法是一种对于暴力的优化算法,对于这道题来说,一个显然的暴力是:对于序列中每一个位置 pos,计算出这个位置右边恰好满足条件的位置 f[pos],时间复杂度为 \(O(n^2)\).考虑对于每一个位置的计算位置,计算位置的值单调不降,因此,这就没有必要重复计算一些位置,直接扫描一遍即可统计出答案.因此,采用双指针扫描即可. 双指针算法的步骤如下: 未满足条件,则右端点不断向右扩展. 若仍不满足条件,则退出循…