2022.1.20 总结
2022.1.20 总结
赛时
在今天做比赛的时候,我首先思考了第一题。我很快想到了一个 dp 的做法,但是在最后我意识到了自己的做法在转移顺序上会有循环,这使我放弃了自己的想法,转战其他题目(事后证明这个做法确实不好)。
在这之后,我意识到 T2 应该是类似网络流的题目,由于我一直对这方面没有深入的研究,所以很快因为不知道如何处理 \(D\) 的限制而放弃。
在处理 T3 的时候,我迅速想到了一个时间复杂度为 \(O(n \sqrt{n})\) 的做法,没有多想就开始写了。但是当我写完代码之后,测试极限数据的时候它跑了 2s 左右,我把之后的大部分时间都用于卡常数了,但并没有多大成效。并且这导致我没有时间去做其他题。赛后在 OJ 上发现它跑了 8s 左右,实在是比较低效的做法。
最后一题我没有深入思考,赛时的印象大概就是一个细节比较多的 dp 题。
赛后
T1 的做法是只考虑转移边,并使用一些技巧转移,前者使得转移顺序变得正确。设 \(f_{i,0/1}\) 表示考虑第 \(i\) 条边,在左/右岸的时候最优答案,转移可以用线段树维护。
T2 考虑网络流。网络流的本质也许就是一种决策转移的图,为了尽量使图正确,我总结了一些小技巧:
- 尽量将点与点之间的限制独立开来。
- 同时可以搭配二分判可行流。
- 对点有限制可以拆点。
- 网络流的本质是线性规划。
- 点不一定要是实际的东西,点可以是辅助限制的工具。
这个题可以二分能凑出的小队数,然后每个人代表的点向每个可行职业连边,每个职业向每个小队连边,源点向每个人连边,每个小队向汇点连边。
然后你发现还有一个 \(D\) 的限制对吧。我们考虑将 \(x-y \ge d\) 和 \(x+y=k\)结合,将 \(x\) 和 \(y\) 独立化。然后新建两个点表示这个限制,插在源点和每个人中间。
太简单啦!
T3 考虑一个显然的性质:区间里面如果有点被删掉,那么最小的点一定在这些点中。
于是我们可以动态维护一个区间的线段树:支持区间查询最小值,单点删除。这样由于只有删除,总时间复杂度是 \(O(n\log n)\) 。
T4 考虑 dp, 这里稍微借用一下 LLK 的转移:
我们令 \(f(l,r)\) 表示 \([l,r]\) 中的点全部都被覆盖的最小矩形数,\(g(l,r,k)\) 表示 \([l,r]\) 中间纵坐标 \(\ge k\) 的点全部都被覆盖的最小矩形数,然后区间 DP:
对于 \(f(l,r)\) :
-
\[f(l,r)=\min\limits_{l \le mid \le r}(f(l,mid)+f(mid+1,r)) \]
-
若整个区间可以直接用一个矩形覆盖:\(f(l,r)=1\)。
-
用 \(y=k\) 分隔开,上面的用 \(g\) 算,同时下面用一整个矩形覆盖:\(f(l,r)=g(l,r,k)+1\)
对于 \(g(l,r,k)\):
-
\(g(l,r,k) = \min\limits_{k}(g(l,mid,k)+g(mid+1,r,k))\)
-
若整个\(y=k\)及以上的点可以用一个矩形覆盖:\(g(l,r,k)=1\)
-
找到\(y=k\)及以上的点中最左最右的位置,令其为\(p,q\),\(g(l,r,k)=f(p,q)\)(这可能需要一些数据结构的支持)
综上,我们可以在 \(O(n^4)\) 的时间解决这道题目!
总结、反思
今天我在比赛的时候死磕一道题,非常不应该,并且没有深入思考前两题,导致分数不高,是很不好的行为。在之后的比赛中要注意:
- 常数不优秀的时候可以考虑别的做法,不用死磕。
- 当自己的做法有问题的时候不能马上放弃,要好好反思自己的抽象方法,尝试从别的角度思考问题,或许能有别的收获。