bzoj1264: [AHOI2006]基因匹配Match

这题真的狠玄学。

想到一个O(n^2)的的做法,然而肯定是要挂的。

然后我就是mod咯。

把答案插进树状数组维护最大值。要倒着插入避免后面的继承了前面的。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;

int n,s[110000];
int lowbit(int x){return x&-x;}
void change(int x,int k)
{
    while(x<=n)
    {
        s[x]=max(s[x],k);
        x+=lowbit(x);
    }
}
int getsum(int x)
{
    int ret=0;
    while(x>=1)
    {
        ret=max(s[x],ret);
        x-=lowbit(x);
    }
    return ret;
}

//----------bit------------

int pos[21000][10],plen[21000];
int main()
{
    scanf("%d",&n);n*=5;
    memset(plen,0,sizeof(plen));
    int x;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        pos[x][++plen[x]]=i;
    }
    
    int ans=0;
    memset(s,0,sizeof(s));
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        for(int j=5;j>=1;j--)
        {
            int d=getsum(pos[x][j]-1)+1;
            ans=max(ans,d);
            change(pos[x][j],d);
        }
    }
    printf("%d
",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/AKCqhzdy/p/8405756.html