2016 年青岛网络赛题解

2016 年青岛online题解(来自icpc-camp)

1001

题意:给出一个整数 n , 找出一个大于等于 n 的最小整数 m , 使得 m 可以表示为 2a3b5c7d .

题解:快速幂预处理出所有形为 2a3b5c7d 即可, 大概只有几k个.

1002

题意:给 n ,求 nk=11k2

题解: n 很大的时候(大概大于1000000)答案趋近于 π26 n 小的时候预处理即可。

1003

题意:敏感词屏蔽,给一堆敏感词,给一段文本,要求把文本中所有的敏感词用*代替。

题解:对敏感词建出AC自动机,在AC自动机上跑文本,就可以得到文本的每个前缀的最长匹配后缀,扫一遍即可得到结果。

1004

题意:有一壶水, 体积在 L R 之间, 有两个杯子, 你要把水倒到两个杯子里面, 使得杯子水体积几乎相同(体积的差值小于等于1), 并且使得壶里剩下水体积不大于1. 你无法测量壶里剩下水的体积, 问最小需要倒水的次数。

题解:考虑倒水的大致过程, L=0 L=1 的情况应该是等价的,所以不妨设 L>0 。首先向一个杯子倒 L2 升水,再往另一个杯子倒 L2+1 升水。接下来就来回往两个杯子里倒 2 升,直到倒空为止。这样就很容易分析出需要倒水的次数。唯一注意的是最后壶里面可以剩下 1 升水,可以省一次倒水的操作。

1005

题意:问 n 个手势的石头剪刀布游戏是否能保证出每种手势胜率都一样。

题解:当每种手势的攻防个数完全相等才能保证平衡,所以容易得出 n 是奇数时游戏平衡,否则不平衡。

1006

题意: n 个点 m 条无向边的图,找一个欧拉通路/回路 P0,P1,..Pm ( Pi 是节点标号),使得 aP0aP1..aPm 最大。输出这个值。

题解:由欧拉路性质,奇度点数量为0或2。一个节点被进一次出一次,度减2,产生一次贡献,因此节点 u 的贡献为 (degreeu2 mod 2)au 。欧拉回路的起点贡献多一次,欧拉通路的起点和终点贡献也多一次。因此如果是欧拉回路的话枚举一下起点就好了。

1007

题意: n 个有序序列的归并排序.每次可以选择不超过 k 个序列进行合并,合并代价为这些序列的长度和.总的合并代价不能超过 T , 问 k 最小是多少。

.

题解:首先二分一下这个 k 。然后在给定 k 的情况下,这个代价其实就是 k 叉的哈夫曼树问题。因此直接套用哈夫曼树的堆做法即可。复杂度 O(nlog2n) ,这样优化一下读入是可以卡过去的。

然后主代码手表示,利用合并的单调性,可以去掉优先队列得到 O(nlogn) 的做法:先对所有数排序,另外一个队列维护合并后的值,取值时从两个序列前端取小的即可。

昂神:如果 (n1)%(k1)0 ,要把最小的 (n1)%(k1)+1 个数先合并一下。

1008

题意:给出一个 n×m 的格子, 格子 (i,j) 上有个值 p(i,j) . 两个格子之间的距离定义为两个格子中心的欧几里得距离. 你可以选择一个格子, 距离它小于等于 r 的那些格子都会贡献 p(i,j)/(d+1) , d 为两个格子的距离. 选择一个格子, 使得贡献和最大.

题解:取 Mmax(n+2r,m+2r) ,造两个多项式 A[iM+j]=p(i,j) B[iM+j]=1i2+j2+1 ,它们的卷积 C=AB 的第 (iM+j) 项就是 (i,j) 格子的贡献和。所以只要 FFT 即可。

1009

题意:给出 n 个点的无向带权树,问删掉每条边后的直径。

题解:找出树的一条直径 (a,b) ,然后分别以 a,b 为根,dp 预处理子树 v 的直径。

如果删掉的边不在直径上,那么有一颗子树的直径就是原树的直径,另一边已经预处理好了。如果在直径上,很显然两遍都预处理了。

1010

题意:01 背包,100 个物品,其他数值都是 [0,109] 内的均匀随机数。

题解:我的做法是先吧所有物品按收益率排序,然后加上可行性剪枝。可是这样还是会 TLE 的。考虑数据的特殊性,加上个卡时就可以通过了。

1011

题意:1000个点10000条边的无向图,敌人从n走一条最短路到1,在第i条路设置障碍的代价是wi,求最少的代价使得敌人至少会遇到一次障碍。

题解:bfs+最小割(裸)

1012

题意:50个数,10W个询问,每次问删掉第i,j,k个数后,是否存在一种选10个数和为87的方案,只需要输出 ’Yes’ 或者 ’No’。

题解:暴力:不同的询问大概2W个,每个暴力bitset DP,抠一抠能卡着过。优化1:先求出一组解,如果询问和解没交就是’Yes’,否则暴力,不同的询问大概1W个;优化2:先预处理出所有询问的答案,能方便的复用之前的DP数组,不用每次从头开始重新求。

1013

题意:给出一个字符串, 兹茨往后加一个字符, 然后询问一个字符串 T (是原来字符串的一个子串以区间 [l,r] 形式给出), 问 T 中一个子串最长的至少出现两次的连续子串的长度. 强制在线.

题解:暂时未有任何人AC……

你可能感兴趣的:(HDUOJ)