poj 1631 Bridging signals

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
using namespace std;
int n;
int a[40010];
int d[40010];
int b[40010];
int dmax;
int main()
{
    int total;
    scanf("%d",&total);
    int i;
    while(total--)
    {
        scanf("%d",&n);
        for(i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            d[i]=1;
        }
        b[1]=a[1];
        dmax=1;
        int L,R;
        for(i=2;i<=n;i++)
        {
            //对a[i],d[i]进行处理
            L=1;
            R=dmax;
            if(a[i]>b[dmax])
            {
                dmax++;
                b[dmax]=a[i];
                d[i]=dmax;
                continue;
            }
            if(a[i]<=b[1])
            {
                d[i]=1;
                b[1]=a[i];
                continue;
            }
            while(1)
            {
                if(L+1==R&&a[i]>b[L]&&a[i]<=b[R])
                {
                    d[i]=R;
                    if(a[i]<b[R])
                    {
                        b[R]=a[i];
                    }
                    break;
                }
                int mid=(L+R)/2;
                if(b[mid]<a[i])
                {
                    L=mid;
                }
                if(b[mid]>=a[i])
                {
                    R=mid;
                }
            }
        }
        printf("%d\n",dmax);
    }
    return 0;
}
posted @ 2012-08-07 20:38  willzhang  阅读(116)  评论(0编辑  收藏  举报