20210908AM

时间:2021-09-08
本文章向大家介绍20210908AM,主要包括20210908AM使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
预期 实际 delta
A 100 100 0
B 0 0 0
C 100 90 -10
D 50 90 +40
E 0 0 0
F 100 100 0
G 100 100 0
H 100 100 0
总计 550 580 +30

A 医院设置

以每个点为根算答案取最小值,其实这题可以用换根\(dp\)\(O(n)\),但是数据范围太小每个点一遍\(dfs\)也是够的

B 黑暗城堡

  • 对于一个点x,它所有合法的父亲y都满足\(d_x=d_y+w_{x,y}\)(其中\(d_x,d_y\)是预处理的最短路),最终方案数是所有点合法父亲个数之积
  • 此外,因为边权非负,有\(d_y<d_x\),则将所有点按最短路排序后,所有可能的y都会在x前处理,所以每次只需枚举x前的点

C 繁忙的都市

题干给出三个条件:

  1. 道路能将所有路口联通\(\rightarrow\)是一张连通图
  2. 道路尽量少\(\rightarrow\)是一棵树
  3. 边权最大值最小
    所以我们目前知道的是要建一棵树使三成立
    最初我看到最大值最小这个关键词想到的是二分答案,二分最大边权,用所有满足条件的边建图判断连通性
    然而我们也可以从小到大枚举边,如果两端点在同一个并查集就不建,否则合并....其实就是最小生成树的板子题

D 走廊泼水节

这题妙啊
首先可以很快想到新建\(u\rightarrow v\)的边边权为树上u,v两点之间最长边边权+1,那么接下来就是如何求两点之间最长边

  • 我最开始想\(dfs\)的时候处理,然而\(dfs\)只会保留这个点和它的父亲,更新不了其他点
  • 接下来我又想到Floyd 但是\(O(n^3)\)根本顶不住
    所以具体求两点之间的最长边是不现实的,本题其实也不需要,只需要求总数(个人认为这是这道题最重要的点)
  • 因此我们维护并查集和并查集的大小,像\(kruskal\)算法一样用最小生成树的边合并并查集算答案
  • 然后有一个结论:新加入的一条\(u\rightarrow v\)的边会给答案做出\((size_u*size_v-1)*(w+1)\)的贡献
  • 其实很好理解,两个并查集之间需要加入\(size_u*size_v-1\)条边成为一个完全图,\(\forall x\in U,\forall y\in V\)\(maxdis(x,y)=\max(maxdis_{x\rightarrow u},maxdis_{y\rightarrow v},w_{u\rightarrow v})\),因为边是按边权从小到大排序, 显然最大值就是\(w_{u\rightarrow v}\)

E 最优贸易

最开始是想用\(Tarjan\)\(v-DCC\)缩点再\(dfs\),因为忘了\(Tarjan\)抛掉没写

考试后才知道可以直接\(dfs\),维护每个点走能到n的点能到达的点的最大售出价,最后\(ans=\max(val_i-maxv_i)\)(相当于枚举每个点购入取最大)

F 奖金

拓扑排序板子题,如果a的工资高于b就从b向a建边,所有入度为0的点都设为最小工资,如果有一条边\(u\rightarrow v\),那么将\(w_v\)赋值为\(w_u+1\)即可
考试后才想到一个问题,为什么不取max而是直接赋值?
其实也很简单,拓扑排序是用队列实现的,更高的工资会更后赋值,不取max不会影响答案的正确性

G 对称二叉树

我读懂题了但没完全读懂

除开一号节点,其他节点一定要么同为字母,要么同为#,以此判断即可

H 小球

数学题找规律
每个点被碰偶数次后向左,奇数次后向右,所以如果前面有k个球碰到了i号点,这个球会走到i*2+(k&1)号点

将编号-1(上文说的也是前面有几个球)再做观察,可以得到更好写的规律:

对于第\(i\)层转到第\(i+1\)层(令1号点为第0层),小球会从\(now\)转移到\(now*2+\)(\(k>>i\))&1的位置

于是递推,\(O(d)\)搞定,也可以稍微优化到\(O(\log n)\)

原文地址:https://www.cnblogs.com/JA2012/p/15244152.html