题意:让你求两个字符串的LCS,n,m<=300000,a[i]<=10^9.
本来我是直接按照普通的nlogn lcs直接打,没想到RE 0了,看了一下数据才知道爆掉了。。a[i]<=10^9,打了个离散化才过。。而且普通的nlognlis会WA,不明觉厉。。
讲解nlognlcs:
。。因为是lcs所以最终的答案串中的每一位一定会在A和B串中出现,所以可以把A中的串投影到B串中,对于B串中不为0的位置做lis就可以了。。
怎么投影呢?假设有i,j使得A[i]=B[j],那么最终需要做lis的数组为C,C[A[i]]=j;
标程(交了18次才A我真是菜哭了。。发现网上的nloglis一但数据大了以后就会WA。。坑我。):
#include <cstdio>
#include <algorithm>
#define maxn 300005
using namespace std;
int n,m,a[maxn],i,j,l,r,mid,ans,f[maxn];
struct pn
{
int v,p;
};
pn b[maxn];
bool cmp(pn x,pn y)
{
return x.v<y.v;
}
int find(int v)
{
l=1;
r=m;
while (l<r)
{
mid=(l+r)>>1;
if (b[mid].v>=v)
r=mid;
else
l=mid+1;
}
if (b[l].v!=v)
return -1;
return b[l].p;
}
int main()
{
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++)
scanf("%d",&a[i]);
for (i=1;i&