ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2020.09.08am

2021-09-08 21:02:55  阅读:136  来源: 互联网

标签:2020.09 08am blacktriangledown 这道题 blacktriangle 100 我们 贪心


---- 预期 实际
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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有