1 条题解

  • 0
    @ 2026-9-23 22:08:22

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

    题意

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

    思路

    一开始想用深搜,当看到 n,m,k≤3×105n,m,k\le3\times10^5 这里就立刻放弃了。从后往前遍历,找到 bib_i 在 aa 序列中最后出现的地方,存入数组 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
    7135
    时间
    10000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者