您的位置:首页 > 其它

[题解]CodeChef APRIL Challenge 17

2017-04-18 21:43 267 查看

Similar Dishes

题意简述

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

数据范围

1≤T≤200

2≤len≤10

思路

丝薄模拟。

Dish Of Life

题意简述

n个岛,每个岛pi种食材。

食材编号为1~k

问能否收集到全部食材,如果能,是否必须经过所有岛。

数据范围

1≤T≤10

1≤n,k≤105

1≤∑p≤106

思路

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

Bear and Row 01

题意简述

给出一个
01
序列,每次可以选择一个
1
,如果它右边为
0
,便可以向右移动一格。

选择和移动都要花费1s。

求最长时间。

数据范围

1≤T≤5

1≤len≤105

思路

移动完成之后相对位置不变,每个
1
最后到的位置是确定的。

移动的代价就确定了。

最大化选择的代价。

每个
1
被选择的次数与它右边的
1
需要移动长度的种类数有关。

随便搞搞就A了。

Bear and Clique Distances

题意简述

n个城市。

前k个城市两两之间都有长度为x的道路相连。

此外还有m条道路。

求从S出发到每个城市的最短路。

数据范围

1≤T≤3

2≤n≤105

1≤m≤105

1≤len≤109

思路

对前k个城市建一个附加点p。

连ai→p(x),p→ai(0)

然后就是个裸的最短路了。

Chef and Divisor Tree

题意简述

定义x的因子树:

x作为根,将x的真因子作为它的儿子。

对每个儿子重复这个步骤。

(一个数可能被写多次)

一条路径的得分定义为路径上所有点的度数之和。

一棵树的得分f(x)定义为所有从根到叶子的路径的得分的最大值。

计算∑Ri+Lf(i)

数据范围

1≤L≤R≤1012

R−L≤105

思路

x的因子树的得分最高的路径:x每次去掉次数最高的质因子,直到走到1。

得出结论:x的因子树的得分,只与x的质因数的次数形成的集合有关。

1012以内最多只有11个质因子。

爆搜出所有的集合,状态只有不到5000种。

一个数>n√的质因数最多只有一个。

用1012−−−−√的质数筛这个区间,就可以求出这个区间所有数的质因子次数集合。

然后就可以直接做了。

UPD:后来发现直接暴力减就可以了???

Stable market

题意简述

给出长度为n的数列。

定义稳定块为权值相同的日子的极大连续段。

定义k 阶稳定块为长度至少为 k 的稳定块。

回答q个询问,每次询问[Li,Ri]区间中,k阶稳定块的个数。

数据范围

1≤T≤5

1≤n,q≤105

1≤ai≤106

思路

直接上莫队就好了嘛…

Bear and Random Grid

题意简述

n×n的网格。

每个格子里是
.
#
.
表示有一个棋子,
#
表示障碍。

给出L个操作,形如
RLUD
表示向左右上下移动。

每次操作所有棋子一同移动,如果碰到障碍或者超出边界便移除。

问每个棋子能走多少步,输出它们的异或和。

数据安装一定方法生成:定义一个概率p,每个格子有p的概率成为障碍。

数据范围

1≤T≤3

1≤n≤1000

1≤L≤5000

0≤p<1

思路

bitset强行搞。

行列都搞一个bitset。每次操作完统计一下棋子个数。

复杂度O(Tn2L64)。

可以通过本题。

好像另有高论啊……

按照p分类。

如果p很大,障碍较多,从每个棋子开始走走几步就碰到障碍了,直接模拟期望复杂度O(n2p)。

如果p比较小,障碍较小,从障碍反着走。复杂度O(n2pL)

Chef and Digits

题意简述

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

数据范围

1≤T≤20

1≤L≤R≤1018

0≤ai≤18

思路

数位DP。

统计答案再套一个DP。

f(i,j)表示放到i个数,一共放了j个数。

转移f(i,j)=f(i−1,j−k)×C(j,k)

复杂度O(Tlog5R)

(CH) Serejs and Billiards

题意简述

一道challenge题目。

给出一张n×n的球桌,上面有m个球,每个球有一个分数。

每次击球可以选择八个方向,上下左右和它们的角平分线方向。

如果碰到桌壁,球会镜面反弹。

如果碰到另一个球,会将这两个球合并,继续走。

如果到了桌角斜后方的点(假设(0,0)是桌角,描述的是(−1,−1)的位置),球会进洞,得到得分。

每次击球会花费1分的代价。

最大化得分。

数据范围

1≤T≤10

1≤n≤100

1≤m≤1000

思路

1.将所有正得分的球移动到上沿,负得分球移动到左沿。

2.最左列如果有正,就向右/右上/右下移动一下。

3.最上行如果有负,就向下/左下/右下移动一下。

4.整行/列的移动可以通过一次击球得到。

5.xjb优化

Heavy-Light Decomposition

题意简述

对一棵n个节点的树进行轻重链剖分。

一条轻链的代价为L。

一条重链的代价为⌈log2L⌉+1

使得从根到叶,代价最大的路径的代价最小。

求这个最小值。

数据范围

1≤T≤10

1≤n≤105

思路

朴素DP。

f(i,j)表示i节点向上重链长度为j时,最小的子树代价最大值。

转移显然,枚举每一个儿子当做重儿子,取min。

这样复杂度O(n2)需要优化。

联想树链剖分,不超过logn条重链,每条重链代价为log,答案在log2级别,实测120+。

其实题目描述就是树链剖分线段树的复杂度?

考虑转换状态。

f(i,j)表示i节点,答案为j时,向上重链长度的取值区间。

由于单调性,我们只需要保存一个端点即可。

转移显然。

复杂度O(Tnlog2n)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: