双指针思路
步骤:
(1) 枚举左端点
(2) 如果当前符合条件,不断移动右端点,直到无法移动
(3) 更新答案
(4) 判断左右端点是否重合
· 重合:强制移动右端点
· 不重合:看左端点移动的时候是否需要维护信息
* 左端点在 for 循环里自己会增加,不需要手动去移动左端点
例题:ABC 381 / D
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5 + 5, INF = 1e18;int T, n, cnt, ans, a[N], vis[N];
string s;int f(int hd)
{int res = 0;for (int i = 1; i <= N; i ++)vis[i] = 0;for (int l = hd, r = hd; l < n; l += 2){while (a[r] == a[r + 1] && vis[a[r]] == 0 && r + 1 <= n){vis[a[r]] = 1;r += 2;}res = max(res, r - l);if (l == r)r += 2;elsevis[a[l]] = 0;}return res;
}signed main()
{cin >> n;for (int i = 1; i <= n; i ++)cin >> a[i];ans = max(f(1), f(2));cout << ans;return 0;
}