双指针:逛画展
题目:P1638 逛画展 - 洛谷
题目概述:要看所有画家的话,要最省钱。
思路:求最短距离,要求最小距离包含所有的不同的元素。和双指针的题型很像,用双指针解决。
不同的是,题目要求我们给出计算后的起始位置和终止位置。因为肯定会计算出最短距离,所以我们不用再设置一个end:begin+最短距离,就可以计算出end位置。
- 最短距离:right - left + 1
- 满足kind条件后:计算出的距离如果小于之前的距离,更新begin,更新最短距离。
#include <iostream>
#include <unordered_map>using namespace std;int n, m;
const int N = 2e6 + 10;
int a[N];int mp[N];int main()
{cin >> n >> m;//有多少画,由几个作家画的 for (int i = 1; i <= n; i++) cin >> a[i];int left = 1, right = 1, kind = 0;int begin = 1; int ret = n+1;while(right <= n){if (mp[a[right]]++ == 0) kind++; while(kind == m){if (right-left+1 < ret)//求最省的钱 {ret = right-left+1;begin = left;}if(mp[a[left]]-- == 1) kind--; left++;}right++;}cout << begin << " " << begin+ret-1 << endl;
}