AtCoder Beginner Contest 220 复盘
A
一遍 AC。
int main() {
int a, b, c;
cin >> a >> b >> c;
for (int i = a; i <= b; ++i) {
if (i % c == 0) {
cout << i << endl;
return 0;
}
}
cout << -1 << endl;
return 0;
}
B
一遍 AC。
std::string a, b;
int k;
int main() {
cin >> k;
cin >> a >> b;
int aa = 0, bb = 0;
for (int i = 0; i < (int) a.size(); ++i) {
aa = aa * k + a[i] - '0';
}
for (int i = 0; i < (int) b.size(); ++i) {
bb = bb * k + b[i] - '0';
}
cout << 1ll * aa * bb << endl;
return 0;
}
C
读错题了。。把大于号看成大于等于号,然后交了一发没过
#易错警示:读错题真的要命,特别是一些细微的地方。
const int MAXN = 1e5 + 10;
int n;
lli aa[MAXN], x;
int main() {
n = read();
rep (i, 1, n) aa[i] = readll();
x = readll();
lli sum = 0;
rep (i, 1, n) sum += aa[i];
lli reptimes = x / sum; reptimes *= n;
lli last = x % sum;
int i = 1;
while (last >= 0) {
last -= aa[i];
++i;
}
printf("%lld\n", reptimes + i - 1);
return 0;
}
D. FG operation
读错题 + 1,以为是在序列末尾插入,然后想了半天不会做。
在前面插入就很好做了,相当于把一个前缀变成一个数,于是设 dp[i][j]
表示把前 i 个数字变成 j (0 <= j <= 9)
的方案数
转移用刷表法比较方便。
const int MAXN = 1e5 + 10;
const int HA = 998244353;
int n, aa[MAXN];
int dp[MAXN][10];
int main() {
n = read();
rep (i, 1, n) aa[i] = read();
dp[1][aa[1] % 10] = 1;
for (int i = 1; i <= n - 1; ++i) {
for (int j = 0; j <= 9; ++j) {
(dp[i + 1][(j * aa[i + 1]) % 10] += dp[i][j]) %= HA;
(dp[i + 1][(j + aa[i + 1]) % 10] += dp[i][j]) %= HA;
}
}
rep (i, 0, 9) printf("%d\n", dp[n][i]);
return 0;
}
E. Distance on Large Perfect Binary Tree
维护树上两点的各种信息时,往往选定它们的 LCA 作为中介,这是一个套路。
但可惜我推了半天式子还没推出来。
F. Distance Sum 2
考场上发现 E 不会做,于是 skip 掉了换 F,发现莫名简单,就是一个套路题。
分子树内和子树外统计即可。
const int MAXN = 2e5 + 10;
int n;
std::vector<int> G[MAXN];
lli dep[MAXN], siz[MAXN];
lli sumdep[MAXN];
void dfs(int u, int fa) {
siz[u] = 1;
forall (G[u], i) {
int v = G[u][i];
if (v == fa) continue;
dfs(v, u);
siz[u] += siz[v];
dep[v] = dep[u] + 1;
sumdep[u] += sumdep[v] + siz[v];
}
}
lli ans[MAXN];
void getans(int u, int fa, lli outersiz, lli outerdis) {
ans[u] = sumdep[u] + outerdis + outersiz;
forall (G[u], i) {
int v = G[u][i];
if (v == fa) continue;
lli n_outersiz = siz[1] - siz[v];
lli n_outerdis = outerdis + outersiz + sumdep[u] - sumdep[v] - siz[v];
getans(v, u, n_outersiz, n_outerdis);
}
}
int main() {
n = read();
rep (i, 1, n - 1) {
int u = read(); int v = read();
G[u].push_back(v); G[v].push_back(u);
} dfs(1, 0);
getans(1, 0, 0, 0);
rep (i, 1, n) cout << ans[i] << endl;
return 0;
}