20201009day30 模拟(十)
szq,gjz是神!【梅开二度】
24赛高~
1
problem
题目描述
参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了\(n\)个深埋在地下的宝藏,第\(i\)个宝藏价值为\(w_i\),挖掘它需要时间\(t_i\)。
赞助商给小明的时间是有限的,他只有\(T\)的时间用来挖掘宝藏。也就是说他挖掘的宝藏消耗的总时间不得超过\(T\)。
现在小明一共进行了\(Q\)次开采活动,第\(i\)次开采正好开采\(x_i\)个宝藏(保证\(x_i\)为奇数),他想要您计算开采的宝藏的价值的中位数最大是多少。(这些开采活动是独立的,即不会实际对宝藏造成影响)
输入格式
第一行三个用空格分离的正整数\(n,T,Q\),代表宝藏的个数,小明的时间以及询问次数。
接下来\(n\)行,每行有两个用空格分开的整数\(w_i,t_i\)。
接下来\(Q\)行,每行一个整数\(x_i\)表示第\(i\)次开采的宝藏数。
输出格式
输出\(Q\)行,每行一个整数表示答案,如果不存在任何方案请输出\(-1\)。
样例一输入
5 80 3
23 24
37 33
24 22
29 18
57 20
1
3
5
样例一输出
57
37
-1
solution
将所有宝藏按其价值排好序。
考虑枚举从小到大开采的宝藏个数,答案必定不增,可以用双指针扫。
考虑如何单次判断某个宝藏的价值能否成为答案,则必定是从价值高于它的和价值低于它的各选\(x\)个消耗时间最小的,这个可以用主席树来维护。
时间复杂度\(O(n\log max(t_i))\)
2
problem
给一个\(n\)个点\(m\)条有向边的图,每条边上有数字\(0\)或\(1\),定义一个路径的长度为这个路径上依次经过的边上的数字拼在一起后在二进制下的值(前导\(0\)对该路径长度没有贡献)。现在需要你求出从\(1\)号点出发,到\(2\cdots n\)号点的路径的长度的最小值。如果不存在路径,请输出\(-1\)。
solution
可以先把从\(1\)号点能只走\(0\)边就能到达的点都缩成一个点。
接下来我们要让路径经过的边数尽量少,在此前提下最小化字典序。
可以考虑直接bfs,每次从队列前部取出所有距离相同的点并先遍历\(0\)边再遍历\(1\)边更新答案,具体可以见std。
时间复杂度\(O(n+m)\)。
3
problem
题目描述
牌堆中牌的数量是无穷大的,并且每一张牌的点数都是在\([1,A]\)内均匀随机的正整数。你可以亮出牌堆顶的\(n\)张牌。然后获得其中任意数量点数之和不大于\(m\)的牌,将其余的牌置入弃牌堆。
现在询问如果进行上述操作时总是获得尽量多的牌,那么单次发动这个操作后期望能获得几张牌。对998244353取模。
solution
最优策略肯定是取所有牌中点数最小的几张
考虑固定选了哪些牌,并求出有多少个方案使得选的牌中前几个恰好是这些,那么有
\(ans \times A^n = \sum_{i=0}^{n}\sum_{j=1}^{A}\sum_{k=1}^{n-i}g_{i,j-1,m-j\times k}\times \binom{n}{i} \sum_{t \geq k}\binom{n-i}{t} \times (A-j)^{n-i-t}\)
其中\(g_{i,j,k}\)表示有多少个长度为\(i\)的正整数序列满足每一个数字不大于\(j\)且所有数字总和不超过\(k\)
大概就是枚举选的牌中的最大值\(j\),最大值个数\(k\),以及选了\(i\)个小于\(j\)的牌。
可以用背包计算,也可以枚举有多少个数字大于\(j\)容斥计算,那么有
\(ans \times A^n = \sum_{i=0}^{n}\sum_{j=1}^{A}\sum_{k=1}^{n-i}\left(\sum_{t=0}^i (-1)^t\binom{i}{t}\binom{m-k\times j-t \times(j-1)}{i}\right)\times \binom{n}{i} \sum_{t \geq k}\binom{n-i}{t} \times (A-j)^{n-i-t}\)
组合数为\(0\)的时候能直接跳过,那么直接按照上式计算大概是\(O(n^2m\log m)\)的。
4
problem
给定两颗树\(T1,T2\),求\(T1\)有多少个连通块与\(T2\)同构。
树\(A\)与树\(B\)同构当且仅当存在一个\(A\)的点集到\(B\)的点集的双射\(f\),且存在一个\(A\)的边集到\(B\)的边集的双射\(g\)将边\((x,y)\)映射到边\((f(x),f(y))\)。换一种说法,即存在一种将\(A\)重标号的方案使得\(A\)与\(B\)完全相同。
solution
可以考虑求出\(T1\)的每个连通块有多少个双射\(f\)是合法的之和,然后除去\(T2\)的自同构方案数即可。
我们只要固定一个\(T1\)的根即可,但是需要枚举\(T2\)的根并每次进行dp。
令\(dp_{u,S}\)表示\(u\)的儿子已经向\(T2\)的\(S\)中的点建立双射的方案数,每次枚举当前儿子与哪个点建立双射进行转移。
然后将\(T1\)每个点与\(T2\)的根配对的方案数加起来。
时间复杂度\(O(nm^2 2^m)\)。