普及T1 质因数分解
1 |
|
普及T2 寻宝
模拟,时间复杂度$O(nm)$。
每一层记录一下有楼梯的房间数,找房间用一个循环实现。
1 |
|
普及T3 摆花
很容易看出来这是一个$DP$。
设$f(i,j)$为摆到第i种花,共有$j$盆的方案数。
那么
时间复杂度:$O(nm^2)$。
1 |
|
普及T4 文化之旅
错误方法
不正确,但却能快速通过本题的方法是$SPFA$。
1 |
|
正解
正解是搜索。考虑使用高效算法进行优化,那么先以$T$为起点跑$SPFA$,然后从起点搜索的时候,如果不考虑文化的容斥关系都有“当前点到$T$最短路长$+$当前已走距离$\ge ans$”的话就停止搜索。
用$DFS$,跑的还比较快。
upd:上述的做法是正确的,但是这题数据很恶,所以要调整搜索顺序,倒着搜。
1 |
|
提高D1T1 Vigenère密码
这个加密运算其实就是循环移位。
密文是循环进位,我们倒着做就行了。
1 |
|
提高D1T2 国王游戏
考虑第$i$和第$i+1$个人,他们手上的数字分别为,第$i+1$个人站在第$i$个人身后。
设第$i$个人前面所有人左手数字的积为$T$,那么这两个人拿到的金币数分别为
如果两人交换顺序,那么两人拿到的金币数分别为
为了让获得最多金币的人得到的金币尽量少,我们就需要根据和判断是否该让两个人交换顺序。如果交换了顺序使得取得的$max$更小,那么就需要交换。而根据归纳法,对每一对人按这种方法排一个序,就可以求出正确的答案。此时排序的时间复杂度为$O(n^2)$。
但仔细观察可以发现,。因此只需要确定了和的大小关系,就可以根据不等号的传递性判断哪一种顺序产生的最大值更小。
而对上面两个式子变形,消去$T$并且移项便可以发现:只要比较和的大小就可判断。于是可以以为关键字排序,来确定整个队伍的顺序。
此时,时间复杂度为$O(nlogn+$高精度运算需要的时间$)$。
1 |
|
提高D1T3 开车旅行
倍增。
倍增出小A小B经过$2^k$个回合的情况,然后找最近的最小值用排序+双向链表或者$BST$即可。时间复杂度:$O((n+m)logn)$。
边界的一些处理比较烦,需要注意。
1 |
|
提高D2T1 同余方程
就是让你求一个逆元。
用快速幂+欧拉函数或者扩欧都行。我只写了扩欧,但是前者应该好写一点。
时间复杂度:$O(logn)$
1 |
|
提高D2T2 借教室
方法一
维护一种数据结构,它支持:
1.区间减法
2.检查最小值的正负性
线段树即可。这种方法常数很大。
时间复杂度:$O((n+m)logn)$。
1 |
|
方法二
我们发现随着订单的增多,可用教室的数量是只减不增的,所以我们尝试二分。
二分一个最大订单量,然后区间减法用差分实现,最后扫一遍,看看是否存在负值即可。
(差分:
假设我们有一个数列: 定义它的差分数列是 这样可以发现差分数列中前$n$个元素的和就是原来数列当前位置元素的值。
然后为什么说他可以用来做区间减法呢?比方有$5$个数,$a_1,a_2,a_3,a_4,a_5$,差分数列就是$a_1,a_2-a_1,a_3-a_2,a_4-a_3,a_5-a_4$,然后第$2$到$4$个每一个减掉$p$,那么原数列就是
新的差分数列就是
可以发现,本来要修改多个元素,在差分数列里就只要修改$2$个元素。由于我们只要在处理完所有区间操作后再扫一遍查询负数,所以这么做能满足我们的需求。
时间复杂度:$O((n+m)logn)$。
1 |
|
提高D2T3 疫情控制
容易发现时间越多,控制疫情的任务越有可能完成。所以先二分一个答案$x$,然后判断它可不可行。
显然,一个军队走的越高,他能控制的就越多,所以让军队尽量向上走,直到走到根或者时间不够为止。如果可以走到根就记录一下走到根的时候剩余的时间,走不到就给最后到的点打一个标记,这个向上走可以用倍增实现。
还可以发现的是,与根直接相连的点很重要,我们称呼他们为关键点,只要全部控制了他们就完成了任务。而判断一个关键点是否被控制可以用一遍$DFS$实现。对于没被控制的关键点,我们把他们到根的路径长记录下来。
我们要让可以到根的军队发配到相应的关键点,并且使得这个分配尽可能合理。怎么做呢?考虑贪心,让剩余时间少的军队去占领最近的关键点,时间多的去占领远的。所以给军队剩余时间和关键点的距离分别排序,做一个贪心即可。
注意,如果当前扫到的军队无法前往最近的关键点,那就让他回到他之前到根的路上经过的关键点。这样可以最大程度的利用军队。
综上,我们在$O(nlogn+mlognlogw)$的时间复杂度内完成了本题。
1 |
|
v1.5.2