525 字
3 分钟
BZOJ 2090 [Poi2010] Monotonicity 2
Description
给出N个正整数a[1..N],再给出K个关系符号(>、<或=)s[1..k]。 选出一个长度为L的子序列(不要求连续),要求这个子序列的第i项和第i+1项的的大小关系为s[(i-1)mod K+1]。 求出L的最大值。
Input
第一行两个正整数,分别表示N和K (N, K <= 500,000)。 第二行给出N个正整数,第i个正整数表示a[i](a[i] <= 10^6)。 第三行给出K个空格隔开关系符号(>、<或=),第i个表示s[i]。
Output
一个正整数,表示L的最大值。
Sample Input
7 3
2 4 3 1 3 5 3
< > =
Sample Output
6
HINT
选出的子序列为2 4 3 3 5 3,相邻大小关系分别是< > = < >。
题解
权值树状数组优化DP
不会正确性证明
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
const int MaxN = 1000000;
int Max1[MaxN + 5], Max2[MaxN + 5], Max3[MaxN + 5];
#define lowbit(_) ((_) & (-_))
void Update1(int a, int b)
{
for (int i = a; i <= MaxN; i += lowbit(i))
{
Max1[i] = max(b, Max1[i]);
}
}
void Update2(int a, int b)
{
for (int i = a; i > 0; i -= lowbit(i))
{
Max2[i] = max(b, Max2[i]);
}
}
int MAX1(int x)
{
int ans = 0;
for (int i = x; i > 0; i -= lowbit(i))
{
ans = max(ans, Max1[i]);
}
return ans;
}
int MAX2(int x)
{
int ans = 0;
for (int i = x; i <= MaxN; i += lowbit(i))
{
ans = max(ans, Max2[i]);
}
return ans;
}
int a[500005], op[500005];
int f[500005][4], n, k;
void add(int len, int a)
{
int W = (len - 1) % k + 1;
switch (op[W])
{
case 1:
Update1(a, len);
break;
case 2:
Update2(a, len);
break;
case 3:
Max3[a] = max(len, Max3[a]);
break;
default:
printf("ERROR\n");
exit(0);
break;
}
}
int main()
{
//freopen("mot.in", "r", stdin);
//freopen("mot.out", "w", stdout);
scanf("%d%d", &n, &k);
for (int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
}
char c;
for (int i = 1; i <= k; i++)
{
c = getchar();
while (c != '<' && c != '>' && c != '=')
c = getchar();
switch (c)
{
case '<':
op[i] = 1;
break;
case '>':
op[i] = 2;
break;
case '=':
op[i] = 3;
}
}
int ans = 0;
//f[1][1] = f[1][2] = f[1][3] = 1;
for (int i = 1; i <= n; i++)
{
f[i][1] = MAX1(a[i] - 1) + 1;
f[i][2] = MAX2(a[i] + 1) + 1;
f[i][3] = Max3[a[i]] + 1;
for (int j = 1; j <= 3; j++)
{
add(f[i][j], a[i]);
ans = max(ans, f[i][j]);
}
}
//for(int i=1;i<=n;i++)
// printf("%d %d %d\n",f[i][1],f[i][2],f[i][3]);
// while(1);
printf("%d", ans);
}
BZOJ 2090 [Poi2010] Monotonicity 2
https://www.nekomio.com/posts/43/