求dalao帮帮忙

P1439 【模板】最长公共子序列

paperghost_ls @ 2020-07-01 13:00:53

RT,想知道如果一个数列有重复的数应该怎么修改代码

如:

5

1 2 2 4 5

1 3 6 2 2

#include<cstdio>
#define ri register int
using namespace std;
int a[110000],p[110000];
int f[110000],len;
int check(int x)
{
    int l=1,r=len;
    while(l<r)
    {
        int mid=(l+r)>>1;
        if(p[f[mid]]>p[x])r=mid;
        else l=mid+1;
    }
    return l;
}
int main()
{
    int n;scanf("%d",&n);
    for(ri i=1;i<=n;i++)scanf("%d",&a[i]);
    for(ri i=1;i<=n;i++)
    {
        int x;scanf("%d",&x);
        p[x]=i;
    }
    for(ri i=1;i<=n;i++)
    {
        if(p[a[i]]>p[f[len]])f[++len]=a[i];
        else f[check(a[i])]=a[i];
    }
    printf("%d\n",len);
    return 0;
}

by FZzzz @ 2020-07-01 13:36:39

如果有重复只能 n^2


by UID341736 @ 2020-07-01 13:39:42

@paperghost_ls 打错了是 n\log n……有重复只能 n^2


by paperghost_ls @ 2020-07-01 13:40:17

@FZzzz 啊,没有一些做法可以达到O(nlogn)的吗?


by FZzzz @ 2020-07-01 13:41:46

@paperghost_ls 不可能


by FZzzz @ 2020-07-01 13:42:09

哦目前没有人做到,有没有下界证明去不清楚


by paperghost_ls @ 2020-07-01 13:42:19

@FZzzz 好的,谢谢dalao


上一页 |