ABC474 A-F

试试 dsh 的 studymate 插件给我安排的 vp 任务

A

入门题,不解释

提交文件的时候忘记保存了,结果交了份空的代码上去,喜提罚时 +5

int main() {
    int x = read();
    for (int i = 1; i <= 3; ++i) {
        if (i != x) {
            print(i);
            return 0;
        }
    }    
    
    return 0;
}

B

题意:给定一个长度为 n 序列,每隔十位做一个分组,第 i 组内的数必须完整覆盖 [(i - 1) * 10 + 1, min(i * 10, n)] 内的所有数,如果不满足,输出 No;否则输出 Yes。

直接模拟即可。有个小技巧:把 n 补齐成 10 的倍数,然后扫描第 i 组组内的数的时候直接判断是否在 [(i - 1) * 10 + 1, i * 10] 的范围内即可。

constexpr int N = 107;

int n, a[N];

int main() {
    read(n);
    for (int i = 1; i <= n; ++i) read(a[i]);

    if (n % 10) {
        while (n % 10) a[++n] = n;
    }

    for (int i = 1; i <= n / 10; ++i) {
        int l = (i - 1) * 10, r = i * 10;
        for (int j = (i - 1) * 10 + 1; j <= i * 10; ++j) {
            if (a[j] < l || a[j] > r) {
                puts("No");
                return 0;
            }
        }
    }

    puts("Yes");
    
    return 0;
}

C

题意:给定一个长度为 n 的排列和 q 次询问,每次询问把排列中值为 a[i] 的数移动到末尾。

用一个数组 b 记录值为 val 的数的下标。每次询问的时候,用一个 cnt 变量,cnt 每次增加 1,然后把 b[val] 赋值为 cnt。最后对序列进行排序即可,每次比较权值的大小为 b 中的值。实现上可以传入一个 lambda 函数作为 cmp 的参数。

constexpr int N = 2e5 + 7;

int n, q, a[N], b[N], id[N], idd[N];

int main() {
    read(n, q);
    for (int i = 1; i <= n; ++i) read(a[i]), id[a[i]] = i;
    int pos = n;
    for (int i = 1; i <= q; ++i) {
        read(b[i]);
        id[b[i]] = ++pos;
    }

    for (int i = 1; i <= n; ++i) idd[i] = i;
    sort(idd + 1, idd + n + 1, [&](int x, int y) {
        return id[x] < id[y];
    });

    for (int i = 1; i <= n; ++i) print(idd[i]), putc(' ');
    
    return 0;
}

D

给定两个长度均为 n 的序列 a 和 b,要求构造一个序列 w,其中 $1 \le w_i \le 10^{18}$,使得 $\sum_{i = 1}^{n} w_i(a_i - b_i) \geq 0$。 构造题,思路就是尽量让 $a_i - b_i$ 为负的时候的系数小,非负的时候的系数大。那么简单一点,直接令前者权值为 $1$,后者为 $10^{18}$ 即可。

\sum_{i = 1}^{n} w_i(a_i - b_i) \geq 0

E

我会补的!

F

挖坑待填

This article was updated on