好题

这里是一些对我有点启发的题。

LOJ576 签到游戏

这个问区间和求出每个数的东西看起来就很奇怪,于是我们做转化:

  • 问区间,相当于知道某些前缀和的差
  • 如果我们问区间 \((l, r)\),那么我们可以让边表示已知关系,连一条 \(l - 1 \leftrightarrow r\) 的边,边权为问区间 \((l, r)\) 的代价。
  • 最后你想知道肯定是要 \(0\) 到 \(n\) 全连通对吧,那就是求这个图的最小生成树

注意,这是一个通用的模型,不仅是前缀和,任何每次询问得到 \(\bigoplus_{i=l}^{r}a_i\),问保证知道所有 \(a\) 的最小代价,都可以使用这个模型 \(\mathcal O(n^2)\) 算。(前提:\(\bigoplus\) 有逆运算。)

然后你考虑这个题的代价是 \(\gcd\),它向两边递减,所以这棵树的构造应该形如 \((1, i), (j, n), (1, n)\),而且应该是靠左的一些点选 \(n\) 连,而靠右的一些点选 \(1\) 连,分界点 \(i\) 即最右的 \(i\) 满足 \(\gcd_{1}^{i} \geq \gcd_{i+1}^{n}\)。

考虑多组询问带修,我们就用线段树维护 \(\gcd\),每次单点修改,然后线段树上二分出 \(i\) 即可。

BZOJ1001 狼抓兔子

首先有个很 naive 的 Dinic,但是点数有 \(10^6\),根本跑不过。

观察这个流量网络,可以发现它是平面图,所以我们直接平面图转对偶图然后最短路。

这个平面图转对偶图的 trick 完全没见过所以放上来了。

上一篇:D13:GCD Arrays(最大公约数数列,附题解)


下一篇:青蛙的约会