其他分享
首页 > 其他分享> > 2020.09.08am

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\)

  1. 这道题看起来就像能写 \(树形DP\)换根,时间复杂度 \(O(n)\)
  2. 每次换根只需要把另一颗子树和根的 \(size\) 加过去
  3. 但这里的数据范围太太太小了, \(O(n^3)\) 都能过,我就没有用\(DP\),直接暴力搜就行。

B 黑暗城堡 \(\blacktriangle\!\blacktriangledown\)

灰太狼的狼堡

  1. 虽然标签写的 \(最小生成树\),但这明显是个最短路的升级版(最短路必定构成一棵树)

\[ans=\prod_{i=1}^N ways_i,ways_i表示1到i的最短路条数 \]

C 繁忙的都市 \(\blacktriangle\!\blacktriangledown\)

我看了半天,才从字缝里挤出来两个字:最小生成树!

  1. 改的边尽可能少,那不就是树吗(
  2. 改的边分值最大的最小,那要么贪心(那不就是 \(kruskal\) 算法得实现方法嘛),要么二分(二分完全可以做,满足小于二分值的边都建上,只要图联通就说明合法)

D 泼水节 \(\blacktriangle\!\blacktriangledown\)

  1. 也是最小生成树
  2. 考察的也是 \(kruskal\) 算法的实现方法(贪心)
  3. 我们加的边都是选不上的
  4. 选不上的原因必然是这条边的两个端点已经在同一个并查集里头了
  5. 那么我们就可以将边权升序排列。每扫到一条边\((i,j,l)\),有计算答案:

\[ans+=(size[fa[i]]*size[fa[j]]-1)*(l+1) \]

  1. 即两个并查集之间 除连接的边外都建上贪心地稍大的(选不上)的边

E 最优贸易 \(\blacktriangle\!\blacktriangledown\)

  1. 这道题也是各种方法都能过
  2. 考场上没仔细看题,以为要用强连通分量之类的
  3. 然后忘记怎么写了,只好用 \(DFS\)
  4. 然后题意整错了!!!!!挂完了!!!
  5. 下来按照题意调了一下就过了
  6. 题目中有一定的约束条件:1. 得能到 \(n\) 2. 得能到 \(1\) 3.价低处进货,价高处卖货
  7. 这道题数据特别水,我写了一个完全没有正确性的 \(DFS\) 还过了????!(P.S.优化后的代码也不能保证正确性,但苦于没有错误数据而难以证明)
  8. (P.S.这道题要等明天找老师讨论好正确性再写···)

F 奖金 \(\blacktriangle\!\blacktriangledown\)

  1. 长得就很像拓扑排序
  2. 当然,也有很多算法可以实现

G 对称二叉树 \(\blacktriangle\)

  1. 签到题,结果 \(WA10pts\)

H 小球\(\blacktriangle\)

  1. 对于这种输入只有两三个数的题,大部分要么是贪心,要么是 \(DP\) ,要么是找规律(找规律一般比较少,因为这样就太水了,但不巧这道题就是)
  2. 而像这类题最好的是先模拟一下:
    • image
    • 根据这个图,我们可以发现,奇数次往左边弹,偶数次往右边弹(好像题意就是这样)
    • 那我们容易想到位运算而将图修改成这样:
    • image
    • 那通过观察我们可以发现,从根到叶子节点的所有路径,第一次\(1\) 之前的 \(0\) 都是弹向左子树,第一次 \(1\) 是弹向左侧;之后的 \(0\)都是弹向左侧,而 \(1\) 是弹向右侧(即第一个\(1\)以后交换规则)
  3. 我们便可以直接特判第一次 \(1\) ,前后更改规则(我就是这样写的,但是实在是太丑陋了)
  4. 我们考虑写的更优雅一点:即把规则统一。我们可以发现第一个 \(1\) 以前的 \(0\) 等效于之后的 \(0\)。那么我们希望把第一个 \(1\) 和之前的 \(0\) 全部取反。我们再注意一下第一个 1,那么只要 \(-1\) ,我们便可以达成取反的目的,统一规则。时间复杂度\(O(D)\)。
  5. 这题数据太拉了。随便过。但我还是想优化一下(有钱难买我乐意)
  6. 先优化到\(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}\)
  7. 在这我又有了新的想法。既然我们都可以把到同一个点的数变成同一个数,那么我们有没有办法 \(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)\),摆烂了(
      image
      \(\cal {Made} \ {by} \ {YuGe}\)

标签:2020.09,08am,blacktriangledown,这道题,blacktriangle,100,我们,贪心
来源: https://www.cnblogs.com/u2003/p/15244547.html