上一页 1 2 3 4 5 6 7 ··· 15 下一页
摘要: 【题意概述】 求一个序列的最长下降子序列的长度及其方案数,若两个子序列的数字是相同的但选取的位置不同,则只算一个。 【题解】 Dp,设f[i]为第i个位置为结尾的最长下降子序列的长度,g[i]为第i个位置为结尾的最长下降子序列的方案数。 g[i]=max(sigma g[j], 1) (j<i, f 阅读全文
posted @ 2018-10-16 20:10 Driver_Lao 阅读(185) 评论(0) 推荐(0) 编辑
摘要: 【题解】 单调队列或者Two Pointers. 阅读全文
posted @ 2018-10-16 15:25 Driver_Lao 阅读(169) 评论(0) 推荐(0) 编辑
摘要: 【题解】 期望题。设f[i]为到第i位的期望得分,g[i]为到第i位的期望combo. 若s[i]为o,f[i]=f[i-1]+2*g[i-1]+1(也就是f[i]-f[i-1]=(g[i-1]+1)^2-g[i-1]^2), g[i]=g[i-1]+1; 若s[i]为x,f[i]=f[i-1], 阅读全文
posted @ 2018-10-16 10:55 Driver_Lao 阅读(263) 评论(0) 推荐(0) 编辑
摘要: 【题解】 取个对数然后二分即可。对于一个数x,x^x的位数就是(int)(lg(x)*x+1). 阅读全文
posted @ 2018-10-16 07:02 Driver_Lao 阅读(189) 评论(0) 推荐(0) 编辑
摘要: 【题解】 就是基环外向树森林找环,然后从环向外统计size就可以了。 阅读全文
posted @ 2018-10-16 06:44 Driver_Lao 阅读(206) 评论(0) 推荐(0) 编辑
摘要: 【题解】 我们可以发现不在最小生成树上的边一定不能多次经过,因为一条不在最小生成树上的边(u,v)的边权比最小生成树上(u,v)之间的路径更长,选择不在最小生成树上的边一定不划算。 我们还需要确定最小生成树上哪些边需要经过两次。我们发现如果某个点当前的度为奇数,这个点到它的父亲的边要经过两次,所以我 阅读全文
posted @ 2018-10-16 06:39 Driver_Lao 阅读(151) 评论(0) 推荐(0) 编辑
摘要: 【题解】 本题有多种做法,例如可持久化并查集、kruskal重构树等。 kruskal重构树的做法是这样的:先把边按照海拔h从大到小的顺序排序,然后跑kruskal建立海拔的最大生成树,顺便建kruskal重构树。 这样建出来的重构树是一个小根堆,也就是说,如果某个节点没有被淹,它的子树内的点都不会 阅读全文
posted @ 2018-10-15 07:56 Driver_Lao 阅读(188) 评论(0) 推荐(0) 编辑
摘要: 【题解】 考虑Dp. 设f[i][j]表示当前在第i个垃圾,高度为j,最多可以存活到什么时候。转移方程就是f[i][j]=max(f[i-1][j-h[i]], f[i-1][j]+a[i]) 其中h[i]表示第i个垃圾能增加的高度,a[i]表示第i个垃圾能延长的存活时间,且能转移的条件是之前的f大 阅读全文
posted @ 2018-10-14 16:10 Driver_Lao 阅读(172) 评论(0) 推荐(0) 编辑
摘要: 【题解】 DP题,我们用f[i][j]表示有n个节点、高度小于等于j的二叉树的个数。f[i][j]=sigma(f[t][j-1]*f[i-t-1][j-1]) t是1~i-1范围内的奇数。 阅读全文
posted @ 2018-10-14 15:36 Driver_Lao 阅读(185) 评论(0) 推荐(0) 编辑
摘要: 【题解】 状压DP. f[i]表示现在的点是否连接的状态是i. 阅读全文
posted @ 2018-10-09 21:33 Driver_Lao 阅读(208) 评论(0) 推荐(0) 编辑
摘要: 【题解】 我们把智商ai当成重量,把情商bi当成价值,可以把这道题转化为一道经典的01背包问题。 f[i]=max(f[i],f[i-a[i]]+b[i]). 但是转化后与原来的01背包有一些不同: 转移必须支持负数,所以我们把f的下标平移400000个单位,全部变成正数。 有些代价为负数,这时我们 阅读全文
posted @ 2018-10-09 20:15 Driver_Lao 阅读(145) 评论(0) 推荐(0) 编辑
摘要: 【题解】 我们设总共有m个二进制位出现过1,那么如果n-k≥m,显然所有的1都可以出现,那么答案就是把所有的数或起来。 如果n-k<m,那么因为k不超过100,ai不超过1e5,所以n不超过117,直接n*1e5的Dp即可。 Dp的方式也是多种多样,如果设f[i][j]表示前i个数字或出j最少需要几 阅读全文
posted @ 2018-10-09 17:05 Driver_Lao 阅读(231) 评论(0) 推荐(0) 编辑
摘要: 【题意概述】 修改图中任一一条边的边权,使其加倍,问怎样使修改后图中的1~n的最短路最大。输出最短路的增量。 【题解】 先跑一遍dijkstra求出1~n的路径长度,记录下经过的边。枚举这些边进行修改,再跑dijkstra求出某条边修改后的最短路径的长度。 阅读全文
posted @ 2018-10-07 15:03 Driver_Lao 阅读(220) 评论(0) 推荐(0) 编辑
摘要: 【题解】 每个格子可以到达的区域是一个菱形,但是我们并不能快速的求和,所以我们可以把原来的草地旋转45度,用二维前缀和快速处理菱形的区域的和。 阅读全文
posted @ 2018-10-06 09:58 Driver_Lao 阅读(273) 评论(0) 推荐(0) 编辑
摘要: 【题解】 贪心。 把区间按照右端点从小到大排序,右端点相同的按照长度从小到大排序,然后按顺序考虑,能放就放下去。 维护能不能放下去用线段树即可。 阅读全文
posted @ 2018-10-06 08:27 Driver_Lao 阅读(148) 评论(0) 推荐(0) 编辑
摘要: 【题解】 非常显然的DP,f[i]表示到第i个位置最多分成几组,f[i]=Max(f[i],f[j]+1) (j<i,sum[j]<=sum[i]) 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define LL l 阅读全文
posted @ 2018-10-04 10:20 Driver_Lao 阅读(205) 评论(0) 推荐(0) 编辑
摘要: 【题解】 求一个序列的LIS有一个二分做法是这样的:f[i]表示长度为i的上升序列中最后一个数最小可以是多少,每次二分大于等于当前数字x的f[j],把f[j]修改为x;如果找不到这样的f[j],那就把长度加一并记录新的f(即f[++len]=x) 现在我们把这个做法放到树上,同样是可以做的。我们用s 阅读全文
posted @ 2018-09-27 16:57 Driver_Lao 阅读(145) 评论(0) 推荐(0) 编辑
摘要: 【题解】 很容易想到这是一个DP,f[i][j][k][l]表示4种卡片分别用了多少张,那么转移方程就是f[i][j][k][l]=Max(f[i-1][j][k][l],f[i][j-1][k][l],f[i][j][k-1][l],f[i][j][k][l-1])+a[i+j*2+k*3+l*4 阅读全文
posted @ 2018-09-17 20:17 Driver_Lao 阅读(231) 评论(0) 推荐(0) 编辑
摘要: 【题解】 枚举n的各个因数作为段长,O(n)判断每一段内是否有山峰即可。 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<cmath> 5 #define LL long long 6 #define r 阅读全文
posted @ 2018-09-16 20:07 Driver_Lao 阅读(204) 评论(0) 推荐(0) 编辑
摘要: 【题解】 很显然在一条坐标轴上到各个点距离之和最小的点就是它们的中位数。怎么证明呢?我们假设现在找的某个点x左边有a个点,右边有b个点(a>b)。我们把x向左移动d个单位,并保证x左边依然有a个点,右边依然有b个点,那么现在距离之和减小了ad-bd. 那也就是说,x左右的点数不一样,我们可以通过移动 阅读全文
posted @ 2018-09-16 18:16 Driver_Lao 阅读(201) 评论(0) 推荐(0) 编辑
上一页 1 2 3 4 5 6 7 ··· 15 下一页