結果

問題 No.3220 Forest Creation
ユーザー woshinailong
提出日時 2025-08-01 22:36:05
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 13 ms / 2,000 ms
コード長 1,986 bytes
コンパイル時間 593 ms
コンパイル使用メモリ 74,328 KB
実行使用メモリ 7,716 KB
最終ジャッジ日時 2025-08-02 00:02:00
合計ジャッジ時間 2,321 ms
ジャッジサーバーID
(参考情報)
judge1 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 46
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>
#include <numeric>
#include <vector>

// 使用一个函数来封装解题逻辑
void solve() {
    int n;
    std::cin >> n;
    std::vector<long long> a(n + 1);

    // 使用 long long 防止数值溢出
    long long total_vertices = 0;
    long long sum_of_degrees = 0;
    for (int i = 0; i <= n; ++i) {
        std::cin >> a[i];
        if (a[i] > 0) {
            total_vertices += a[i];
            // 注意:i * a[i] 可能很大,需要将 i 转换为 long long
            sum_of_degrees += static_cast<long long>(i) * a[i];
        }
    }

    // 情况 1: 如果度数之和为 0,意味着所有顶点都是孤立的。
    // 这是一个有效的森林(或者是一个空图)。
    if (sum_of_degrees == 0) {
        std::cout << "Yes" << std::endl;
        return;
    }

    // 从这里开始,sum_of_degrees > 0,意味着图中至少有一条边。

    // 计算非孤立顶点(度数 > 0)的数量
    long long non_isolated_vertices = total_vertices - a[0];

    // 情况 2: 要形成一条边,至少需要两个非孤立顶点。
    // 如果非孤立顶点数小于等于1,但度数和大于0,则矛盾。
    if (non_isolated_vertices <= 1) {
        std::cout << "No" << std::endl;
        return;
    }

    // 条件 A: 任何图的度数之和必须是偶数。
    if (sum_of_degrees % 2 != 0) {
        std::cout << "No" << std::endl;
        return;
    }

    // 计算总边数
    long long edges = sum_of_degrees / 2;

    // 条件 B: 对于由 `non_isolated_vertices` 个顶点构成的森林,
    // 其边数 `edges` 不能超过 `non_isolated_vertices - 1`。
    // 如果超过,则必然存在环。
    if (edges <= non_isolated_vertices - 1) {
        std::cout << "Yes" << std::endl;
    } else {
        std::cout << "No" << std::endl;
    }
}

int main() {
    // 加速 C++ 的 I/O 操作
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(NULL);

    solve();

    return 0;
}
0