2020.09.08am
作者:互联网
---- | 预期 | 实际 |
---|---|---|
A | 100 | 100 |
B | 20 | 30 |
C | 100 | 100 |
D | 100 | 100 |
E | 50 | 0 |
F | 100 | 90 |
G | 90 | 63 |
H | 100 | 100 |
S | 660 | 583 |
可能水,一定菜
A 医院设置 \(\blacktriangle\)
- 这道题看起来就像能写 \(树形DP\)换根,时间复杂度 \(O(n)\)
- 每次换根只需要把另一颗子树和根的 \(size\) 加过去
- 但这里的数据范围太太太小了, \(O(n^3)\) 都能过,我就没有用\(DP\),直接暴力搜就行。
B 黑暗城堡 \(\blacktriangle\!\blacktriangledown\)
灰太狼的狼堡
- 虽然标签写的 \(最小生成树\),但这明显是个最短路的升级版(最短路必定构成一棵树)
C 繁忙的都市 \(\blacktriangle\!\blacktriangledown\)
我看了半天,才从字缝里挤出来两个字:最小生成树!
- 改的边尽可能少,那不就是树吗(
- 改的边分值最大的最小,那要么贪心(那不就是 \(kruskal\) 算法得实现方法嘛),要么二分(二分完全可以做,满足小于二分值的边都建上,只要图联通就说明合法)
D 泼水节 \(\blacktriangle\!\blacktriangledown\)
- 也是最小生成树
- 考察的也是 \(kruskal\) 算法的实现方法(贪心)
- 我们加的边都是选不上的
- 选不上的原因必然是这条边的两个端点已经在同一个并查集里头了
- 那么我们就可以将边权升序排列。每扫到一条边\((i,j,l)\),有计算答案:
- 即两个并查集之间 除连接的边外都建上贪心地稍大的(选不上)的边
E 最优贸易 \(\blacktriangle\!\blacktriangledown\)
- 这道题也是各种方法都能过
- 考场上没仔细看题,以为要用强连通分量之类的
然后忘记怎么写了,只好用 \(DFS\)- 然后题意整错了!!!!!挂完了!!!
- 下来按照题意调了一下就过了
- 题目中有一定的约束条件:1. 得能到 \(n\) 2. 得能到 \(1\) 3.价低处进货,价高处卖货
- 这道题数据特别水,我写了一个完全没有正确性的 \(DFS\) 还过了????!(P.S.优化后的代码也不能保证正确性,但苦于没有错误数据而难以证明)
- (P.S.这道题要等明天找老师讨论好正确性再写···)
F 奖金 \(\blacktriangle\!\blacktriangledown\)
- 长得就很像拓扑排序
- 当然,也有很多算法可以实现
G 对称二叉树 \(\blacktriangle\)
- 签到题,结果 \(WA10pts\)
H 小球\(\blacktriangle\)
- 对于这种输入只有两三个数的题,大部分要么是贪心,要么是 \(DP\) ,要么是找规律
(找规律一般比较少,因为这样就太水了,但不巧这道题就是) - 而像这类题最好的是先模拟一下:
- 根据这个图,我们可以发现,奇数次往左边弹,偶数次往右边弹
(好像题意就是这样) - 那我们容易想到位运算而将图修改成这样:
- 那通过观察我们可以发现,从根到叶子节点的所有路径,第一次\(1\) 之前的 \(0\) 都是弹向左子树,第一次 \(1\) 是弹向左侧;之后的 \(0\)都是弹向左侧,而 \(1\) 是弹向右侧(即第一个\(1\)以后交换规则)
- 根据这个图,我们可以发现,奇数次往左边弹,偶数次往右边弹
- 我们便可以直接特判第一次 \(1\) ,前后更改规则(我就是这样写的,
但是实在是太丑陋了) - 我们考虑写的更优雅一点:即把规则统一。我们可以发现第一个 \(1\) 以前的 \(0\) 等效于之后的 \(0\)。那么我们希望把第一个 \(1\) 和之前的 \(0\) 全部取反。我们再注意一下第一个 1,那么只要 \(-1\) ,我们便可以达成取反的目的,统一规则。时间复杂度\(O(D)\)。
- 这题数据太拉了。随便过。但我还是想优化一下
(有钱难买我乐意) - 先优化到\(O(\log n)\)(最坏和 \(O(D)\) 同级)
- 因为某一位只要是 \(0\) ,就乘2,是 \(1\) 就乘2加一,而最低位的\(1\)我们又非常好找(\(lowbit\)),那么对于 \(0\) 我们完全可以加速处理,而\(1\)我们就暴力乘2加1。
- 同时为了方便运算,我们可以把同类型的数(到同一个点)变成同一个数。变换方式为:\(x=(x-1)\mod(2^{D-1})+2^{D-1}\)
- 在这我又有了新的想法。既然我们都可以把到同一个点的数变成同一个数,那么我们有没有办法 \(O(1)\) 求出呢?
- 确实是难以实现 \(O(1)\)
- 我们能够发现,末位置的本行位置的二进制与到这里的小球编号按\(x=(x-1)\mod(2^{D-1})\)是对称的
- 比如,对于十一号节点,本行编号\((011)_2\),经过它的球按照上式变换为\((110)_2\)
- 也就是说我们需要将这个二进制进行翻转。
- $ {__{b}{u}{i}{l}{t}{i}{n}_bswap32()} $ 可以实现32位下的翻转,但我们对对称轴有要求,也就是说我们还得挪回来···这是阻挠算法\(O(1)\)的问题其一。其二是翻转只能暴力!优化也只有像库函数一样进行二分。这样的复杂度也是\(O(\log\log n)\),摆烂了(
\(\cal {Made} \ {by} \ {YuGe}\)
标签:2020.09,08am,blacktriangledown,这道题,blacktriangle,100,我们,贪心 来源: https://www.cnblogs.com/u2003/p/15244547.html