# 清北冬令营真题泛做

清北冬令营真题泛做

前言

这段时间为了准备冬令营把清北冬令营真题都做了一下。更个博回顾一下(免得你们老说我咕咕咕)。
先写良心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)\),所以自然就可以求切点了。

原文地址:https://www.cnblogs.com/GuessYCB/p/10290405.html

时间: 2024-10-15 15:42:51

# 清北冬令营真题泛做的相关文章

历年NOIP水题泛做

快noip了就乱做一下历年的noip题目咯.. noip2014 飞扬的小鸟 其实这道题并不是很难,但是就有点难搞 听说男神错了一个小时.. 就是$f_{i,j}$表示在第$i$个位置高度为$j$的时候最小点击次数 递推的话对于上升的情况只做一次,后面几次在后面再做.. #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> using namespace st

第五届蓝桥杯C/C++本科B组(真题试做)(1~5)

菜鸡只能报个B组.于是报了第六届的本科B.就找了上届的本科B的题来做做. A: 标题:啤酒和饮料 啤酒每罐2.3元,饮料每罐1.9元.小明买了若干啤酒和饮料,一共花了82.3元. 我们还知道他买的啤酒比饮料的数量少,请你计算他买了几罐啤酒. 注意:答案是一个整数.请通过浏览器提交答案. 不要书写任何多余的内容(例如:写了饮料的数量,添加说明文字等). 对于这种,我直接暴力了. double a=2.3,b=1.9; FOR(j,0,SIZE) FOR(i,0,j) { if(abs(a*i+b*

Tyvj2016清北冬令营入学测试

P4744 A's problem(a) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试题,每三天结算一次成绩.参与享优惠 描述 这是一道有背景的题目,小A也是一个有故事的人.但可惜的是这里纸张太小,小A无法把故事详细地说给大家听.可能小A自己也讲不清楚自己的故事,因为如果讲清了,也就没有这道题目了-- 小A的问题是这个样子,它找到了n份不同的工作,第i份工作每个月有ai的工资,每份工作需要小A每天工作8小时,一周工作7天.小A想知道性价

第五届蓝桥杯C/C++本科B组(真题试做)(6~8)

终于考完--不过挂科的铁定的了. 还是来做题吧. 前面八道题做起来都很简单. F: 标题:奇怪的分式 上小学的时候,小明经常自己发明新算法.一次,老师出的题目是: 1/4 乘以 8/5 小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45 (参见图1.png) 老师刚想批评他,转念一想,这个答案凑巧也对啊,真是见鬼! 对于分子.分母都是 1~9 中的一位数的情况,还有哪些算式可以这样计算呢? 请写出所有不同算式的个数(包括题中举例的). 显然,交换分子分母后,例如:4/1 乘以 5/8

第五届蓝桥杯C/C++本科B组(真题试做)(9~10)

第九题 迷宫取宝 标题:地宫取宝 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被带到地宫的入口,国王要求他只能向右或向下行走. 走过某个格子时,如果那个格子中的宝贝价值比小明手中任意宝贝价值都大,小明就可以拿起它(当然,也可以不拿). 当小明走到出口时,如果他手中的宝贝恰好是k件,则这些宝贝就可以送给小明. 请你帮小明算一算,在给定的局面下,他有多少种不同的行动方案能获得这k件宝贝. [数据格式] 输入

清北第一套题(zhx)

死亡 [问题描述] 现在有个位置可以打sif,有个人在排队等着打sif.现在告诉你前个人每个人需要多长的时间打sif,问你第个人什么时候才能打sif.(前个人必须按照顺序来) [输入格式] 第一行两个整数如上所述. 接下来行每行一个整数代表每个人所需要用的时间. [输出格式] 一行一个整数表示答案. [样例输入] 3 2 1 1 1 [样例输出] 1 [样例解释] 山里有座庙. [数据规模与约定] 对于的100%数据,每个人所需用的时间不超过10^5. 测试点     测试点     1 10

清北考前刷题day7早安

清北考前刷题da7下午好

三向城 /* 原图一定是一棵完全二叉树. 根节点是x,左节点是x*2,右节点是x*2+1 转化为二进制往左右走就很明显了. */ #include<iostream> #include<cstdio> #include<cstring> #define ll long long using namespace std; int T,x,y,k,ans,pos; inline int read() { int x=0,f=1;char c=getchar(); while

清北考前刷题day6下午好

/* 贪心 负数一定不取 枚举最高位是1 且答案取为0的 位置, 更新答案. */ #include<iostream> #include<cstdio> #include<cstring> #define ll long long #define N 100010 using namespace std; int n; ll a[N],ans,sum[N]; char s[N]; ll read() { ll x=0,f=1;char c=getchar(); whi