摘要: 对于一列的石子归并问题,除了朴素的O(n^3)的dp做法及其O(n^2)优化,还有GarsiaWachs算法。 算法流程是,找一个最小的k,使得a[k-1]<=a[k+1],将a[k-1]和a[k]合并;从当前位置向前找到一个最大的i,使得a[i]>a[k-1]+a[k],并将新合并的一堆移到i的后 阅读全文
posted @ 2019-05-26 17:23 Mr^Kevin 阅读(999) 评论(1) 推荐(3) 编辑
摘要: 若b为奇数,则 sum(a,b)=1+a+a^2+...+a^b=(1+a+a^2+...+a^((b-1)/2))+(a^((b+1)/2)+...+a^b)=(1+a^((b+1)/2))*sum(a,(b-1)/2) 若b为偶数,则 sum(a,b)=(1+a^(b/2))*sum(a,b/2 阅读全文
posted @ 2019-02-21 23:17 Mr^Kevin 阅读(538) 评论(0) 推荐(1) 编辑
摘要: 主要思想是,对于非负整数n,输出n最低位的1所在位,并不断把n赋值成n-(n&-n),直至n=0。 为了提高效率,我们使用Hash代替取log,并且利用一个数学技巧:对于任意在[0,35]中的k,2^k%37互不相等,且恰好取遍整数1~36。 阅读全文
posted @ 2019-02-14 21:11 Mr^Kevin 阅读(330) 评论(0) 推荐(1) 编辑
摘要: 题目链接:https://www.luogu.org/problemnew/show/P1171 比较经典的状压DP吧,就是最后一个点不开O2卡不过去。。。 主要是对位运算熟,注意f[1][0]=0,其他状态为正无穷,别的看代码吧。 1 #include <cstdio> 2 #include <c 阅读全文
posted @ 2019-02-14 20:36 Mr^Kevin 阅读(522) 评论(0) 推荐(0) 编辑
摘要: 取出整数n在二进制表示下的第k位:(n>>k)&1 取出整数n在二进制表示下的第0~k-1位(后k位):n&((1<<k)-1) 把整数n在二进制表示下的第k位取反:n^(1<<k) 对整数n在二进制表示下的第k位赋值1:n|(1<<k) 对整数n在二进制表示下的第k位赋值0:n&(~(1<<k)) 阅读全文
posted @ 2019-02-14 19:44 Mr^Kevin 阅读(322) 评论(0) 推荐(1) 编辑
摘要: //总结自李煜东著《算法竞赛进阶指南》 问题:求a乘b对p取模的值,其中1<=a,b,p<=10^18。 简单的暴力相乘显然会溢出(相当于对64位整数最大值+1取模),对a进行b次累加显然会超时。 法一: 仿照快速幂,用二进制表示b。 法二: 利用a*b%p=a*b-floor(a*b/p)*p求解 阅读全文
posted @ 2019-01-26 23:10 Mr^Kevin 阅读(872) 评论(1) 推荐(1) 编辑
摘要: 差分约束系统是求解不等式组的一种算法,其实就是将不等关系转化为图中的边,然后通过求最短/长路求解不等式组解的边界。 其中不等式应形如y-x<=k,然后利用最短/长路中的三角不等式建边。以最短路为例,假如我们求出了一张图中所有点到源点的最短路,若存在边<x,y>,其边权为k,那么必有dist[x]<= 阅读全文
posted @ 2018-11-05 17:26 Mr^Kevin 阅读(232) 评论(0) 推荐(0) 编辑
摘要: 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2330 差分约束系统的模板题吧,一看题目各种不等式。。。 因为是要求最小值,所以我们选择跑最长路好了。根据题目描述建边,这个应该不难,x=1就是建从a到b和从b到a的边权为0的边,x=2就是 阅读全文
posted @ 2018-11-05 17:14 Mr^Kevin 阅读(296) 评论(0) 推荐(0) 编辑
摘要: 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4562 好像,一年前,不知道啥叫拓扑图DP的时候做过,记得只有暴力分30。。。 显然和拓扑排序有关,实际上,可以用DP求解。设dp[i]表示以结点i结尾的食物链条数,显然dp[i]=sum{ 阅读全文
posted @ 2018-11-05 14:58 Mr^Kevin 阅读(270) 评论(0) 推荐(0) 编辑
摘要: 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4010 一种比较容易想到的做法是把进行拓扑排序的队列换成优先队列,每次取出能访问到的编号最小的点,但这样是不对的,很容易构造数据卡掉。 正确的做法是建反向图,每次取出编号最大的,再将生成的拓 阅读全文
posted @ 2018-11-05 14:27 Mr^Kevin 阅读(220) 评论(0) 推荐(0) 编辑