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;
}
posted @ 2021-10-17 17:04  Handwer  阅读(29)  评论(0编辑  收藏  举报