2015 ACM多校训练第三场
2015-09-03 20:22
357 查看
在下面网址看效果更佳>_<
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>10000002\times 3\times 5\times 7\times 9\times 11\times 13 \times17>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
感觉这道题是个不错题,考虑以ii为开头的序列,gcdgcd如果发生变化一定至少除以22,所以不同的gcd区间最多也是log级的。可以预处理出所有的四元组(g,i,l,r)(g,i,l,r),表示以ii为开头,结尾在[l,r][l,r]区间内gcdgcd为gg。考虑dpdp,不妨考虑当前gcd=xgcd=x的方案数以及区间数,假设该四元组开头为ii,显然区间数是以结尾在[1,i−1][1,i-1]区间内的最大值+1+1,方案数也很好计算。容易发现用一个线段树就可以轻松维护了。
Code
hdu 5321(1006) Beautiful Set
Description
A的计算方法是:对于nn个数的某个排列,此排列的美丽值为这个排列所有的区间最大公约数之和。然后这个集合的美丽值为nn个数的所有排列的美丽值之和。B的计算方法是:在nn个数中选出k(1≤k≤n)k(1 \le k \le n)个数,对于某种选取方案,这种方案的美丽值为kk个数的最大公约数乘上kk。然后这个集合的美丽值为所有选数方案的美丽值之和。
Solution
很容易想到用cnt[i]cnt[i]表示集合中ii的倍数个数考虑第一个人
F1[x]F1[x]表示gcdgcd为xx的倍数的区间的个数
f1[x]f1[x]表示gcdgcd为xx的区间的个数
F1[x]=∑x|df1[d]F1[x]=\sum_{x|d}f1[d]
且F1[x]=∑cnt[x]j=1(cnt[x]j)×j!×(n−j+1)!F1[x]=\sum_{j=1}^{cnt[x]} \binom{cnt[x]}{j}\times j! \times (n-j+1)!
从cnt[x]cnt[x]里选jj个数,再把n−jn-j个数和这jj个数算做n−j+1n-j+1的排列
考虑第二个人
F2[x]F2[x]表示gcdgcd为xx的倍数的区间的个数
f2[x]f2[x]表示gcdgcd为xx的区间的个数
易知F2[x]=∑x|df2[d]F2[x] = \sum_{x|d}f2[d]
且F2[x]=∑cnt[x]j=1(cnt[x]j)×j=cnt[x]×2cnt[x]−1F2[x]= \sum_{j=1}^{cnt[x]} \binom{cnt[x]}{j}\times j = cnt[x]\times 2^{cnt[x]-1}
这个稍微推推就能推出来
同样的F2[x]=∑x|df2[d]F2[x] = \sum_{x|d}f2[d]
然后就是我们熟悉的莫比乌斯反演辣!
F(n)=∑n|df(d)F(n)=\sum_{n|d}f(d)
可以得到
f[n]=∑n|dμ(d/n)×F(d)f
=\sum_{n|d}\mu(d/n)\times F(d)
于是可以计算出ff,∑f[i]×i\sum f[i]\times i即是答案
Code
hdu 5322(1007) Hope
Solution
这题其实并不难,考虑dp[i]dp[i]为长度为ii的排列的答案,枚举这个排列最大值所在的位置,最大值左边和它都是联通的,于是我们可以得到转移方程dp[i]=∑ij=1(i−1j−1)×(j−1)!×dp[i−j]×j2dp[i]=\sum_{j=1}^i \binom{i-1}{j-1}\times (j-1)!\times dp[i-j]\times j^2
稍加变换我们可以得到
dp[i]=(i−1)!×∑ij=1j2(i−j)!×dp[i−j]dp[i]=(i-1)!\times \sum_{j=1}^i \frac{j^2}{(i-j)!}\times dp[i-j]
令k=i−jk=i-j我们可以得到dp[i]=(i−1)!×∑i−1k=0(i−k)2k!×dp[k]dp[i]=(i-1)!\times \sum_{k=0}^{i-1}\frac{(i-k)^2}{k!}\times dp[k]
展开得dp[i]=(i−1)!×(i2−2ik+k2)×dp[k]k!dp[i]=(i-1)!\times (i^2-2ik+k^2)\times \frac{dp[k]}{k!}
维护三个前缀和即可O(N)解决,当然你可以没思维难度得想到cdq分治+NTT得做法QAQ
Code
hdu 5323(1008) Solve this interesting problem
Solution
考虑[l,r][l,r]是做左儿子还是右儿子,具体有44种情况,暴力枚举即可,实际上的复杂度是4114^{11},完全可以接受Code
hdu 5324(1009) Boring Class
Solution
三维最长不下降序列之类的题,很容易想到按idid算答案,rr这一维排序,ll这一维用树状数组维护然后cdq分治的经典做法。考虑dpdp由于要字典序最小,先cdq分治算右区间的答案,考虑对左区间的影响即可。
写了不到8080行,轻松愉快,cdq分治真是个高大的姿势。。。爽
Code
hdu 5325(1010) Crazy Bobo
Solution
水题,按权值排序后,权值小的向大的连即可,dp一下就行了Code
hdu 5326(1011) Work
Solution
水题,随便dfs就行了= =Code
完结撒花!继续补题!>_<
相关文章推荐
- 跨域调用webapi
- 偶遇问题 - - 空格导致行内元素水平间隔问题
- linux命令进阶小记
- 最大公约数Stein算法之verilog实现
- LCS (最长公共子序列)
- Cocos2d-x xml解析
- 关于ListView的优化!
- 【extern】如何使用关键字extern "C"?
- ViewPager+Fragment实现滑动显示,且Fragment里面又放Fragment+viewPager
- Delphi考虑sql注入 QuotedStr
- Block Formatting Contexts
- 思维值惰性
- hdoj 1385 Minimum Transport Cost
- Maven系列2--pom.xml 配置详解
- js数据结构与算法存储结构
- Redis安装
- 【英语】Bingo口语笔记(62) - 生气道歉场景的表达
- IOS SWIFT 简单操作文件
- POJ 2125 Destroying The Graph(二分图最小点权覆盖)
- 初始化和清除