pku3670 Eating Together

时间:2023-03-09 06:44:37
pku3670 Eating Together

http://poj.org/problem?id=3670

DP,最长不降子序列,O(n*logn)解法

 #include <stdio.h>
#define N 30030 int n, a[N], dp[N];
const int maxint = (<<)-; int bs(int l ,int r, int x)
{
int m;
while(l < r)
{
m = (l + r)>>;
if(dp[m] <= x)
{
l = m + ;
}
else
{
r = m;
}
}
return l;
} int LIS()
{
int i, j, maxn = ;
dp[] = ;
dp[] = maxint;
for(i=; i<=n; i++)
{
j = bs(, maxn+, a[i]);
dp[j] = a[i];
if(j > maxn)
{
maxn ++;
dp[maxn+] = maxint;
}
}
return maxn;
} int main()
{
int t, i, j;
int r1, r2;
while(~scanf("%d", &n))
{
for(i=; i<=n && scanf("%d", a+i); i++);
r1 = LIS();
for(i=; i<=n/; i++)
{
j = n-i+;
//printf("%d %d\n", i, j);
a[i] ^= a[j], a[j] ^= a[i], a[i] ^= a[j];
}
r2 = LIS();
printf("%d\n", n - (r1>r2? r1: r2));
}
return ;
}