Nordic Collegiate Programming Contest 2019 部分题解

Nordic Collegiate Programming Contest 2019 部分题解

前言,做国外的比赛感觉好像难度上比国内同时期的比赛要简单一点,但是在这种情况下出线的国内的队伍却不能轻松wf捧杯,感觉有点迷惑,可能和国内竞赛环境内卷严重有关。以后训练尽量选择一些正常的题目,避免无意义的trick和怪题,否则只能增强应试技巧,而对自身水平提升无益。

Flow Finder

题意

给定一棵有根树,树上每个点有一个点权。其中一些点的初始值已知,一些位置,现在把所有的未知点点权赋值(要求每个点都是正整数),并且满足:每个点的权值等于其每个孩子的权值只和。特别地,如果方案不唯一或者没有可行方案,输出impossible,否则输出这棵树。

分析

这题可以本质上可以被归纳为构造题。一个通用的解题思路是:先判断在什么情况下有解,然后在排除无解情况后进行构造,这样可以大大降低思维和编码的难度。

先分析何时输出impossible。首先是有多个解的情况,不难发现,如果存在一条链从树的叶子节点到根节点,他们的初始值都未知,那么可以有无限种解决,因为可以对他们同加同减。(这一步我看完题就发现了,这个主要基于对树结构的认识,如果不能凭感觉发现的话,可以画几棵树感受一下。)这说明如果存在“一根直肠通大脑,学多少忘多少”,那么一定有无穷多组解,这是一个充分条件。

“直肠”
那么在没有“直肠”的情况下,是否还有可能有无穷多组解呢?如果没有“直肠”,那么一定存在一个界面,把根节点和所有叶子节点分来,并且这个界面上所有点都已知。

“界面”
显然,在有"界面"的情况下, 界面以上的点权都变成确定的(也有可能出现冲突,事实上这构成了无解的情况,但是无论如何界面以上的任何结果不会产生多解)。只需要考虑界面下方。那么能否从这个界面去把他的孩子也都确定下来呢?不难发现,如果存在一个点为根,存在至少两个孩子可以一路未知地通向叶子节点,那么就有可能出现无穷多组解。

多个未知孩子
如上图,紫色是一个已知的界面,红色表示初始未知的节点,在这种情况下,因为两个孩子可以随意分配,所以可能出现无穷解的情况。但是有一种例外情况,当这些红色点的公共紫色父亲的值恰好等于这些红色点覆盖到的叶子节点数量和其他与这些红色节点相邻的已知值之和时,结果是唯一的。 如上图所示,如果这些红色节点的父亲是2+x(x为最下层未被标红的点的值)。这样两个红色的叶子节点的值必定是1。

“界面”

如果上面那个描述有些拗口,那么我们现在研究满足一个点的权值等于其孩子之权值和的树有何性质。因为这个性质具有传递性,如果把一个节点分解为其若干个孩子,那么可以将其孩子再进行拆分。通过不停重复该操作,发现无论如何操作,都能得到一个“界面”。

我们现在给出界面的一个更加严格的定义:

我们称在有根树 T T T 上的点集 S S S 是关于点 v v v 的一个界面,当且仅当:

  • ∀ s ∈ S \forall s\in S sS, s s s 在以 v v v 为根的子树中
  • 对任意在以 v v v 为根的子树中的叶子节点 x x x ∃ s ∈ S \exists s\in S sS x x x 在以 s s s 为根的子树中
  • ∀ x , y ∈ S \forall x,y\in S x,yS, x x x 不在以 y y y 为根的子树中

事实上,在这里,我们认为界面是之前“界面”定义下所有可行点集的一个极小值,最小性由定义中的第三条保证(因为如果一个点的在界面中,那么以它为根的子树都已经被挡住了,他的孩子一定是一个冗余项)。

我们可以发现界面的一个性质:

如果 S S

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值