|
思路: 如果之前出现过长度为 len 的子序列。假设该子序列出现在 [a, b] 之间。 那如果存在 1, 2, ... K 任意一个数字出现在 [a, b] 之间,则必然存在一个长度为 len + 1 的非子序列。
代码: 从后往前推。用的是链表。94ms AC。 速度一般,还是不知道那些 0ms 是怎么搞出来的。 有人说可以从前往后推,可能会快一点吧。
#include <stdio.h>
#define MAX_N 100032 #define MAX_K 10032
struct node { int idx; struct node *next; }; struct node nodes[MAX_N], *pos[MAX_K]; int N, K, left;
int main() { int i, j, len;
freopen("e:\\test\\in.txt", "r", stdin); scanf("%d%d", &N, &K); for (i = 0; i < N; i++) { scanf("%d", &j); nodes[i].idx = i; nodes[i].next = pos[j]; pos[j] = &nodes[i]; }
left = N + 1; for (len = 1; len <= N; len++) { j = left; for (i = 1; i <= K; i++) { while (pos[i] && pos[i]->idx >= left) pos[i] = pos[i]->next; if (!pos[i]) break; if (pos[i]->idx < j) j = pos[i]->idx; } if (i <= K) break; left = j; } printf("%d\n", len);
return 0; }
|