[题解]CodeChef APRIL Challenge 17

来源:互联网 发布:冲突世界 知乎 编辑:程序博客网 时间:2024/06/07 20:12

Similar Dishes

题意简述

给你两个大小为4的字符串集合,问你并集是不是空集。

数据范围

1T200
2len10

思路

丝薄模拟。

Dish Of Life

题意简述

n个岛,每个岛pi种食材。
食材编号为1~k
问能否收集到全部食材,如果能,是否必须经过所有岛。

数据范围

1T10
1n,k105
1p106

思路

随便那个bool数组搞一搞就行了,丝薄题。

Bear and Row 01

题意简述

给出一个01序列,每次可以选择一个1,如果它右边为0,便可以向右移动一格。
选择和移动都要花费1s。
求最长时间。

数据范围

1T5
1len105

思路

移动完成之后相对位置不变,每个1最后到的位置是确定的。
移动的代价就确定了。
最大化选择的代价。
每个1被选择的次数与它右边的1需要移动长度的种类数有关。
随便搞搞就A了。

Bear and Clique Distances

题意简述

n个城市。
k个城市两两之间都有长度为x的道路相连。
此外还有m条道路。
求从S出发到每个城市的最短路。

数据范围

1T3
2n105
1m105
1len109

思路

对前k个城市建一个附加点p
aip(x)pai(0)
然后就是个裸的最短路了。

Chef and Divisor Tree

题意简述

定义x的因子树:
x作为根,将x的真因子作为它的儿子。
对每个儿子重复这个步骤。
(一个数可能被写多次)
一条路径的得分定义为路径上所有点的度数之和。
一棵树的得分f(x)定义为所有从根到叶子的路径的得分的最大值。
计算Ri+Lf(i)

数据范围

1LR1012
RL105

思路

x的因子树的得分最高的路径:x每次去掉次数最高的质因子,直到走到1
得出结论:x的因子树的得分,只与x的质因数的次数形成的集合有关。
1012以内最多只有11个质因子。
爆搜出所有的集合,状态只有不到5000种。
一个数>n的质因数最多只有一个。
1012的质数筛这个区间,就可以求出这个区间所有数的质因子次数集合。
然后就可以直接做了。
UPD:后来发现直接暴力减就可以了???

Stable market

题意简述

给出长度为n的数列。
定义稳定块为权值相同的日子的极大连续段。
定义k 阶稳定块为长度至少为 k 的稳定块。
回答q个询问,每次询问[Li,Ri]区间中,k阶稳定块的个数。

数据范围

1T5
1n,q105
1ai106

思路

直接上莫队就好了嘛…

Bear and Random Grid

题意简述

n×n的网格。
每个格子里是.#.表示有一个棋子,#表示障碍。
给出L个操作,形如RLUD表示向左右上下移动。
每次操作所有棋子一同移动,如果碰到障碍或者超出边界便移除。
问每个棋子能走多少步,输出它们的异或和。
数据安装一定方法生成:定义一个概率p,每个格子有p的概率成为障碍。

数据范围

1T3
1n1000
1L5000
0p<1

思路

bitset强行搞。
行列都搞一个bitset。每次操作完统计一下棋子个数。
复杂度O(Tn2L64)
可以通过本题。
好像另有高论啊……
按照p分类。
如果p很大,障碍较多,从每个棋子开始走走几步就碰到障碍了,直接模拟期望复杂度O(n2p)
如果p比较小,障碍较小,从障碍反着走。复杂度O(n2pL)

Chef and Digits

题意简述

[L,R]区间内有多少数,数字i的个数ai

数据范围

1T20
1LR1018
0ai18

思路

数位DP。
统计答案再套一个DP。
f(i,j)表示放到i个数,一共放了j个数。
转移f(i,j)=f(i1,jk)×C(j,k)
复杂度O(Tlog5R)

(CH) Serejs and Billiards

题意简述

一道challenge题目。
给出一张n×n的球桌,上面有m个球,每个球有一个分数。
每次击球可以选择八个方向,上下左右和它们的角平分线方向。
如果碰到桌壁,球会镜面反弹。
如果碰到另一个球,会将这两个球合并,继续走。
如果到了桌角斜后方的点(假设(0,0)是桌角,描述的是(1,1)的位置),球会进洞,得到得分。
每次击球会花费1分的代价。
最大化得分。

数据范围

1T10
1n100
1m1000

思路

1.将所有正得分的球移动到上沿,负得分球移动到左沿。
2.最左列如果有正,就向右/右上/右下移动一下。
3.最上行如果有负,就向下/左下/右下移动一下。
4.整行/列的移动可以通过一次击球得到。
5.xjb优化

Heavy-Light Decomposition

题意简述

对一棵n个节点的树进行轻重链剖分。
一条轻链的代价为L
一条重链的代价为log2L+1
使得从根到叶,代价最大的路径的代价最小。
求这个最小值。

数据范围

1T10
1n105

思路

朴素DP。
f(i,j)表示i节点向上重链长度为j时,最小的子树代价最大值。
转移显然,枚举每一个儿子当做重儿子,取min
这样复杂度O(n2)需要优化。
联想树链剖分,不超过logn条重链,每条重链代价为log,答案在log2级别,实测120+。
其实题目描述就是树链剖分线段树的复杂度?
考虑转换状态。
f(i,j)表示i节点,答案为j时,向上重链长度的取值区间。
由于单调性,我们只需要保存一个端点即可。
转移显然。
复杂度O(Tnlog2n)

0 0
原创粉丝点击