1 条题解

  • 0
    @ 2025-8-24 22:52:00

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Yxa_Sheep
    打表过样例,暴力出奇迹,搜索真牛逼,骗分进省一||深搜 MLE,广搜 TLE,打表 RE,退火又 CE||删掉 display 看主页||被封取关(解封后私信)||六年级蒟蒻 ,代词请用“他”||当前状态:<离线>

    搬运于2025-08-24 22:52:00,当前版本为作者最后更新于2025-06-11 21:04:20,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    upd on 2025/6/15:修改了代码。

    题意

    aa 数组里挑出 bb 数组。对于第 ii 项,如果可以被选中就输出 1,否则输出0

    思路

    一开始想用深搜,当看到 n,m,k3×105n,m,k\le3\times10^5 这里就立刻放弃了。从后往前遍历,找到 bib_iaa 序列中最后出现的地方,存入数组 lstlst。再从前往后遍历,用 fstfst 数组存储这个数是从左往右满足的第几个数,如果第 ii 个数已经满足条件并且在最后一次出现之前,就输出 1,否则输出 0

    代码(就不放注释了)

    #include <bits/stdc++.h>
    using namespace std;
    int n, m, k, tot, a[300010], b[300010], lst[300010], fst[300010];
    int main()
    {
        scanf("%d%d%d", &n, &m, &k);
        for (int i = 1; i <= n; i++)
            scanf("%d", &a[i]);
        for (int i = 1; i <= m; i++)
            scanf("%d", &b[i]);
        for (int i = n, j = m; i >= 1; i--)
            if (a[i] == b[j])
                lst[j--] = i;
    	for (int i = 1, j = 1; i <= n; i++)
    	{
    		if (a[i] == b[j])
    			fst[a[i]] = j++;
    		printf("%d ", fst[a[i]] && i <= lst[fst[a[i]]]);
    	}
        return 0;
    }
    

    完结!!!求过。

    • 1

    信息

    ID
    9299
    时间
    1000~10000ms
    内存
    128MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者