摘要: 题目要求求出图中的一颗生成树,使得最大的边权最小,且满足一级公路的个数>=k。 考虑二分最大边,问题就变为给出的图的生成树中,是否满足所有的边<=val,且一级公路的个数>=k。 所以我们把边按一级公路权值排序,优先选择能构成生成树的一级公路。这样贪心的构造。 # include <cstdio> 阅读全文
posted @ 2017-03-13 14:04 free-loop 阅读(176) 评论(0) 推荐(0) 编辑
摘要: 把题目作为s集,锦囊作为t集。把每个题目和它可以用的锦囊连边,这样就构成了一个二分图,求出这个二分图最大匹配。 但是这个最大匹配有限制条件,就是对于每个可能的匹配集,如果s集的i点有匹配,那么i-1点一定有匹配。 具体实现,只需要将匈牙利算法稍微改动一下,如果当前没有找到增广路的话,就break。 阅读全文
posted @ 2017-03-11 21:25 free-loop 阅读(179) 评论(0) 推荐(0) 编辑
摘要: 题目说可以通过一条边多次,且点权是非负的,所以如果走到图中的一个强连通分量,那么一定可以拿完这个强连通分量上的money。 所以缩点已经很明显了。缩完点之后图就是一个DAG,对于DAG可以用DP来求出到达每一个点的money最大值。具体实现我用的是bfs。 然后如果一个强连通分量内有酒馆,那么这个点 阅读全文
posted @ 2017-03-11 17:59 free-loop 阅读(242) 评论(0) 推荐(0) 编辑
摘要: 题目描述的实际是一颗二叉树,对于每个结点,要么满叉,要么无叉。 对于一种无解的简单情况,我们搜一遍树找到最浅的叶子结点1和最深的叶子结点2,如果dep[1]<dep[2]-1,则显然无解。 所以现在所有的叶子结点的深度要么是dep[1]和dep[2]. 我们可以把所有结点用node[x]标记状态。 阅读全文
posted @ 2017-03-10 16:45 free-loop 阅读(105) 评论(0) 推荐(0) 编辑
摘要: 很容易想到枚举第一步切掉的边,然后再计算能够产生的最大值。 联想到区间DP,令dp[i][l][r]为第一步切掉第i条边后从第i个顶点起区间[l,r]能够生成的最大值是多少。 但是状态不好转移,因为操作的符号不仅有‘+’,还有‘*’,加法的话,父区间的最大值显然可以从子区间的最大值相加得出。 乘法的 阅读全文
posted @ 2017-03-09 18:25 free-loop 阅读(141) 评论(0) 推荐(0) 编辑
摘要: 很普通的DP,设dp[i][j][k]为第i块积木放在第j堆且摆放状态为k的最高高度。方程很容易推出。 # include <cstdio> # include <cstring> # include <cstdlib> # include <iostream> # include <vector> 阅读全文
posted @ 2017-03-09 17:08 free-loop 阅读(161) 评论(0) 推荐(0) 编辑
摘要: 此题实质上是询问每段区间[l,r]内的数字能组成多少段连续的数字。 不大好用线段树合并区间来写。 考虑离线,类似于HH的项链的话,对询问按右端点排序,对于右端点的每一次右移,则对于询问,实际上是求的后缀区间。 如果前面已经出现了a[r]-1的话,那么它们能组成连续的区间,a[r]+1同理。 剩下的模 阅读全文
posted @ 2017-03-09 14:10 free-loop 阅读(136) 评论(0) 推荐(0) 编辑
摘要: 对于树的一个括号序列,树上两点的距离就是在括号序列中两点之间的括号匹配完之后的括号数。。。 由此可以得出线段树的做法。。 #include<cstdio> #include<iostream> #define maxn 100000 #define inf (1<<25) using namespa 阅读全文
posted @ 2017-03-09 13:22 free-loop 阅读(304) 评论(0) 推荐(0) 编辑
摘要: 很明显的区间DP,设dp[l][r]表示[l,r]区间的字符串折叠后的最小长度。 可以通过两种方向转移,dp[l][r]=min(dp[l][i]+dp[i+1][r]). 另一种是折叠,dp[l][r]=min(dp[l][l+k-1]+cal((r-l+1)/k)+2).其中k是能整除(r-l+ 阅读全文
posted @ 2017-03-07 18:19 free-loop 阅读(173) 评论(0) 推荐(0) 编辑
摘要: 首先,长度短的木板一定比长度长的木板容易得到,因此若要得到最多的木板,它们必定是所有木板中最短的——可以对木板排序后二分答案(用k表示)。 判断是否合法就用搜索,但数据有点大,要用到两个剪枝。一个是若有一根木材被切开后剩下的长度比最短的木板还短则将其累加入waste,当waste+前k块木板的长度和 阅读全文
posted @ 2017-03-07 15:27 free-loop 阅读(230) 评论(0) 推荐(0) 编辑