洛谷1638(尺取)

起手式:

1.l = 1, r = 0;2.while循环里先用r往右试探,探到了或者到头了就停;3.然后用l往右探,不满足条件了就停;4.更新答案,然后如果发现指针没什么前途了就break出去输出答案。

主代码:

 1 const int maxn = 1e6 + 5;
 2 int n, a[maxn], m, p, l, r;
 3 int in[2005], ansl, ansr, ans = inf;
 4 
 5 int main() {
 6     read(n), read(m);
 7     rep(i, 1, n)    read(a[i]);
 8     l = 1, r = 0, p = 0;
 9     while (true) {
10         bool flag1 = false, flag2 = false;
11         while (p < m && r < n) {
12             flag1 = true;
13             if (!in[a[++r]])    p++;
14             in[a[r]]++;
15         }
16         while (p == m && l < r) {
17             flag2 = true;
18             if (in[a[l]] == 1)    p--;
19             in[a[l++]]--;
20         }
21         if (p + flag2 == m && r - l + 1 + flag2 < ans) {
22             ans = r - l + 1 + flag2;
23             ansl = l - flag2, ansr = r;
24         }
25         if (not flag1 &&  not flag2)    break;
26     }
27     printf("%d %d\n", ansl, ansr);
28     return 0;
29 }

 

posted @ 2019-03-11 23:36  AlphaWA  阅读(218)  评论(0编辑  收藏  举报