2 条题解
-
0
每个右端点调整到合适的左端点的双指针
#include <bits/stdc++.h> using namespace std; int n, m; int a[1000000 + 5]; int flag[2005]; // 记录每位画家的画出现了几次 int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> n >> m; for (int i = 1; i <= n; i++) cin >> a[i]; int ansL, ansR; ansL = 1, ansR = n; // 一开始没有画 int cnt = 0; for (int l = 1, r = 1; r <= n; r++) { // 当前的第 r 幅画是新加进来的 flag[a[r]]++; if (flag[a[r]] == 1) cnt++; // 对于当前的右端点 r,把左端点 l 尽可能往右移 while (flag[a[l]] > 1) { flag[a[l]]--; l++; } if (cnt == m) { if (r - l + 1 < ansR - ansL + 1 || r - l + 1 == ansR - ansL + 1 && l < ansL) ansL = l, ansR = r; } } cout << ansL << " " << ansR << "\n"; return 0; }
信息
- ID
- 2431
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 3
- 标签
- 递交数
- 18
- 已通过
- 6
- 上传者