【题解】n个数最大公约数总和,m组人坐一排同一组的不能相邻,CF #300 F
2015-04-27 13:48
295 查看
1.
n个小于等于10000的数,问两两之间的最大公约数的总和。难点在于两个数有多个公约数,不是最大的公约数会重复统计,这可以从大到小统计公约数为x的对数,对于公约数为x的,要减去公约数为x的倍数的对数,就是类似筛素数的方法枚举倍数。
2.
m组人,总共n个人,坐到n个位置中,同一组人不能相邻,问方案数。dp[i][j]表示前i组有j个不合法间隙。转移就是,第i组有x人来说,枚举这x人分成几组,插入到间隙中,当前有t人,间隙就有t+1个,包括左右端,x人分成h组有c(x-1,h-1)种方案,这也是间隙隔板法求出来的,枚举j组插入到k个合法间隙,h-k个不合法间隙,然后这h组会产生新的x-h个不合法间隙,转移看出来了吧。复杂度好像是3次方的。最后答案是dp[m][0]。
3.
http://codeforces.com/contest/538/problem/F
好像很多解法,睡前想了下,最土的就是把所有区间处理出来,nlogn级别的区间个数,然后用函数式线段树统计每个区间比某个数大的数有多少个。我脑子有坑,傻逼啊,刚看到了个解法,树状数组,仔细一想,这用个P的函数式线段树,排序下树状数组不就完了?
看了某sjtu神牛的代码发现可以分情况,sqrt(N)*N的做法。对于编号小于sqrt(N)的节点,其区间每次调整不会超过sqrt(N),大于sqrt(N)的节点,其区间长度不会超过sqrt(N)。
看了某UESTC神牛的做法,思路好像是对于每个点,对于一段连续的k值其父节点是不会变的,所以就对每个点处理其所有可能的父节点并且对对应的那段k进行更新,这可以直接用个sum数组O(1)维护。这复杂度不好算啊,看运行时间,比N*sqrt(N)的和N*logN*logN的慢很多。
DP数学题不好练啊,这方面真是废了,拿手的数据结构题也不能一下反应过来了,只有代码速度、准确度还好一些。
n个小于等于10000的数,问两两之间的最大公约数的总和。难点在于两个数有多个公约数,不是最大的公约数会重复统计,这可以从大到小统计公约数为x的对数,对于公约数为x的,要减去公约数为x的倍数的对数,就是类似筛素数的方法枚举倍数。
2.
m组人,总共n个人,坐到n个位置中,同一组人不能相邻,问方案数。dp[i][j]表示前i组有j个不合法间隙。转移就是,第i组有x人来说,枚举这x人分成几组,插入到间隙中,当前有t人,间隙就有t+1个,包括左右端,x人分成h组有c(x-1,h-1)种方案,这也是间隙隔板法求出来的,枚举j组插入到k个合法间隙,h-k个不合法间隙,然后这h组会产生新的x-h个不合法间隙,转移看出来了吧。复杂度好像是3次方的。最后答案是dp[m][0]。
3.
http://codeforces.com/contest/538/problem/F
好像很多解法,睡前想了下,最土的就是把所有区间处理出来,nlogn级别的区间个数,然后用函数式线段树统计每个区间比某个数大的数有多少个。我脑子有坑,傻逼啊,刚看到了个解法,树状数组,仔细一想,这用个P的函数式线段树,排序下树状数组不就完了?
看了某sjtu神牛的代码发现可以分情况,sqrt(N)*N的做法。对于编号小于sqrt(N)的节点,其区间每次调整不会超过sqrt(N),大于sqrt(N)的节点,其区间长度不会超过sqrt(N)。
看了某UESTC神牛的做法,思路好像是对于每个点,对于一段连续的k值其父节点是不会变的,所以就对每个点处理其所有可能的父节点并且对对应的那段k进行更新,这可以直接用个sum数组O(1)维护。这复杂度不好算啊,看运行时间,比N*sqrt(N)的和N*logN*logN的慢很多。
DP数学题不好练啊,这方面真是废了,拿手的数据结构题也不能一下反应过来了,只有代码速度、准确度还好一些。
相关文章推荐
- 第十二周 求一组数的最大公约数 (递归)
- Gym 101028E-Teams-求一组数的最大公约数
- [洛谷P1029]最大公约数与最小公倍数问题 题解(辗转相除法求GCD)
- JavaScript求一组数的最小公倍数和最大公约数常用算法详解【面向对象,回归迭代和循环】
- 输入一组数,求该组数每组的最大公约数
- House Robber 非负数组,相邻不能相加,求最大的和是多少(动态规划)
- 给一个整数数组,有正有负。找出数组最大和,条件是使用的元素不能有相邻
- n个学生站成一排 网易面试题之每个学生有一个能力值 牛牛想从n个学生中选出k名学生 要求相邻学生编号不超过d使得这k个学生乘积最大
- n个学生站成一排 网易面试题之每个学生有一个能力值 牛牛想从n个学生中选出k名学生 要求相邻学生编号不超过d使得这k个学生乘积最大
- 请各位帮忙看一下,第一个程序为什么不能输出和第二个程序一样的结果?这两个程序只有求最大公约束的代码不同
- n个学生站成一排 网易面试题之每个学生有一个能力值 牛牛想从n个学生中选出k名学生 要求相邻学生编号不超过d使得这k个学生乘积最大
- Project Euler 18.给你一组由数字组成的三角形,从三角形的顶端开始,依次移向下一行相邻数字,求从顶端到低端的最大和为多少?
- javascript 求一组数的最小公倍数和最大公约数的简便算法 (三种方法,面向对象,回归迭代,和循环)
- n个学生站成一排 网易面试题之每个学生有一个能力值 牛牛想从n个学生中选出k名学生 要求相邻学生编号不超过d使得这k个学生乘积最大
- n个学生站成一排 网易面试题之每个学生有一个能力值 牛牛想从n个学生中选出k名学生 要求相邻学生编号不超过d使得这k个学生乘积最大
- VC求一组数的最大值最小值总和以及平均值
- CF 209 Div2 (C) 快速幂 求分子(一堆数相加)和分母的最大公约数
- 第一题:有 n 个学生站成一排,每个学生有一个能力值,牛牛想从这 n 个学生中按照顺序选取 k 名学生,要求相邻两个学生的位置编号的差不超过 d,使得这 k 个学生的能力值的乘积最大,你能返回最大的乘积吗?
- 简写的最大公约数写法(不能再忘了)
- n个学生站成一排 网易面试题之每个学生有一个能力值 牛牛想从n个学生中选出k名学生 要求相邻学生编号不超过d使得这k个学生乘积最大