您的位置:首页 > 其它

codevs-3955 最长不上升子序列

2017-05-19 10:23 387 查看

大家都很强, 可与之共勉。

给一个数组a1, a2 … an,找到最长的上升降子序列ab1

#include "cctype"
#include "cstdio"
#include "cstring"

#define max(a, b)  ((a) > (b) ? (a) : (b))

inline void readIn(unsigned int& x)  {
static char ch;
while ( !isdigit(ch = getchar()) );
for (x = -48 + ch; isdigit(ch = getchar()); (x *= 10) += ch - 48);
}

const unsigned int MaxN = 1000005;

unsigned int n, k, ans, q[MaxN], a[MaxN];

inline unsigned int Binary_Search(unsigned int* s, int val)  {
static unsigned int l, r, mid;
l = 1, r = n;
while(l ^ r)  {
mid = (l + r) >> 1;
(s[mid] < val) ? l = mid + 1 : r = mid;
}
return l;
}

int main()  {
register int i;
readIn( n );
for ( i = 0; i ^ n; readIn(a[++i]) );
memset(q, 0x3f, sizeof (unsigned int) * (n + 1));
for ( i = 1; i <= n; ++i)  {
k = Binary_Search(q, a[i]);
q[k] = a[i];
ans = max(ans, k);
}
printf("%d\n", ans);
}


#include "cctype"
#include "cstdio"
#include "cstring"

#define max(a, b)  ((a) > (b) ? (a) : (b))

inline void readIn(unsigned int& x)  {
static char ch;
while ( !isdigit(ch = getchar()) );
for (x = -48 + ch; isdigit(ch = getchar()); (x *= 10) += ch - 48);
}

const unsigned int MaxN = 1000005;

unsigned int n, len, q[MaxN], a[MaxN];

inline unsigned int Binary_Search(unsigned int* s, int len, int val)  {
static unsigned int l, r, mid;
l = 1, r = len;
while(l ^ r)  {
mid = (l + r) >> 1;
(s[mid] < val) ? l = mid + 1 : r = mid;
}
return l;
}

int main()  {
register int i;
readIn( n );
for ( i = 0; i ^ n; readIn(a[++i]) );
q[++len] = a[1];
for  ( i = 2; i <= n; ++i )
(a[i] > q[len]) ? q[++len]=a[i] : q[Binary_Search(q, len, a[i])] = a[i];
printf("%d\n", len);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: