1 条题解

  • 0
    @ 2026-4-20 8:33:28

    一、题意回顾(精简版)

    给定一棵 nn 个节点的。 对所有有序对 (p,q)(p,q)pqp\neq q,两人进行博弈:

    • Nora 先手,只能从 pp 向外扩展毛虫;
    • Aron 后手,只能从 qq 向外扩展毛虫;
    • pp 是叶子,Nora 胜
    • qq 是叶子,Aron 胜
    • 初始两者都是叶子,或 1010010^{100} 轮未分胜负,则平局

    求:使得 Aron 必胜的有序对 (p,q)(p,q) 数量


    二、结论性转化(本题核心)

    通过博弈分析与树上结构观察,可以得出:

    Aron 获胜的充要条件

    满足下列两类之一:

    1. 初始直接获胜 qq 是叶子,且 pp 不是叶子。

    2. 博弈后获胜 满足:

      • pp 不是叶子;
      • qq 不是叶子;
      • qq全内部点(所有邻居都不是叶子);
      • pp非全内部点(至少有一个邻居是叶子)。

    三、定义与符号

    为方便表述,统一符号:

    • deg(u)\deg(u):节点 uu 的度数

    • 叶子deg(u)=1\deg(u)=1,记叶子集合为 LL 数量:c1=Lc_1=|L|

    • 内部点deg(u)2\deg(u)\ge 2

    对内部点 uu,定义:

    • d(u)d(u)uu 的邻居中也是内部点的数量

    • 全内部点(记为集合 SS): 满足 d(u)=deg(u)d(u)=\deg(u),即所有邻居都是内部点 数量:c2=Sc_2=|S|

    • 非全内部点(记为集合 TT): 内部点但 d(u)<deg(u)d(u)<\deg(u),即至少一个邻居是叶子


    四、答案公式

    最终答案由两部分相加:

    [ \mathrm{ans}=c_1\cdot(n-c_1);+;c_2\cdot\sum_{m\in T}\big(d(m)-1\big) ]

    逐项解释:

    1. 第一部分 [ c_1 \cdot (n - c_1) ]
    • c1c_1:叶子 qq 的数量
    • nc1n-c_1:非叶子 pp 的数量
    • 含义:所有满足 qq 是叶子,pp 不是叶子 的有序对,Aron 直接获胜。
    1. 第二部分 [ c_2 \cdot \sum_{m\in T}\big(d(m)-1\big) ]
    • c2c_2:全内部点 qq 的数量
    • 对每个非全内部点 mm(作为 pp),贡献为 d(m)1d(m)-1
    • 含义:博弈后 Aron 能必胜的有序对数量。

    五、标程逐段解释

    1. 基础预处理

    int n; cin >> n;
    for (int i=1;i<n;++i) {
        int u,v; cin>>u>>v;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    

    读入树,建邻接表。


    2. 统计叶子数量 c1c_1

    int c1=0;
    for(int i=1;i<=n;++i)
        c1 += (deg(i)==1);
    
    • deg(i)=1\deg(i)=1 是叶子
    • c1=Lc_1=|L|

    然后计算第一部分答案:

    ans += 1LL * c1 * (n - c1);
    

    3. 统计 d(u)d(u) 与全内部点数量 c2c_2

    for(int i=1;i<=n;++i)
    if(deg(i)>1){
        for(int v:g[i])
            d[i] += (deg(v)>1);
        c2 += (d[i]==deg(i));
    }
    
    • 只对内部点计算
    • d[i]d[i]:邻居中内部点个数
    • d[i]=deg(i)d[i]=\deg(i),则 iSi\in Sc2c_2 加一

    4. 计算第二部分答案

    for(int m=1;m<=n;++m)
    if(deg(m)>1 && d[m]!=deg(m))
        ans += 1LL * c2 * (d[m]-1);
    
    • 遍历所有非全内部点 mm
    • 每个贡献 d[m]1d[m]-1
    • 乘上全内部点数量 c2c_2

    六、复杂度分析

    • 建树:O(n)O(n)
    • 遍历统计度数、d(u)d(u)O(n)O(n)
    • 每组测试用例总复杂度:O(n)O(n)

    满足约束:

    • t2104t\le 2\cdot 10^4
    • n4105\sum n \le 4\cdot 10^5

    七、样例验证(第二个样例)

    输入:

    5
    1 2
    1 3
    2 4
    2 5
    

    节点度数:

    • deg(1)=2, deg(2)=3\deg(1)=2,\ \deg(2)=3
    • deg(3)=deg(4)=deg(5)=1\deg(3)=\deg(4)=\deg(5)=1

    因此:

    • 叶子:3,4,5c1=33,4,5\Rightarrow c_1=3
    • 非叶子:1,2nc1=21,2\Rightarrow n-c_1=2
    • 第一部分:3×2=63\times 2=6

    内部点:1,21,2

    • d(1)d(1):邻居只有 22(内部点)d(1)=2=deg(1)\Rightarrow d(1)=2=\deg(1)\Rightarrow 全内部点
    • d(2)d(2):邻居 11(内部)、44(叶)、55(叶)d(2)=1<3\Rightarrow d(2)=1<3
    • c2=1c_2=1

    非全内部点只有 22,贡献 d(2)1=0d(2)-1=0 第二部分:1×0=01\times 0=0

    总答案:6+0=66+0=6 与样例输出一致。


    八、总结

    本题表面是复杂树上博弈,实际结论非常简洁:

    [ \boxed{\mathrm{ans}=c_1(n-c_1);+;c_2\sum_{m\in T}\big(d(m)-1\big)} ]

    标程正是严格按照该公式线性计算,时间效率最优、代码极简洁。

    • 1

    信息

    ID
    6610
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者