View Code of Problem 1037

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <map>
#define N 5100
#define M 800010
#define INF 0x7ffffff
using namespace std;
struct num
{
    int id,next;
}a[M],b[M];
int c[N],d[N],sum[N],tag[N];
int e[N],f[N],Top1,Top2;
bool ch[N],ch2[N];
map<int,int>ma;
int main()
{
    //freopen("data.txt","r",stdin);
    void addeage1(int x,int y);
    void addeage2(int x,int y);
    int dfs(int x,int pt);
    int binary_search(int l,int r,int val);
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        ma.clear();
        for(int i=n;i>=1;i--)
        {
            scanf("%d",&e[i]);
            ma[e[i]] = i;
        }
        e[n+1] = INF;
        ma[INF] = n+1;
        memset(c,-1,sizeof(c));
        Top1 = 0;
        memset(d,-1,sizeof(d));
        Top2 = 0;
        f[0] = -1;
        int Top = 0;
        addeage1(n+1,n+1);
        for(int i=1;i<=n;i++)
        {
            if(f[Top]<e[i])
            {
                f[++Top] = e[i];
                addeage1(Top,i);
            }else
            {
                int pos = binary_search(1,Top,e[i]); //第一个大于||等于
                f[pos] = e[i];
                addeage1(pos,i);
            }
        }
        int biao = 0;
        sum[biao++] = n+1;
        for(int i=Top;i>=1;i--)
        {
            int ttag = 0;
            memset(ch2,false,sizeof(ch2));
            for(int j=0;j<=biao-1;j++)
            {
                memset(ch,false,sizeof(ch));
                for(int u = c[i];u!=-1;u=a[u].next)
                {
                    int id = a[u].id;
                    if(id<sum[j]&&e[id]<e[sum[j]]&&!ch[ma[e[id]]])
                    {
                        ch[ma[e[id]]] = true;
                        addeage2(sum[j],id);
                        if(!ch2[id])
                        {
                            tag[ttag++] = id;
                            ch2[id] = true;
                        }
                    }
                }
            }
            for(int j=0;j<=ttag-1;j++)
            {
                sum[j] = tag[j];
            }
            biao = ttag;
        }
        memset(ch,false,sizeof(ch));
        memset(sum,0,sizeof(sum));
        int ans = dfs(n+1,Top);
        printf("%d %d\n",Top,ans);
    }
    return 0;
}
int binary_search(int l,int r,int val)
{
    int pos;
    while(l<=r)
    {
        int mid = (l+r)/2;
        if(f[mid]>=val)
        {
            pos = mid;
            r = mid-1;
        }else
        {
            l = mid+1;
        }
    }
    return pos;
}
void addeage1(int x,int y)
{
    a[Top1].id = y;
    a[Top1].next = c[x];
    c[x] = Top1++;
}
void addeage2(int x,int y)
{
    b[Top2].id = y;
    b[Top2].next = d[x];
    d[x] = Top2++;
}
int dfs(int x,int pt)
{
    if(pt==0)
    {
        return 1;
    }
    if(ch[x])
    {
        return sum[x];
    }
    int res = 0;
    for(int i=d[x];i!=-1;i=b[i].next)
    {
        res+=dfs(b[i].id,pt-1);
    }
    ch[x] = true;
    sum[x] = res;
    return res;
}

Double click to view unformatted code.


Back to problem 1037