【题解】人类智慧

2021/9/11 23:08:53

本文主要是介绍【题解】人类智慧,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

\(\texttt{计蒜客T3203 }\text{人类智慧}\)

给定一张有 \(n\) 个点 \(m\) 条边的有向图,每个点上有点权,不妨认为 \(w_i\) 表示第 \(i\) 个点上的点权。还给了一个计数器以及一个正整数 \(T\),要求在任意时刻计数器的值都不能小于 \(0\) 或者大于 \(T\)。计数器初始时值为 \(0\),之后你可以在有向图上任意选择一条 路径(即边可以重复走),当每一次到达一个点 \(i\) 的时候,都可以进行以下操作之一:

  • 不操作;
  • 为计数器加上 \(w_i\);
  • 为计数器减去 \(w_i\)。

起点是任意的,求可以让计数器达到的最大值。

(保证图中无重边、自环,\(1\le w_i\le T/2\))

先证一个引理:\(a,b\) 位于一个联通分量中,设当前计数器值为 \(0\le t\le T\),若 \(0\le t +\gcd(w_a,w_b) \le T\),则可以使计数器达到 \(t+ \gcd(w_a,w_b)\);同理,可以使计数器达到 \(t-\gcd(w_a,w_b)\)。

只证明分号前的命题即可。由 Bezout 定理知,存在 \((x,y)\) 使得 \(x\times w_a-y\times w_b=\gcd(w_a,w_b)\),其中 \(x,y\) 均为非负整数。现在构造达到这样 \((x,y)\) 的方案。设初始有 \((x_0,y_0)=(0,0)\),迭代 \(i\) 次后为 \((x_i,y_i)\)。若 \(t+x_{i-1}\times w_a-y_{i-1}\times w_b\le T/2\),则 \(x_i=x_{i-1}+1,y_i=y_{i-1}\);反之,则 \(x_i=x_{i-1},y_i=y_{i-1}+1\)。这样,始终有 \(0\le t+x_{i}\times w_a-y_{i}\le T\)。并且由于每次迭代后有一者增加 \(1\),另一者不变,必然存在一个 \(t\) 满足 \(x_t=x\land y_t\le y\) 或者 \(x_t\le x\land y_t= y\)。达到这样 \((x,y)\) 的方案即,如上所述迭代 \(t\) 次后,再一次性加 \(x-x_t\) 次 \(w_a\) 然后减 \(y-y_t\) 次 \(w_b\) 即得。引理证毕。

因此,一个联通分量可以构造且只能构造出 \(\gcd\{w_i\}\) 的倍数的改变量,将联通分量缩成点权为 \(\gcd\{w_i\}\) 的点。缩完点后,拓扑排序跑背包即可。

\(\square\)



这篇关于【题解】人类智慧的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程