在下面网址看效果更佳>_<
http://mlz000.github.io/2015/09/01/2015-ACM%E5%A4%9A%E6%A0%A1%E8%AE%AD%E7%BB%83%E7%AC%AC%E4%B8%89%E5%9C%BA/
题外话
尼玛颓废着颓废着就开学了= =无聊终于把第三场的题全补完了
hdu 5316(1001) Magician
Solution
线段树裸题,维护四个东西,以奇/偶开头奇/偶结尾的最大值,正常线段树合并即可。
Code
hdu 5317(1002) RGCDQ
Solution
水题,发现 2×3×5×7×9×11×13×17>1000000 ,所以素因子种数最多为7个,前缀和统计一下即可
Code
hdu 5318(1003) The Goddess Of The Moon
Solution
水题,题目太长比赛没看= =,唯一的坑是要把数字去重,然后容易看出可以用矩阵乘法来递推
Code
hdu 5319(1004) Painter
Solution
简单模拟题,按题目要求一刷刷到底就可以了
Code
hdu 5320(1005) Fan Li
Solution
感觉这道题是个不错题,考虑以
i
为开头的序列,
考虑
Code
hdu 5321(1006) Beautiful Set
Description
A的计算方法是:对于
n
个数的某个排列,此排列的美丽值为这个排列所有的区间最大公约数之和。然后这个集合的美丽值为
B的计算方法是:在
n
个数中选出
Solution
很容易想到用 cnt[i] 表示集合中 i 的倍数个数
- 考虑第一个人
F1[x] 表示 gcd 为 x 的倍数的区间的个数
f1[x] 表示 gcd 为 x 的区间的个数
F1[x]=∑x|df1[d] 且 F1[x]=∑cnt[x]j=1(cnt[x]j)×j!×(n−j+1)!
从 cnt[x] 里选 j 个数,再把n−j 个数和这 j 个数算做n−j+1 的排列- 考虑第二个人
F2[x] 表示 gcd 为 x 的倍数的区间的个数
f2[x] 表示 gcd 为 x 的区间的个数
易知F2[x]=∑x|df2[d]
且 F2[x]=∑cnt[x]j=1(cnt[x]j)×j=cnt[x]×2cnt[x]−1
这个稍微推推就能推出来同样的 F2[x]=∑x|df2[d]
然后就是我们熟悉的莫比乌斯反演辣!
F(n)=∑n|df(d)
可以得到
f[n]=∑n|dμ(d/n)×F(d)
于是可以计算出 f ,
∑f[i]×i 即是答案Code
hdu 5322(1007) Hope
Solution
这题其实并不难,考虑 dp[i] 为长度为 i 的排列的答案,枚举这个排列最大值所在的位置,最大值左边和它都是联通的,于是我们可以得到转移方程
dp[i]=∑ij=1(i−1j−1)×(j−1)!×dp[i−j]×j2 稍加变换我们可以得到
dp[i]=(i−1)!×∑ij=1j2(i−j)!×dp[i−j]
令 k=i−j 我们可以得到 dp[i]=(i−1)!×∑i−1k=0(i−k)2k!×dp[k]
展开得 dp[i]=(i−1)!×(i2−2ik+k2)×dp[k]k!
维护三个前缀和即可O(N)解决,当然你可以没思维难度得想到cdq分治+NTT得做法QAQCode
hdu 5323(1008) Solve this interesting problem
Solution
考虑 [l,r] 是做左儿子还是右儿子,具体有 4 种情况,暴力枚举即可,实际上的复杂度是
411 ,完全可以接受Code
hdu 5324(1009) Boring Class
Solution
三维最长不下降序列之类的题,很容易想到按 id 算答案, r 这一维排序,
l 这一维用树状数组维护然后cdq分治的经典做法。
考虑 dp 由于要字典序最小,先cdq分治算右区间的答案,考虑对左区间的影响即可。
写了不到 80 行,轻松愉快,cdq分治真是个高大的姿势。。。爽Code
hdu 5325(1010) Crazy Bobo
Solution
水题,按权值排序后,权值小的向大的连即可,dp一下就行了
Code
hdu 5326(1011) Work
Solution
水题,随便dfs就行了= =
Code
完结撒花!
继续补题!>_< - 考虑第二个人