# 清北冬令营真题泛做

Posted guessycb

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了# 清北冬令营真题泛做相关的知识,希望对你有一定的参考价值。

清北冬令营真题泛做

前言

这段时间为了准备冬令营把清北冬令营真题都做了一下。更个博回顾一下(免得你们老说我咕咕咕)。
先写良心PKU的题再写THU的题,
主要是THU的题和PKU比起来真的毒瘤好多......

PKUWC2018

[PKUWC2018]Minimax

一个比较显然的暴力是归并排序,每次直接前后缀计算答案即可。
为啥不用线段树合并代替归并排序呢?
暴力线段树合并,合并的过程中顺便算一下即可,由于权值区间不交所以复杂度一个(log)

[PKUWC2018]Slay the Spire

顺着题意模拟即可。
强化牌的数值都大于(1)意味着多打一张攻击牌不如的多打一张强化牌。
枚举抽中了几张强化牌,当强化牌数量小于(K)时,一定是用所有强化牌加上最大的几张攻击牌,
当强化牌数量大于等于(K)时,为前(K-1)大的强化牌加上最大的攻击牌。
把攻击牌与强化牌按照价值从大往小排序,先算总和最后除方案算概率,随便dp一下就行了。

[PKUWC2018]斗地主

九老师:这是我能想到的最好的模拟题了!然而现场无一人得分......我选择死亡。

[PKUWC2018]随机算法

这个题还是有点意思。
(nleq 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 eq s_{j+d})
问题变为判断(s_j eq 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} o g_{l,r+1,max(x,w_{r+1}),min(y,w_{r+1})})
跨段转移:(g_{l,r,x,y} + f_{r + 1 , t} o 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)),所以自然就可以求切点了。

以上是关于# 清北冬令营真题泛做的主要内容,如果未能解决你的问题,请参考以下文章

Tyvj2016清北冬令营入学测试

清北学堂2017NOIP冬令营入学测试

清北夏令营考试day1

清北学堂2017NOIP冬令营入学测试 P4744 A’s problem(a)

2017.7.21夏令营清北学堂解题报告

2017.7.15清北夏令营精英班Day1解题报告