
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
挖坑待填