清北冬令营真题泛做
前言
这段时间为了准备冬令营把清北冬令营真题都做了一下。更个博回顾一下(免得你们老说我咕咕咕)。
先写良心PKU的题再写THU的题,
主要是THU的题和PKU比起来真的毒瘤好多......
PKUWC2018
[PKUWC2018]Minimax
一个比较显然的暴力是归并排序,每次直接前后缀计算答案即可。
为啥不用线段树合并代替归并排序呢?
暴力线段树合并,合并的过程中顺便算一下即可,由于权值区间不交所以复杂度一个\(log\)。
[PKUWC2018]Slay the Spire
顺着题意模拟即可。
强化牌的数值都大于\(1\)意味着多打一张攻击牌不如的多打一张强化牌。
枚举抽中了几张强化牌,当强化牌数量小于\(K\)时,一定是用所有强化牌加上最大的几张攻击牌,
当强化牌数量大于等于\(K\)时,为前\(K-1\)大的强化牌加上最大的攻击牌。
把攻击牌与强化牌按照价值从大往小排序,先算总和最后除方案算概率,随便dp一下就行了。
[PKUWC2018]斗地主
九老师:这是我能想到的最好的模拟题了!然而现场无一人得分......我选择死亡。
[PKUWC2018]随机算法
这个题还是有点意思。
\(n\leq 20\)肯定是状压DP,很自然想到直接状压已经被\(Ban\)掉的点有哪些。
怎么转移?
把视野放大,考虑全局合法排列的生成,枚举加入最大独立集的点是哪个,
然后把这个点放到第一个空缺的位置,再把与之相邻点放到后面的任意位置(选对应个空位)。
显然转移过程中我们保证了独立集的点之间顺序,所以计数是不重不漏的。
至于要同时求最大值与方案数,两个一起DP,维护一下即可。
[PKUWC2018]猎人杀
很明显的终止态容斥问题了,枚举谁在\(1\)号猎人后面死,那么剩下的猎人就不用管了。
还有一个问题就是打到了死的猎人怎么办,
这里比较妙,我们可以认为打到了死的当作鞭尸,再打一次直到打到一个活着的猎人。
根据赌徒输光那套理论,新旧问题显然等价。
列出式子,无穷级数化简后发现容斥系数只与\(w\)之和有关,用分治\(FFT\)就可以计算。
[PKUWC2018]随机游走
使用\(min-max\)容斥转为求任意一个点被到达的期望步数。
这是经典问题,状压DP后树上高斯消元解决。
PKUSC2018
[PKUSC2018]真实排名
来搞笑的吧?讨论一下两个组合数一加就没了。(放普及组T2挺合适的)
[PKUSC2018]最大前缀和
一个比较自然的想法:把最大前缀和拆分成两段,前面是最大前缀,后面的每一个前缀都小于\(0\)。
这样算答案只需要枚举前缀是什么,
后面的部分很好求,设\(g\)如上述,状压DP每次向后插入一个元素时\(check\)一下就能转移。
关于前面部分:设\(f_T\)表示包含\(T\)集合元素,且最大极长前缀和等于全集和的方案数。
智障选手:容斥减去不合法的,发现不合法部分为\(f\)和\(g\)的卷积,暴力子集卷积。(显然过不了)。
高智商选手:把向后插入改为向前插入,那么只要保证插入前这个后缀非正,可以很方便的转移。
讲真这题真的有惊艳到我。
[PKUSC2018]主斗地
不好意思,这题咕了。
[PKUSC2018]星际穿越
首先可以注意到最多只会向后跳一次,因为跳两次再跳回去绝对没有意义。
其次,由于上述性质,从后面的点跳到前面的点后,前面的点再往后跳也绝对没有意义。
因为如果它后跳后再往前跳一大步,那么它往后跳到的那个点一定可以通过它的来源点直接到达。
然后就可以倍增了,设\(f_{i,j}\)表示\([i,n]\)中的点向左跳\(2^j\)可达的最左位置(向右跳不管)。
为了算答案同时记\(g_{i,j}\)表示从\(i\)点出发,跳到\([f_{i,j},i)\)这些位置所需要的步数和。
首先\(f\)的转移显然,\(g\)的转移:\(g_{i,j} = g_{i,j-1} + g_{f_{i,j-1},j-1} + 2^{j-1}(f_{i,j-1} - f_{i,j})\)。
算答案时,把答案转为后缀相减形式,倍增处理,
为了减少特判,先把起点\(i\)移到\(l_i\),最后再全局加上一步(第一步无论左跳还是右跳代价都为1)。
[PKUSC2018]神仙的游戏
长为\(i\)的\(Border\)存在的条件:不存在\(d\),满足\((n-i)|d\),且\(s_j \neq s_{j+d}\)。
问题变为判断\(s_j \neq s_{j+d}\)的存在性,字符集很小,枚举字符用\(FFT\)做匹配即可。
[PKUSC2018]PKUSC
预处理圆被多边形包含的最小半径。
若不包含,求交点后极角排序,对于一段弧,用转角公式求中点,然后判中点是否在多边形内。
由于数据范围很小,所以上述过程全部直接暴力就行了。卡精度警告。
THUSC2016
[THUSC2016]补退选
建一个Trie树,由于字符串很短所以每个点开个vector暴力存每个时间的最早出现即可。
查答案时做匹配到对应结点,然后直接查vector就行了。
[THUSC 2016]成绩单
设\(g_{l,r,x,y}\)表示区间\([l,r]\)最后一次消除的最大、最小值分别为\(x,y\)的最优方案。
设\(f_{l,r}\)表示把区间\([l,r]\)消完的最优方案。
那么显然\(f_{l,r} = min(f_{l,r} + g_{t+1,r,x,y} + A + B(x-y)^2)\),即枚举最后一段在哪里。
关于\(g_{l,r,x,y}\),我们关键在于记录了最后一次消除的信息(从而实现了跨多段消除)。
连续转移:\(g_{l,r,x,y} \to g_{l,r+1,max(x,w_{r+1}),min(y,w_{r+1})}\)。
跨段转移:\(g_{l,r,x,y} + f_{r + 1 , t} \to g_{l,t,x,y}\)。复杂度\(O(n^5)\)松一松就过去了。
[THUSC2016]星露谷物语
不是很会啊......会的大佬教教我呗......
THUWC2017
[THUWC2017]在美妙的数学王国中畅游
把三个函数霉霉展开,然后发现其导数都是循环的。
因为有断边删边操作,所以用\(LCT\)暴力维护一下路径系数和就行了。
[THUWC2017]随机二分图
关于只有\(t=0\)的数据,其答案总和就是一个二分图计数,暴力状压这样就有\(40\)分了。
关于\(t=1,t=2\),只能说陈老师真的神了......
考虑暴力,设\(f_{S,T}\)表示左半边匹配上集合为\(S\),右半边匹配上集合为\(T\)的期望条数。
注意到\(S\),\(T\)的\(bit.count\)时刻相同,暴力搜一下可以发现合法状态其实并不多,所以用\(map\)记搜。
在记搜的每一层,首先找到最小的未匹配点\(u\),然后进行决策。
对于\(t=0\)的边\((u,v)\),显然直接加入:\(f_{S,T} = f_{S,T} + \frac{1}{2}f_{S+u,T+v}\) 。
对于\(t=1\)、\(t=2\)的边,考率把它拆分成两条\(t=0\)的边,然后跟上面一样的做。
但这样答案肯定不对,考虑一下答案的偏转量,我们手动修正一下。
对于\(t=1\)的边,
若只有一条边在匹配中,概率为\(50\%\),正确。若都不在匹配中,无影响不管。
若两条边同时出现在匹配中,此时概率为\(25\%\)不对,所以需要额外添加\(25\%\)的概率进行修正。
对于\(t=2\)的边,
若只有一条边在匹配中,概率为\(50\%\),正确。若都不在匹配中,无影响不管。
若两条边同时出现在匹配中,此时概率为\(25\%\)非法,所以需要额外减少\(25\%\)的概率进行修正。
[THUWC2017]大葱的神力
关于点\(1\),爆搜即可。
关于点\(2\),拿点\(1\)的爆搜程序跑上个十几分钟就能跑出来。
关于点\(3\),裸背包直接做。
关于点\(4,5\),每个抽屉的容积一样,所以就是二分图最大权匹配,\(KM\)即可。
关于点\(6\),抽屉的容积差异几乎没有,所以依旧跑二分图最大权匹配就能得解。
关于点\(7\),发现只有第一根萝卜比较诡异,暴力枚举一下它放哪里,剩下的依旧\(KM\)解决。
关于点\(8,9,10\),退火随机化,至于能有多少分看脸。
THUSC2017
[THUSC2017]巧克力
看到\(K\)那么小显然枚举一下巧克力集合,
然后如果不管第二问那么问题变为了关键点生成树,用斯坦那树搞搞这样就有\(56\)分了。
关于第二问其实也是一个现套路。
二分中位数,把小于等于\(mid\)的点设为\(-1\),大于\(mid\)的点设为\(1\)。
那么我们希望在点数最少的前提下,上述权值也最小,故只需要把点数的权值设的很大就行了。
最后一个问题在于巧克力种类很多的时候怎么办。
把巧克力种类随机映射到\([1,K]\)然后多做几次上述算法,据说可以证明这样正确率高达\(99\%\)。
[THUSCH2017]杜老师
问题转化每给定一个集合,求满足异或后每一位为\(0\)的子集个数。
一种\(50\)分:按照大于\(\sqrt{MaxR}\)的质因子分组,把其他质因子暴力状压\(DP\)。
另一种\(50\)分:子集异或为\(0\)显然可以使用线性基高斯消元,最后\(2\)的自由元个数次幂即答案。
结合一下就有\(80\)分:
线性基中不保存大于\(\sqrt{MaxR}\)的质因子的基,分组后外部消一下这一位然后再插入到线性基中。
再结合一个结论:当区间大于\(6000\)时,答案即区间内出现的质因子个数。
然后就能够\(AC\)辣!是不是很棒?
[THUSCH2017]换桌
显然是个二分图最大权匹配问题,裸跑\(KM\)白送\(70\)分不谢。
考虑优化建图。
显然每张桌子的位置之间可以顺次连边,这样每个点就只用向可达桌子的对应位置连边了。
然而这还是只有\(70\)分。
现在的问题主要在于桌子与桌子之间的连边,考虑线段树优化。
对于\(m\)个位置分别开两棵线段树,分别表示向左走和向右走,每次移向子树时加上对应距离即可。
[THUSC2017]大魔法师
如果把三个元素看成向量的话(后面再加一个区间长度),
那么不难发现每种修改对应乘上一个矩阵,而矩阵又有乘法结合率,所以用线段树维护。
[THUSC2017]如果奇迹有颜色
看到环先套一个\(Polya\),问题转化为求大小为\(n\)的合法环的方案数(不考虑同构)。
考虑暴力怎么做,我们的难点在于要保证首尾合法。
可以这样:暴力压\(m^{m-1}\)种状态(最靠前的一个点可以不计),然后把转移矩阵看成临接矩阵。
这样我们只需要保证转移若干次后回到自己即可。
当\(m>5\)时,矩阵过大显然会\(TLE\)。
我们本地暴力\(DP\)(方法跟上面一样,只是暴力转移不要构矩阵)把每一个\(m\)的前\(1000\)项跑出来。
把这些数据扔到\(BM\)里去,发现竟然存在递推式!(当\(m=7\)时,递推式长度达到最大为\(410\))。
然后暴力\(Polya\),内部算方案直接用递推式,矩乘依旧无法通过此题所以需要使用\(CH\)线性递推。
[THUSC2017]宇宙广播
\(K=2\)求两个圆的公切线即可,注意因为不保证相离,且半径可能为\(0\)所以需要特判一堆东西。
根据题目定义,超平面点集到两个点\(S(s_1,s_2...s_K)\)、\(T(t_1,t_2...t_K)\)的距离相等。
不难得到:\(\sum_{i=1}^K (s_i^2-t_i^2) = \sum_{i=1}^{K}2(s_i - t_i)x_i\)。
由于\(S\)、\(T\)不定所以形式化的可以写成:\(\sum_{i=1}^K a_i x_i = d\) 。
由点到超平面的距离公式:\(dis = \frac{|\sum_{i=1}^K a_ix_i - d|}{\sqrt{\sum_{i=1}^K a_i^2}}\),不妨设\(\sum_{i=1}^K a_i^2 = 1\) 。
那么对于每个圆\(p\),有方程:\(|\sum_{i=1}^K a_i x_{p,i} - d| = r_p\)。
我们暴力枚举每个圆的绝对值情况,然后把\(a_i\)写成\(k_1d + k_2\)形式,带入\(\sum_{i=1}^K a_i^2 = 1\)就能得解。
这样我们就可以求得所需的超平面了。
而已知(百度来的)超平面的法向量就是定义中的\((a_1,a_2...a_K)\),所以自然就可以求切点了。