上一页 1 ··· 5 6 7 8 9 10 11 12 13 ··· 25 下一页

bzoj 1261 区间DP

摘要: 首先我们知道ans=Σ(h[i]*f[i])=Σ(h[i]*d[i])/s=Σ(k(r[i]+1)+c)*d[i]/s=Σ(k*r[i]+(k+c))*d[i]/s 我们可以发现,除了k*r[i]之外,剩下的都是常数,那么我们这道题就转化成了求k*r[i]的最小值,那么区间dp就可以了,对于区间i,j,每次选取一个k为根,由左右两个区间转移过来,相当于将左右子树所有的深度+1,那么增加的代价就为两区间和,这样转移就可以了。 对于第二问我们可以在转移的时候记录每个区间的最优决策点,也即选取的根,那么最后递归生成遍历就行了,但是bz上没有第二问,不用输出。 反思:带错数据,将自己造的一组... 阅读全文
posted @ 2014-02-19 10:58 BLADEVIL 阅读(270) 评论(0) 推荐(0) 编辑

bzoj 1046 LIS

摘要: 假设我们知道以每个点开始到最后的最长上升序列,设为w[i],这样首先我们在w值中取max,如果询问的值比max大,这样显然就是无解,如果小的话,我们需要求出来字典序最小的方案。 那么对于所有i,我们肯定以w[i]大于询问的值中的最小的i开始,那么假设上升序列中第一个值为i,第二个值为j,那么w[j]满足大于询问的值-1,且初始序列a中,a[j]的值要大于a[i],且为最小的j,对于最小的我们只需要通过循环正常的枚举就行了。 那么我们现在剩下的问题就是w[i]值如何求,如果n小一些的话我们就可以n^2正常的做了,但是n为10^4,这样我们就需要维护单调队列que[i],表示长度为i的最长... 阅读全文
posted @ 2014-02-18 21:30 BLADEVIL 阅读(197) 评论(0) 推荐(0) 编辑

bzoj 2440 容斥原理

摘要: 首先根据样例或者自己打表大概可以知道,对于询问k,答案不会超过k#include #include #define maxn 50010 using namespace std; long long mindiv[maxn],prim[maxn],miu[maxn]; void prepare(){ miu[1]=1; for (long long i=2;i>1; //printf("%d %d %d\n",l,r,mid); if (calc(mid)>=n) { ans=mid... 阅读全文
posted @ 2014-02-18 18:09 BLADEVIL 阅读(296) 评论(0) 推荐(0) 编辑

bzoj 2440 dfs序

摘要: 首先我们可以做一遍dfs,用一个队列记录每个点进出的顺序,当每个点访问的时候que[tot++]=x,记为in[x],当结束dfs的时候que[tot++]=x,记为out[x],这样处理出来的队列,如果我们将一个数的进队赋值为1,出队赋值为-1,那么假设我们需要询问1-x的链中共有多少个点,答案就是这个队列前int[x]项,所以我们开始dfs1处理出来in,out数组,然后用树状数组维护这个队列,就行了。 /************************************************************** Problem: 1103 User: B... 阅读全文
posted @ 2014-02-18 15:06 BLADEVIL 阅读(249) 评论(0) 推荐(0) 编辑

bzoj 1588 bst

摘要: 用set存下就好了。/************************************************************** Problem: 1588 User: BLADEVIL Language: C++ Result: Accepted Time:180 ms Memory:1468 kb****************************************************************/ //By BLADEVIL#include #include #define inf 1bt; bt.... 阅读全文
posted @ 2014-02-18 13:59 BLADEVIL 阅读(255) 评论(0) 推荐(0) 编辑

bzoj 1050 并查集

摘要: 先按边长排序,假设s与t连通,那么我们可以枚举s与t的路径中最短的一条边,通过类似与kruskal的方法找到s与t的路径在当前最小边权情况下尽量小的最大边权,用这个比值更新答案。 特别的,我们对于某一情况,如果循环完边之后s与t不连通可以跳出。在确定了最小边找完最大边的时候,不必要继续枚举最小边+1,可以从最大边开始向前加边,找到最大的边保证s,t连通,且最大边为刚才求得的,更新答案,从这个边继续枚举。这两个为优化。 反思:判断更新答案的时候手残打错,找了快一个小时才找到错。 /*****************************************************... 阅读全文
posted @ 2014-02-17 20:26 BLADEVIL 阅读(374) 评论(0) 推荐(0) 编辑

bzoj 2730 割点

摘要: 首先我们知道,对于这张图,我们可以枚举坍塌的是哪个点,对于每个坍塌的点,最多可以将图分成若干个不连通的块,这样每个块我们可能需要一个出口才能满足题目的要求,枚举每个坍塌的点显然是没有意义的,我们只需要每个图的若干个割点,这样除去割点的图有若干个块,我们可以求出只与一个割点相连的块,这些块必须要一个出口才能满足题目的要求,每个块内有块内个数种选法,然后将所有满足一个割点相连的块的点数连乘就行了。 对于每个与一个割点相连的块必须建出口可以换一种方式理解,我们将每个块看做一个点,那么算上割点之后,这张图就变成了一颗树,只有叶子节点我们需要建立出口,因为对于非叶子节点我们不论断掉哪个点我们都有另... 阅读全文
posted @ 2014-02-17 17:34 BLADEVIL 阅读(519) 评论(0) 推荐(0) 编辑

bzoj 2321 数学

摘要: 首先我们假设两个点(i,j),(i,k)向中间移动一格,且k>j+1,那么我们可以获得的价值为k-j,这样,我们定义每个点的每个星的能量为a[(i,j)]=i*i+j*j,这样这两个点开始的能量为i*i+j*j+i*i+k*k,移动之后,两个点变为(i,j+1),(i,k-1),这时的能量为i*i+(j+1)*(j+1)+i*i+(k-1),这时的能量差为2*k-2*j,为获得价值的2倍,因为对于所有的价值获得都可以采用这样的方法,所以我们可以算出开始局面的能量和,结束局面的能量和,相减>>1就是答案。 反思:显然没有发现这个优美的性质。/****************** 阅读全文
posted @ 2014-02-17 11:37 BLADEVIL 阅读(232) 评论(0) 推荐(0) 编辑

bzoj 1088 DP

摘要: 我们可以用w[i][s]来表示到第i位的方案,s代表第i位和第i+1位是否有雷的二进制串,那么我们就可以根据每一位的雷的数量转移了。/************************************************************** Problem: 1088 User: BLADEVIL Language: C++ Result: Accepted Time:20 ms Memory:1588 kb****************************************************************/... 阅读全文
posted @ 2014-02-17 10:24 BLADEVIL 阅读(234) 评论(0) 推荐(0) 编辑

bzoj 1096 斜率优化DP

摘要: 首先比较容易的看出来是DP,w[i]为前i个工厂的最小费用,那么w[i]=min(w[j-1]+cost(j,i))+c[i],但是这样是不work的,复杂度上明显过不去,这样我们考虑优化DP。 设A[i]=Σp[j](0k且决策j优于决策k。 那么有w[j-1]-x[i]*A[j-1]+B[j-1]#define maxn 1000010#define LL long long using namespace std; int n;LL a[maxn],c[maxn],x[maxn],que[maxn];LL A[maxn],B[maxn],w[maxn]; double k(int... 阅读全文
posted @ 2014-02-17 08:22 BLADEVIL 阅读(341) 评论(0) 推荐(0) 编辑
上一页 1 ··· 5 6 7 8 9 10 11 12 13 ··· 25 下一页