可以看到代码写的是优化后的平方暴力。
本来正着枚举 j 80pts 就 T 最后一个点,抱着试一试的心态倒着枚举 j 直接过了。。。
inline void solve() {
read(n);
memset(buc + 1, 0, sizeof(int) * n);
memset(dp + 1, 0, sizeof(bool) * n);
for(int i = 1; i <= n; i++) read(a[i]);
for(int i = 1; i <= n; i++) pre[i] = buc[a[i]], buc[a[i]] = i;
int ans = 0;
for(int i = 1; i <= n; i++) {
if(!pre[i]) { dp[i] = 1; continue; }
if(dp[i] |= dp[pre[pre[i]]]) ;
else for(int j = i - 1; j > pre[i]; j--) {
if(pre[j] && (dp[i] |= dp[pre[j]])) break;
}
if(dp[pre[i]]) ans = i;
}
printf("%d\n", ans);
}
在 Luogu Subtask 用时计算制下跑的比我的正解还要快:暴力 25ms 正解 27ms。