• 洛谷 P3657 [USACO17FEB]Why Did the Cow Cross the Road II P


    题面

    大意:让你把两个n的排列做匹配,连线不想交,而且匹配的数字的差<=4,求最大匹配数

    sol:(参考了kczno1的题解)对于第一个排列从左往右枚举,用树状数组维护到达另一个序列第i个数字的最大值。

    #include <cstdio>
    #include <algorithm>
    using namespace std;
    const int N=100005;
    int n,a[N],b[N],f[N],t[N];
    #define lowbit(x) ((x)&(-x))
    inline void ins(int x,int v){for(;x<=n;x+=lowbit(x)){if(t[x]>v)break;t[x]=v;}}
    inline int que(int x){int re=0; for(;x;x-=lowbit(x))re=max(re,t[x]);return re;}
    int main()
    {
        int i,j,x; scanf("%d",&n);for(i=1;i<=n;i++)scanf("%d",&a[i]);for(i=1;i<=n;i++)scanf("%d",&x),b[x]=i;
        for(i=1;i<=n;i++)
        {
            for(j=max(1,a[i]-4);j<=min(n,a[i]+4);j++)f[j]=que(b[j]-1);
            for(j=max(1,a[i]-4);j<=min(n,a[i]+4);j++)ins(b[j],f[j]+1);
        }printf("%d
    ",que(n));
    }
    View Code

    --------------------分割线-下方无关----------------

    大概是受了大佬的启发,我水掉了一个留了半年多的大坑(最长公共子序列的模板)直接贴链接和代码吧

    题面

    #include <cstdio>
    #include <algorithm>
    using namespace std;
    const int N=100005;
    int n,a[N],b[N],f[N],t[N];
    #define lowbit(x) ((x)&(-x))
    inline void ins(int x,int v){for(;x<=n;x+=lowbit(x)){if(t[x]>v)break;t[x]=v;}}
    inline int que(int x){int re=0; for(;x;x-=lowbit(x))re=max(re,t[x]);return re;}
    int main()
    {
        int i,x; scanf("%d",&n); for(i=1;i<=n;i++)scanf("%d",&a[i]); for(i=1;i<=n;i++)scanf("%d",&x),b[x]=i;
        for(i=1;i<=n;i++)
        {
            f[a[i]]=que(b[a[i]]-1); ins(b[a[i]],f[a[i]]+1);
        }printf("%d
    ",que(n));
    }
    View Code
  • 相关阅读:
    D
    NOI 1.7编程基础之字符串(35题)
    HYSBZ 2145 悄悄话
    POJ 2406 Power Strings
    POJ 3461 Oulipo[附KMP算法详细流程讲解]
    POJ 3974 Palindrome
    POJ 1002 487-3279
    POJ 1182 食物链
    POJ 2524 Ubiquitous Religions
    HDU 1251 统计难题
  • 原文地址:https://www.cnblogs.com/gaojunonly1/p/9784075.html
Copyright © 2020-2023  润新知