上一页 1 ··· 10 11 12 13 14 15 16 17 18 ··· 23 下一页
摘要: 题目给一棵边带权的树,统计路径长度<=k的点对数。 楼教主男人八题之一,分治算法在树上的应用。 一开始看论文看不懂,以为重心和距离那些是一遍预处理得来的。。感觉上不敢想每棵子树都求一遍重心和距离——那样时间复杂度怎么会只有O(nlogn)? 后来想通了,真的是对于每颗子树都把其所有结点单独提取出来, 阅读全文
posted @ 2016-03-01 09:58 WABoss 阅读(421) 评论(0) 推荐(0) 编辑
摘要: 神奇的莫队算法,用来解决可离线无修改的区间查询问题: 首先对原序列进行分块,√n块每块√n个; 然后对所有查询的区间[l,r]进行排序,首先按l所在的块序号升序排序,如果一样就按r升序排序; 最后就按顺序一个一个求出各个查询的结果:知道[l,r]的答案,并且在此基础上能在比较快地在O(x)得到相邻区 阅读全文
posted @ 2016-02-29 10:41 WABoss 阅读(918) 评论(0) 推荐(0) 编辑
摘要: 题目给一个由几个相连接的矩形组成的多边形,计算多边形包含的最大的矩形的面积。 要求的矩形的高一定是某一个用来组合的矩形的高;如果枚举每个矩形作为高的话,那样长就是这个矩形能向左向右继续延伸矩形的长度了。 所以这题本质也是用单调栈在O(n)计算出每个数作为最小数向左和向右能延伸的最长距离。 1 #in 阅读全文
posted @ 2016-02-28 19:55 WABoss 阅读(926) 评论(0) 推荐(1) 编辑
摘要: 题意:给一个非负整数序列,求哪一段区间的权值最大,区间的权值=区间所有数的和×区间最小的数。 用单调非递减栈在O(n)计算出序列每个数作为最小值能向左和向右延伸到的位置,然后O(n)枚举每个数利用前缀和O(1)计算出以这个数为最小值能得到的最大的区间权。 以前写的单调栈,三个if分支,写得繁繁杂杂的 阅读全文
posted @ 2016-02-28 19:14 WABoss 阅读(230) 评论(0) 推荐(0) 编辑
摘要: 题意:给n个字符串,求最长的子串,满足它或它的逆置出现在所有的n个字符串中。 把n个字符串及其它们的逆置拼接,中间用不同字符隔开,并记录suffix(i)是属于哪个字符串的; 跑后缀数组计算height; 二分答案,height分组,看组里面是否都包含了n个字符串的后缀; 注意n=1的情况。。 1 阅读全文
posted @ 2016-02-28 16:34 WABoss 阅读(238) 评论(0) 推荐(2) 编辑
摘要: 题意:有n个国家,贿赂它们都需要一定的代价,一个国家被贿赂了从属这个国家的国家也相当于被贿赂了,问贿赂至少k个国家的最少代价。 这些国家的从属关系形成一个森林,加个超级根连接,就是一棵树了,考虑用DP: dp[u][m]表示以u国家为根的子树贿赂m个国家的最少代价 单单这样的话转移是指数级的,其实这 阅读全文
posted @ 2016-02-28 15:22 WABoss 阅读(256) 评论(0) 推荐(0) 编辑
摘要: 给n个字符串,求最长的多于n/2个字符串的公共子串。 依然是二分判定+height分组。 把这n个字符串连接,中间用不同字符隔开,跑后缀数组计算出height; 二分要求的子串长度,判断是否满足:height分组,统计一个组不同的字符串个数是否大于n/2; 最后输出方案,根据二分得出的子串长度的结果 阅读全文
posted @ 2016-02-27 19:03 WABoss 阅读(317) 评论(0) 推荐(0) 编辑
摘要: 给一张有向无环图,边都有花费,从某点到某点走的那条路径上的那一条花费最多的边可以省掉,问从起点到终点的最少花费的多少, 往DP想的话,就可以写出这个状态dp[u][mx],表示到达u点已经省掉的花费为mx的最少花费。 用SPFA更新转移方程。。或者理解成队列+我为人人的转移。。其实这题这样子也能解有 阅读全文
posted @ 2016-02-27 17:00 WABoss 阅读(235) 评论(0) 推荐(0) 编辑
摘要: 给一个括号序列,求有几个括号是匹配的。 dp[i][j]表示序列[i,j]的匹配数 dp[i][j]=dp[i+1][j-1]+2(括号i和括号j匹配) dp[i][j]=max(dp[i][k]+dp[k+1][j])(i<=k<j) 1 #include<cstdio> 2 #include<c 阅读全文
posted @ 2016-02-24 21:14 WABoss 阅读(202) 评论(0) 推荐(0) 编辑
摘要: 树的重心即树上某结点,删除该结点后形成的森林中包含结点最多的树的结点数最少。 一个DFS就OK了。。 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 #define MAXN 阅读全文
posted @ 2016-02-23 21:21 WABoss 阅读(182) 评论(0) 推荐(0) 编辑
摘要: 求两个字符串的最长公共子串。 拼接两个字符串中间用特殊字符隔开,max(height[i])(2<=i<=len,suffix(sa[i])与suffix(sa[i-1])分别属于两个字符串的后缀)就是答案! 1 #include<cstdio> 2 #include<cstring> 3 #inc 阅读全文
posted @ 2016-02-22 20:52 WABoss 阅读(187) 评论(0) 推荐(0) 编辑
摘要: 求一个串的最大回文字串。 可以用后缀数组解决。 分别考虑奇数和偶数回文子串的情况,枚举原串S的每个位置i作为中间位置看其能向左右两边同时拓展都哪儿:把原串S反转成S',拼接SaS'(a为一个特殊字符),最远拓展的地方便可以通过LCP(suffix[i],suffix[i'])求得,i'为i对应在S‘ 阅读全文
posted @ 2016-02-21 10:40 WABoss 阅读(186) 评论(0) 推荐(0) 编辑
摘要: 给一个字符串求有多少个不相同子串。 每一个子串一定都是某一个后缀的前缀。由此可以推断出总共有(1+n)*n/2个子串,那么下面的任务就是找这些子串中重复的子串。 在后缀数组中后缀都是排完序的,从sa[1]到sa[n],这么思考以某个串为前缀的子串有几个,那么容易想到重复子串的个数其实就是∑heigh 阅读全文
posted @ 2016-02-20 16:16 WABoss 阅读(233) 评论(0) 推荐(0) 编辑
摘要: 题目求最长的重复k次可重叠子串。 与POJ1743同理。 二分枚举ans判定是否成立 height分组,如果大于等于ans的组里的个数大于等于k-1,这个ans就可行 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 usi 阅读全文
posted @ 2016-02-19 15:38 WABoss 阅读(224) 评论(0) 推荐(0) 编辑
摘要: 题目大概是给n个数组成的串,求是否有多个“相似”且不重叠的子串的长度大于等于5,两个子串相似当且仅当长度相等且每一位的数字差都相等。 这题是传说中楼教主男人八题之一,虽然已经是用后缀数组解决不可重叠最长重复子串的经典题了。。但其实没那么简单,题目数据不强,网上一些代码都是不正确的。 首先把问题转化成 阅读全文
posted @ 2016-02-18 20:44 WABoss 阅读(3242) 评论(0) 推荐(13) 编辑
上一页 1 ··· 10 11 12 13 14 15 16 17 18 ··· 23 下一页