专栏文章

题解:CF2109D D/D/D

CF2109D题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mioxieql
此快照首次捕获于
2025/12/03 02:46
3 个月前
此快照最后确认于
2025/12/03 02:46
3 个月前
查看原文
BFS 板子题。
考虑维护从 1 到每一点的奇偶路径长度。记集合元素和为 SS,集合中最小奇数为 xx,若 2S2\mid S,只需
distevenS,distoddSx.\mathrm{dist}_{\mathrm{even}}\leq S,\quad \mathrm{dist}_{\mathrm{odd}}\leq S-x.
反之亦然。因为要维护奇偶性,所以 dist 数组要额外开一维奇偶性。
调了半个小时结果发现是 INF 开得不够大真是服气了。
CPP
#include <bits/stdc++.h>

using namespace std;

#define ll long long

const ll INF = 1e12;
const ll MAXN = 4e5 + 5;

ll t;
queue<tuple<ll, ll, ll>> q;  // num step par
ll dist[MAXN][2];
vector<ll> e[MAXN];

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    cin >> t;

    while (t--) {
        while (!q.empty()) {
            q.pop();
        }

        ll n, m, l, min_odd = INF, Max1 = 0, Max2 = 0;
        cin >> n >> m >> l;
        for (register int i = 1; i <= n; i++) {
            for (register int j = 0; j <= 1; j++) {
                dist[i][j] = INF;
            }
        }

        for (register int i = 1; i <= l; i++) {
            ll temp;
            cin >> temp;
            Max1 += temp;

            if (temp % 2) min_odd = min(min_odd, temp);
        }

        Max2 = Max1 - min_odd;
        int par1 = Max1 % 2, par2 = Max2 % 2;

        for (register int i = 1; i <= m; i++) {
            ll u, v;
            cin >> u >> v;
            e[u].push_back(v);
            e[v].push_back(u);
        }

        q.push({1, 0, 0});
        dist[1][0] = 0;

        while (!q.empty()) {
            auto [num, step, par] = q.front();
            q.pop();

            for (auto &i : e[num]) {
                if (dist[i][(par + 1) % 2] > step + 1) {
                    q.push({i, step + 1, (par + 1) % 2});
                    dist[i][(par + 1) % 2] = step + 1;
                }
            }
        }

        for (register int i = 1; i <= n; i++) {
            if (dist[i][par1] <= Max1 || dist[i][par2] <= Max2)
                putchar('1');
            else
                putchar('0');
        }

        putchar('\n');

        for (register int i = 1; i <= n; i++) {
            e[i].clear();
        }
    }
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...