上一页 1 ··· 33 34 35 36 37 38 39 40 41 ··· 85 下一页
  2012年3月14日
摘要: HDU_3437 比较容易证明,x应该取区间的中位数,于是问题就转化成了求[l,r]区间内大小排第(l+r)/2+1的数,然后将和计算出来即可。 求区间的中位数可以用划分树来实现,但是和却不可以在求得中位数后再利用原序列直接计算,因为原区间的元素是无序的,我们没办法进行作差求和。联想作差求和的条件,即要明确哪些数是比中位数大,哪些数比中位数小,而划分树恰好左子树的元素总是比右子树小,于是如果中位数在左子树中,我们自然可以将右子树中[l,r]区间内的数与中位数的差先求出来,如果中位数在右子树中,我们就可以先将左子树中[l,r]区间内的数与中位数的差先求出来,求和的过程可以在求得中位数的具体值后回 阅读全文
posted @ 2012-03-14 22:02 Staginner 阅读(316) 评论(0) 推荐(0) 编辑
摘要: POJ_2104 上课之前大概看了一下划分树,后来上课的时候自己YY了一个“划分树”,结果发现每次查询复杂度不是logn的,大约是logn*logn的,写出来之后一交好像跟归并树的复杂度差不多,也就这个就是归并树吧…… 今天不早了,就先睡了,等明天起来之后再仔细研究一下划分树怎么写吧。View Code #include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXD 400010#define MAXM 2000010int N, M, a[MAXD], x[MAXM], p, left[M 阅读全文
posted @ 2012-03-14 00:30 Staginner 阅读(250) 评论(0) 推荐(0) 编辑
  2012年3月13日
摘要: HDU_3480 首先,一个贪心的思路就是如果将元素排个序,选择的一定是连续的区间,因为如果选了两个值,那么这个区间就可以选两个值之间的任何一个值,这样是不会改变这个区间的cost的。 如果用w[i][j]表示(a[j]-a[i])*(a[j]-a[i]),写出状态转移方程后会得到f[i][j]=min{f[i-1][k-1]+w[k,j]},这个和POJ_1160的状态转移方程是一样的,如果我们能够证明w为凸,那么这个题就可以用四边形不等式优化。 由于w[i+1][j]-w[i][j]=(a[i]-a[i+1])*(2*a[j]-a[i+1]-a[i]),这个表达式是随着j的增加单调递减.. 阅读全文
posted @ 2012-03-13 19:04 Staginner 阅读(709) 评论(0) 推荐(0) 编辑
摘要: HDU_3506 由于是环,所以可以先把序列copy一份,然后写出状态转移方程f[i][j]=min{f[i][k-1]+f[k][j]}+w[i][j],其中w为i到j的time和,这个和黑书上讲四边形不等式时候的状态转移方程是一样的,因而只要证明出w为凸即可。而因为w[i][j]+w[i+1][j+1]==w[i][j+1]+w[i+1][j],所以w为凸,这时就可以放心地用四边形不等式优化dp了。#include<stdio.h>#include<string.h>#define MAXD 2010#define INF 0x3f3f3f3fint N, f[MA 阅读全文
posted @ 2012-03-13 16:40 Staginner 阅读(311) 评论(0) 推荐(0) 编辑
摘要: HDU_2829 设w[i][j]表示i到j的value,那么可以得到f[i][j]=min{f[i-1][k-1]+w[k][j]}(i<k<=j),如果直接dp的话是O(M*N^2)的复杂度。 然而这个状态转移方程和POJ_1160的状态转移方程是一样的,因而只要我们能够证明w为凸的话,就可以证明f[i][j]为凸,那么就可以用四边形不等式进行优化了。 要证w为凸,只要证w[i][j]+w[i+1][j+1]<=w[i][j+1]+w[i+1][j]即可,也就是证明w[i+1][j]-w[i][j]是关于j单调递减的。又因为w[i][j]=w[i+1][j]+(A[j]- 阅读全文
posted @ 2012-03-13 16:04 Staginner 阅读(342) 评论(0) 推荐(0) 编辑
  2012年3月12日
摘要: POJ_1160 我们可以用f[i][j]表示建好i个邮局时覆盖到第j个村庄的最优解,那么就可以得到f[i][j]=min{f[i-1][k]+w[k+1][j]}(k<j),其中w[x][y]表示建一个邮局覆盖x到y的村庄的距离和,w[x][y]可以事先预处理出来。 这个题目还可以用四边形不等式去优化,实际上四边形不等式优化难点不在于应用,只是在K[i][j-1]<=k<=K[i+1][j]中去选择更新f[i][j]的k即可,比较复杂的部分就在于对k可以这样选择做出证明。 一般四边形不等式的证明步骤如下: ①证明w为凸,这一步用黑书上的定理w为凸当且仅当w[i][j]+w[ 阅读全文
posted @ 2012-03-12 15:56 Staginner 阅读(3989) 评论(0) 推荐(0) 编辑
摘要: HDU_3045 这个题目如果一开始把各个值排序之后的话,就和POJ_3709那个题目基本一样了,只不过看discuss上说这个题目一开始读数据的时候就要用long long int。 剩下的工作就是和POJ_3709一样了,用斜率优化+单调队列的dp去做。#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXD 400010long long int a[MAXD], f[MAXD], A[MAXD];int N, K, q[MAXD];int cmp(const void *_p, 阅读全文
posted @ 2012-03-12 12:37 Staginner 阅读(375) 评论(0) 推荐(0) 编辑
摘要: POJ_1180 不妨设T[i]表示T1+T2+…+Ti,F[i]表示F1+F2+…+Fi,如果根据题目中的计算公式来算的话,就会得到f[i]=min{f[j]+(out[j]+S+T[i]-T[j])*(F[i]-F[j])},其中out[j]表示执行完j所在的batch的时间,这时我们就会发现状态转移方程中有两个变量f[j]、out[j],这样是没办法进行一维dp的。 然而我们换一个角度写dp方程,先将F[i]改成Fi+F(i+1)+…+Fn,这时可以得到另一种形式的状态转移方程f[i]=min{f[j]+(S+T[i]-T[j])*F[j+1]},也就是说执行batch j的花费看成不. 阅读全文
posted @ 2012-03-12 00:36 Staginner 阅读(340) 评论(0) 推荐(0) 编辑
  2012年3月11日
摘要: HNOI 2008 玩具装箱toy 这是我做的第二个斜率优化+单调队列的dp了,做完这个题的感觉就是,如果一个dp可以用斜率优化的话,那么由动态转移方程就必须能推得下面的不等式: 设j<k且在更新i时k比j优,那么可以得到不等式f(i)>g(j,k),其中f(i)是关于i的单调递增函数。#include<stdio.h>#include<string.h>#define MAXD 50010int a[MAXD], q[MAXD], N, L;long long int f[MAXD], A[MAXD];void init(){ int i, j, k; A 阅读全文
posted @ 2012-03-11 22:43 Staginner 阅读(984) 评论(0) 推荐(0) 编辑
摘要: POJ_3709 这个是我第一次做斜率优化的题目,下面的题解没有涉及基本的思路,只是谈了一些自己的感悟。 个人感觉斜率优化+单调队列最重要的就是维护了一个队列,且对于队首连续的3个元素x,y,z(x<y<z),在任意时刻都不会出现x比y优同时z比x和y都优的情况,下面证明一下为什么有这个特性。 由于斜率优化+单调队列维护队尾的时候,对于队尾出连续的3个元素i,j,k(i<j<k),如果任意时刻j都不会比i和k更优,那么就会直接把y丢掉。所以,如果此时y在队列中,那么y就一定在某个时刻(也许这个时刻并不会是整数)比x和z更优。同时,过了这个时刻之后,y一定会比x优(这一点 阅读全文
posted @ 2012-03-11 18:56 Staginner 阅读(621) 评论(0) 推荐(0) 编辑
上一页 1 ··· 33 34 35 36 37 38 39 40 41 ··· 85 下一页