1 条题解

  • 0
    @ 2025-8-24 21:51:18

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar kczno1
    **

    搬运于2025-08-24 21:51:18,当前版本为作者最后更新于2017-06-07 09:52:57,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题意(我没读懂,感谢__stdcall):

    让你把两组数字做匹配,连线不相交,并且匹配的每组数字相差<=4。

    求最大匹配数。

    题解:

    从左到右枚举第一行的数,维护第二行每个位置结尾的最大匹配值的前缀max。

    就是枚举他能匹配的位置并修改,用树状数组维护。

    时间O(nlogn)

    #include<bits/stdc++.h>
    using namespace std;
    
    #define rep(i,n) for(int i=1;i<=n;++i)
    #define gc (c=getchar())
    int read()
    {
        char c;
        while(gc<'0');
        int x=c-'0';
        while(gc>='0')x=x*10+c-'0';
        return x;
    }
    
    const int N=1e5+5;
    int n,a[N],dy[N],now[N];
    
    int c[N];
    int qiu(int i)
    {
        int ans=0;
        for(;i;i-=i&-i)if(c[i]>ans)ans=c[i];
        return ans;
    }
    void add(int i,int x)
    {
        for(;i<=n;i+=i&-i)
        {
            if(c[i]>=x)return ;
            c[i]=x;
        }
    }
    
    int main()
    {
        freopen("1.in","r",stdin);
        n=read();
        rep(i,n)a[i]=read();
        rep(i,n)dy[read()]=i;
        rep(i,n)
        {
            int x=a[i];
            for(int j=max(1,x-4);j<=min(n,x+4);++j)now[j]=qiu(dy[j]-1);
            for(int j=max(1,x-4);j<=min(n,x+4);++j)add(dy[j],now[j]+1);
        }
        printf("%d\n",qiu(n));
    }
    
    • 1

    [USACO17FEB] Why Did the Cow Cross the Road II P

    信息

    ID
    1084
    时间
    1000ms
    内存
    125MiB
    难度
    6
    标签
    递交数
    0
    已通过
    0
    上传者