2020.01.19【NOIP提高组】模拟比赛-1.水池,2.数字排序,3.球星,4.钻石交易 总结反思
水池
比赛时
我最讨厌这种数学类题了,我首先想到了这几种情况,设\(jl[][]\)表示两点之间弧的距离,从F到G可以由
- F->G
- F->B->A->G
- F->A->B->G
路径到达,那么,关键就是求弧长了,我于是自己乱写了一个式子,结果样例都没有过,一看时间已经去了很多了,于是放弃了,我觉得很多人会AC.
之后
居然没有人比赛时A了这道题,这题正解三角函数,初中的蒟蒻我还没学~~~
求弧长可以用两点之间的距离先求出圆心角,然后就可以通过圆心角求出弧长了。具体做法等我后续更新
数字排序
比赛时
第一眼看就觉得像我们昨天刚做过的题,注意到只有两行数,于是回忆起了昨天的题解中对只有两行数的解法——是二分,但是又回忆不起具体内容来,于是死命得想二分,想了很久,终于想到了一种二分套二分的解法。
我们可以二分答案,那最关键的就是如何判断当前二分到的mid合不合法,mid合法,当且仅当有小于k个数严格小于它,于是,这个问题就转化为了如何求小于mid的有多少个数,考虑到只有两行数,且\(n \leq 10000\) ,那么可以枚举i,求出\(a_i*b_j(1 \leq j \leq m)\) 有多少个严格小于mid,于是我们可以预先对b排序,然后用二分求出最后一个\(a_i*b_j < mid\)的下标,那么对于这个i,\(a_i*b_j(1 \leq j \leq m) < mid\)的就有下标个数。于是这题就解决了。
之后
我们机房的大佬XYX跟我的思路差不多,但是它没有嵌套的二分,而是用了一个前缀和表示小于mid的有多少个数,具体怎么做unknow
球星
比赛时
仔细看以为是什么主席树等数据结构,因为要求11大,可我还没学,于是果断弃疗。
之后
题解的做法时线段树+归并排序的思想,线段树采用动态开点,或者也可以用离散化;归并排序的思想就是对于两个已经有序的序列a,b,我们只需要一重循环就可以将a,b合并(所以叫归并)为有序的数列c,这样就可以轻轻松松得求出每个区间的11大。
钻石交易
比赛时
思考了一会儿,脑子一直在瞎编乱造——最小费用最大流?BFS?状压DP?
看到\(m \leq 10\) ,于是决定采用状压DP,设\(f[s][i]\),s表示宝石的状态——卖或没卖,i表示当前在第i个城市,那么,处在当前这个状态,我们可以选择1.在当前城市卖掉宝石 2.不卖宝石走到其他城市
于是就简简单单得打了几个循环
之后
拿了30分,答案错误。我没有考虑到一种情况——在当前s状态下,我们可以在剩余钱大于0时走到其他城市,这就相当与最短路径问题,而如果我们单单顺序枚举更新f,会找不到最优答案。正解:状压DP+dijk堆优化,状压DP主要处理卖宝石的情况,dijk主要处理在不卖宝石的情况下走到其它城市的情况,状压DP里面套dijk。
总结
- 对于求区间前k小的题目(k是固定的!),我们可以用线段树实现
- 对于状压DP但是顺序枚举不能保证最优解的题目,可以在状压DP内套xxx保证最优解