不要因为别人的过错惩罚自己
总结一下这几天做的题。
啦啦啦啦啦啦啦啦啦啦啦~(A5)
啦啦~ 啦啦~~~~~~~~~(Eb6)~(F6)
下面好像都只有 1900。
AT_abc267_f
让我们对于每个点找到其距离最远的点,这样就可以回答所有疑问。
暴力找肯定不行,我们猜测每个点的目标点去重后不会很多。
直径的性质:每个点在树上距离最远的点事直径的两个端点之一。
于是我们直接对于直径的端点为根 dfs 即可,把询问挂在树上,每次只需回答 \(k\) 级祖先即可。
不需要倍增,由于 dfn,我们直接记录当前 \(w_i\) 表示 \(dep_x=i\) 的 \(x\) 即可。
AT_abc344_f
当时没场切。可能没有看题。
金币太大,无法进入状态。我们考虑贪心:每次只买金币使得恰好能走到这里。
考虑延迟计算,即我们可以将在 \((i,j)\) 买金币变成:
- 对于所有要经过 \((i, j)\) 的路径 \((1,1)\to (x,y)\),可以在 \((i,j)\to (x,y)\) 的任何点上买 \(c_{i,j}\) 的金币。
所以我们只需要把当前路径上最大的 \(c_{i,j}\) 坐标记入状态即可。
注意此处我们的 dp 要记录 2 个东西,一个是时间,一个是当前金币。(很多时候是不能记录 2 个的,但是此题时间严格优,金币只是辅助状态)
时间复杂度 4 次方。有一个类似的题,记录最大的 \(w\) 即可,然后转移套上 dijkstra。讨论区里面应该有链接。
AT_agc005_c
独立做出来的,主要是 T1 的直径太深刻了。
从叶子构造不太好做。
考虑极值,看看最大的 \(a_i\)?如何构造?
想到先把直径拉出来(一条链)。然后把所有链上的 \(a_i\) 减去,构造剩下的 \(a_i\)。
然后做完了。半个小时吧。
AT_arc058_b
人机题。
容斥没什么思路,主要是不知道容斥钦定什么。
考虑划分路径,直接在第 \(b\) 列枚举是从哪一行过来的就行了。把两边直接合并即可。
方案数是经典的组合数。
今天上午什么都没做。太困了。
AT_agc049_c
很一眼的东西就是你先把所有 \(b_i<a_i\) 的区间全部消掉,然后把剩下消不掉的点进行操作。
两种策略:
-
召唤一个 \(x+1\) 的人机把你噶了。
-
把自己的 \(b_i\) 减少。使之刚好覆盖 \([1,a_i]\)。
容易发现 2 操作修改的是一段前缀。1 操作是单点,就做完了。
P5361
看到第二问无向图最大独立集 NP 完全问题害怕了 qwq。
直接 SA!
考虑构造一个不是最大的独立集:每次把度数最小的点删掉,直到所有点独立。
再看第一问。答案不一定有单调性哦。但是几个状态之间的差别一定是连续的,所以还是依次删掉度数小的点。找最大的答案。
P4006
本来只有 40 分的,乱搞过了,好像还被 zyr hack 了?
他自己也没了。。。
dp 和贪心 dfs 很显然。考虑确定根。
对于 \(in_x=1\) 的 \(x\) 我们直接取最小的作为根并且把其出度点设为右儿子即可。
否则是 \(in_x=2\),我们肯定希望这个最小的 \(x\) 是第一个点。
记相邻点为 \(l,r\),其构成子树为 \(A,B\)。
先以 \(x\) 为根算出 \(A,B\) 里面的最小的第一个值,取这个值大的一边作为根节点的选择范围。
然后随机选点。但是我们可以先把 \(l/r\) 这种点选上先跑一遍。
这算法能过所有数据我还是很震惊的,毕竟随机选点都没写就过了。