摘要: 题目大意 有一串长度为 n(1≤n≤50000) 的项链,项链上每块石头都有一个价值,在计算项链上一段连续石头的价值和的时候,相同价值的只计算一次 现在给你 m(1≤m≤200000) 个询问,每个询问要查询一段连续石头 [L, R] (1≤L≤R≤n)的价值和 做法分析 先把所有的查询保存,然后按 阅读全文
posted @ 2013-04-25 13:05 jianzhang.zj 阅读(239) 评论(0) 推荐(0) 编辑
摘要: 题目大意给了一个 n(1≤n≤500) 个点的有向完全图,以及邻接矩阵,现在每次删掉一个点,并问删掉这个点之后,总共删 n 次。没删掉一个点,都要求出剩余图中,所有顶点之间的最短路的和是多少,并输出做法分析倒着做,一个一个的加点,充分运用 Floyd 的动态规划意义当然了,离不了 map 来哈希一下比赛的时候算错数据范围,结果超 int 挂 ST 了,悲剧那几天一直状态不好,跌到 div2 后迟迟不能涨回去,每场 div2 的比赛,在ST之前都是房间第一,可就是要挂 ST,总结原因,总是有些小细节没处理好,竟然没人 cha,太不科学了参考代码B. Greg and Graph 1 #inclu 阅读全文
posted @ 2013-04-24 19:46 jianzhang.zj 阅读(306) 评论(0) 推荐(0) 编辑
摘要: 题目大意 给一个 0~n-1 的排列(n≤5000),可以把这个排列的前 m(0≤m≤n-1) 个数移到排列的最后:如下面的例子所示 a1, a2, ..., an-1, an a1, a2, ..., an-1, an a3, a4, ..., an, a1, a2 ... an, a1, a2, 阅读全文
posted @ 2013-04-24 19:15 jianzhang.zj 阅读(180) 评论(0) 推荐(0) 编辑
摘要: 题目大意给了 n(2<=n<=105) 个点,从每个点 u 出发连向了一个点 v(共 n 条边)现在要求添加最少的边使得整个图是一个强连通图做法分析这道题千万不要一般化:先求强连通分量再把图化为 DAG 来做(我们能够很方便的得到需要添加的边的数量,但是加哪些边会变得很麻烦)注意一个细节:每个点的出度必为 1有什么特点? 从一个点 u 出发 DFS 遍历所有能够遍历到的点,DFS 结束的时候必定得到一个环!而且,因为每个点的出度为 1,所有遍历到的点只能形成一个环!而且这个环还是在路径的结尾,如果把这个换缩成一个点,那么我们等够得到的是一个“倒着长”的树(只存在从叶子节点到树根的节 阅读全文
posted @ 2013-04-21 21:49 jianzhang.zj 阅读(373) 评论(0) 推荐(0) 编辑
摘要: 题目大意在 x 轴上,有 n(1<=n<=1000) 个线段,用最少的钉子把所有的线段钉住,输出这些钉子的坐标做法分析贪心先把所有的线段按照起点由小到大排序,起点相同的按照终点由大到小排序然后直接线性的扫一遍:不断的缩小钉子所在的区间,知道添加一条线段后,钉子所在的区间消失为止,然后,前面的所有的线段用一个钉子钉住,再接着往下扫,直到扫完了所有的线段参考代码D. Segments 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <vector 阅读全文
posted @ 2013-04-21 20:14 jianzhang.zj 阅读(177) 评论(0) 推荐(0) 编辑
摘要: 题目大意给了 n 个节点以及一个特殊的顶点 v(3<=n<=105),让你用 m(0<=m<=105) 条边建一个无向图,使得这个图以 v 为它的一个割点做法分析无向图中,一个割点同时属于两个点双连通分量我们可以这样做,假设割点的一边是连通的(不一定是双连通),里面点的个数设为 x(不包括割点 v),割点的另一边也是连通的,里面点的个数肯定是 n-x-1(不包括割点)那么,两边中,边的总数最多是 C2x+1+C2n-x=x2+(1-n)*x+(n2-n)/2注意:这是一个凹函数,对称轴是 x=(n-1)/2,且 x 的取值范围是 [1, n-2] 中的整数,要使函数取最 阅读全文
posted @ 2013-04-21 20:03 jianzhang.zj 阅读(197) 评论(0) 推荐(0) 编辑
摘要: 题目大意给了一个无向图,n(2<=n<=1000) 个节点 n-1 条边,每天拆一条边并新建一条边,最终使得所有的顶点连通(其实形成一棵树)问:最少需要几天,并且输出每天拆掉的边和新建的边做法分析首先,我们可以把每条边存下来,然后利用 DFS,遍历所有的顶点一遍,遍历的过程中,经过的边就是树边(也就是所有的不拆掉的边),剩下的所有边统统要拆掉利用并查集,把每个连通块用一个点代表,并统计这个连通快中需要删掉的边的个数(DFS过程中没有遍历到的边的个数)这里,我们需要注意到这样一个性质:只有 n-1 条边,那么,图中肯定存在一个联通快,它是一棵树或者一个孤立的节点最少需要的天数肯定是不 阅读全文
posted @ 2013-04-21 19:34 jianzhang.zj 阅读(237) 评论(0) 推荐(0) 编辑
摘要: 题目大意给了一个 n(2<=n<=300) 个节点的无向图,告诉了每两个节点之间的最短距离,现在要新建 K(1<=K<=300) 条边要求:每建一条边,输出任意两个点之间最短的距离的和做法分析首先,如果直接暴力的话肯定 T(因为是 o(n4) 的时间复杂度)我们需要注意的是,每次只是新建一条边令 g[i][j] 表示顶点 i 和顶点 j 之间的最短距离假设新建的边是 a---b 边权为 c如果 g[a][b]<=c 那么,新建的边不会用来更新多有顶点之间的最短距离,这时候直接统计最短距离和输出就行,下面讨论 g[a][b]>c 的情况 首先 g[a][b]= 阅读全文
posted @ 2013-04-21 19:17 jianzhang.zj 阅读(184) 评论(0) 推荐(0) 编辑
摘要: 题目大意 给了 n(n<=10^4) 个单词,每个单词只包含 'a'~'z',长度不超过 50。 最后给出一个字符串,长度不超过 10^6 问的是:这个字符串中,包含几个单词? 做法分析 先把所有的单词建成一颗字典树,然后求 fail 指针,做成自动机 最后,对读入的字符串进行匹配,注意,如果这个单 阅读全文
posted @ 2013-04-17 12:48 jianzhang.zj 阅读(305) 评论(0) 推荐(0) 编辑
摘要: 题目大意 给了很多单词,现在要统计以某个字符串为前缀的单词的数量 做法分析 直接建字典树,初始化出每个节点被覆盖的次数,然后对于每一个字符串,直接统计即可 参考代码 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 5 阅读全文
posted @ 2013-04-15 11:19 jianzhang.zj 阅读(282) 评论(0) 推荐(0) 编辑
摘要: 题目大意 给了 P(1<=P<=10000) 件商品的名字(名字长度不超过20),现在有 Q(1<=Q<=100000) 个查询,每个询问是询问一个字符串,问的是所有的商品名字中,包含这个字串的名字的数量 做法分析 做法比较裸,先把所有的商品名字以及这些名字的后缀建立一棵字典树,利用后缀的思想 那么 阅读全文
posted @ 2013-04-15 11:13 jianzhang.zj 阅读(320) 评论(0) 推荐(0) 编辑
摘要: 题目大意 字典中,一个单词是一个 hat's word:这个单词可以由字典中另外两个单词拼接而成 给你一个字典,求出字典中所有的 hat's word 单词最多有 50000 个 做法分析 看到这道题,感觉无从下手,单词的数量这么多,但是仔细一想,单词数是多了,但是如果每个单词的平均长度必然就小了, 阅读全文
posted @ 2013-04-15 10:39 jianzhang.zj 阅读(270) 评论(0) 推荐(0) 编辑
摘要: 题目大意 贴海报。每张海报的高度都是一样的,唯独宽度不一样。每张海报只能占用整数倍的单位线段长度,贴了 n(n<=10000) 张海报之后,有几张能够看见(有一个角能看见这张海报也算被看见了)?海报的宽度最大可以达到 10^7 做法分析 一看就是线段树 先不考虑线段的长度能够达到 10^7 肯定是给 阅读全文
posted @ 2013-03-26 15:57 jianzhang.zj 阅读(710) 评论(0) 推荐(0) 编辑
摘要: 题目大意 给两个32位无符号型整数 n 和 m,保证 m<=n,问,从 m 到 n 中的所有整数中(包括 n 和 m),每个数所包含的 0 的个数的和 例如:1030 有两个 '0' 做法分析 首先转化成求 [0, x] 中所有数中,含有的 0 的个数 那么对于一个数 x,怎么求出从 0 到 x 中 阅读全文
posted @ 2013-03-24 01:18 jianzhang.zj 阅读(1185) 评论(0) 推荐(0) 编辑
摘要: 题目大意 一个公园中有 n 个景点,景点之间通过无向的道路来连接,如果至少两个环公用一条路,路上的游客就会发生冲突;如果一条路不属于任何的环,这条路就没必要修 问,有多少路不必修,有多少路会发生冲突 做法分析 首先,这题不是边双连通的。要求的是点双连通分量。我们知道,每个点双连通分量又叫做块。冲突边 阅读全文
posted @ 2013-03-21 23:11 jianzhang.zj 阅读(1588) 评论(0) 推荐(0) 编辑
摘要: 题目大意 给一个 n 个点 m 条边的无向图,要求在删掉任意一条边之后,图中所有的节点保持连通性,问至少需要添加多少条边? 做法分析 求出边双连通分量,缩点之后,找出树中度为 1 的点的个数 num,添加边肯定是在度为 1 的顶点上添加,这样至少添加的边的个数就为 (num+1)/2; 参考代码 1 阅读全文
posted @ 2013-03-21 22:56 jianzhang.zj 阅读(266) 评论(0) 推荐(0) 编辑
摘要: 题目大意 给了一个有 n(1<=n<=5000) 个点 m(n-1<=m<=10000) 个边的连通的无向图,现在问最少需要添加多少条边才能使得整个图中所有的点对之间至少存在两条没有交集的路径? 有一个坑就是,给的无向图中有可能有重边,但是重边的话只能算一条边 做法分析 根据题意可以知道,这题要求一 阅读全文
posted @ 2013-03-21 22:46 jianzhang.zj 阅读(423) 评论(0) 推荐(0) 编辑
摘要: 零. 前言 本文是在笔者参考 boba5551 在 TopCoder 上的 Algorithm Tutorial 后写的 有关 boba5551 的 Blog 原文,请点击右边的链接:Binary Indexed Trees 一. 树状数组的定义 假设现在有一组数:a[1], a[2], a[3], 阅读全文
posted @ 2013-03-20 22:27 jianzhang.zj 阅读(872) 评论(2) 推荐(1) 编辑
摘要: 题目大意 有 n(1<=n<=10^5) 个连续的 stick,编号从 1 到 n。每根 stick 有一个权值,起初的时候全是 1 有 m(1<=m<=10^5) 个操作,每次操作格式如下: L R val:把第 L 个到第 R 个,每根 stick 的权值变为 val 做法分析 使用线段树标记一 阅读全文
posted @ 2013-03-17 00:49 jianzhang.zj 阅读(190) 评论(0) 推荐(0) 编辑
摘要: 题目大意 给你 n(1<=n<=10^5) 个数,m(1<=m<=10^5) 个询问,每个询问的格式如下 L R H:从第 L 个数到第 R 个数中,小于等于 H 的数有多少个 做法分析 建立划分树 每次 query 的时候,二分答案即可,即二分这个区间中有多少个小于等于 H 的数 参考代码 1 # 阅读全文
posted @ 2013-03-17 00:40 jianzhang.zj 阅读(156) 评论(0) 推荐(0) 编辑
摘要: 题目大意 一个有向图 n(1<=n<=20000) 个点 m(0<=m<=50000) 条边 问至少添加几条边,使得整个图是一个强连通图 做法分析 先缩点,然后找出 DAG 中入度为 0 的点的个数和出度为 0 的点的个数,输出较大者(PS:这是一个结论) 参考代码 1 #include <iost 阅读全文
posted @ 2013-03-17 00:30 jianzhang.zj 阅读(200) 评论(0) 推荐(0) 编辑
摘要: 题目大意 给了一个含有 n(0<n<=50000) 个节点的有向图,图中的两点之间的通信时要付出代价的(经过的边权之和),但是如果这两个点之间相互可达,代价为 0 问,从给定的节点向其他所有的点通信,所花费的最小代价是多少? 做法分析 先对原图缩点,形成一个 DAG,给的那个定点显然是 DAG 中入 阅读全文
posted @ 2013-03-17 00:20 jianzhang.zj 阅读(814) 评论(0) 推荐(0) 编辑
摘要: 题目大意 给了你 n(1<=n<=2*10^5) 个人的插队信息,让你输出最终的队列的排列 做法分析 正向思考的话,这道题就是最简单的模拟了,明显不能这样做 那就逆向思考吧 现在我们知道总共有 n 个人,且最后一个人要排在这 n 个人中的位置是 p[n],我们可以直接把队列的第 p[n] 个位子安排 阅读全文
posted @ 2013-03-16 23:36 jianzhang.zj 阅读(708) 评论(0) 推荐(0) 编辑
摘要: 题目大意 给你一个含有 n(1<=n<=5000) 个节点的有向图,判断图中哪些点事 sink sink 的定义:如果 u 是 sink,所有 u 能够到的点 v,v 也能到 u 做法分析 先缩点,形成的 DAG 中,那些出度为 0 的点就是答案 证明如下(反证法): 令 u 是 DAG 中的一个 阅读全文
posted @ 2013-03-16 23:20 jianzhang.zj 阅读(376) 评论(0) 推荐(0) 编辑
摘要: 题目大意 有 n(2<=n<=100) 所学校,每个学校都有个 list,列出了这个学校提供软件的学校名单。 现在问: A、为了使所有的学校享用到一个软件,最少有多少学校要 copy 一个软件 B、为了使传到任意学校的软件能够传到其他所有的学校,至少要添加多少个学校到相应学校的 list 中去 做法 阅读全文
posted @ 2013-03-16 23:00 jianzhang.zj 阅读(798) 评论(0) 推荐(0) 编辑
摘要: 题目大意 n(1<=n<=10000) 头牛,有 m(1<=m<=50000) 个推举关系。推举关系具有传递性,即 A 推举 B, B 推举 C,那么 A 也推举 C 问你,能够得到所有牛推举的牛有多少头? 做法分析 求强连通分量缩点后反向建图 然后判断图中是否有且仅有一个点的入度为 0,是的话就输 阅读全文
posted @ 2013-03-16 18:14 jianzhang.zj 阅读(342) 评论(0) 推荐(0) 编辑
摘要: 题目大意 一个国王,有 n(1<=n<=2000) 个儿子,在这个国家中有 n 个漂亮的妹子。每个儿子都有自己喜欢的妹子(可以是多个)。每个妹子只能嫁一个人,每个儿子只娶自己喜欢的人 国王的巫师调查到了每个儿子喜欢哪些妹子,并且为每一个儿子分配了他喜欢的妹子让他娶 但是国王不满意,说是要巫师统计出每 阅读全文
posted @ 2013-03-16 18:00 jianzhang.zj 阅读(459) 评论(0) 推荐(0) 编辑
摘要: 题目大意 给你一个 n(0<n<1001) 个节点 m(m<6000) 条边的有向图,对于图中的任意两个节点 u 和 v,问能否从 u 走到 v 或者从 v 走到 u PS:这其实是《算法导论》中讲“强连通分量”的最后一道习题 做法分析 由于强连通分量重的点肯定能够满足题目的要求,所以可以先将图“化 阅读全文
posted @ 2013-03-16 11:33 jianzhang.zj 阅读(789) 评论(0) 推荐(0) 编辑
摘要: 题目大意 给你一个 n(n<=10000) 个节点的图,让你判断这个图是否是一个强连通图 做法分析 直接用 tarjan 算法求强连通分量即可 参考代码 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include 阅读全文
posted @ 2013-03-16 00:32 jianzhang.zj 阅读(271) 评论(0) 推荐(0) 编辑
摘要: 题目大意 有 n(2<=n<=5000) 个人,m(0<m<=30000) 个 support 关系(A support B)。问:哪些人得到的 support 最多。 需要注意的是 support 是可以传递的,比如:A support B && B support C,那么,C 得到的 supp 阅读全文
posted @ 2013-03-15 22:31 jianzhang.zj 阅读(644) 评论(0) 推荐(0) 编辑
摘要: 题目大意 给你 n(1<=n<=10^5) 个数,分别是x(0), x(1), x(2), ..., x(n-1)。再给你 Q(1<=Q<=10^5) 个 query。 每个 query 要求对于编号在区间 [L, R] 中的所有数,找出一个 x,使得 segma{ abs( x(i)-x ) } 阅读全文
posted @ 2013-03-14 11:48 jianzhang.zj 阅读(427) 评论(0) 推荐(0) 编辑
摘要: 题目大意 有 n(1<n<=100) 个山洞,每个山洞中都有一些 bug,每个山洞中都有一定的概率包含一个 brain。所有的山洞形成一棵树 现在给你 m(0<=m<=100) 个士兵,每个士兵都能消灭 20 个 bugs,并占领这个山洞 山洞的入口的编号是 1 问怎么安排士兵占领山洞才能使捕获 b 阅读全文
posted @ 2013-03-09 11:04 jianzhang.zj 阅读(1087) 评论(0) 推荐(0) 编辑
摘要: 题目大意给你平面上 n(2<=n<=400) 个点,要求用这些点组成一个二叉树(每个节点的儿子节点不超过两个),定义每条边的权值为两个点之间的欧几里得距离。求一个权值和最小的二叉树,并输出这个权值点 i 可以成为点 j 的的父亲的条件是:点 i 的 y 坐标比 j 的 y 坐标大!如果不存在这样的二叉树,输出 -1做法分析转换成为最小费用流 1、把每个点 u 拆成两个点 u' 和 u'' 2、增加源点 source 和汇点 sink 3、链接 source 和每个点 u',即 <source, u'> 容量为 2,费用为 0 4、 阅读全文
posted @ 2013-03-08 22:47 jianzhang.zj 阅读(495) 评论(0) 推荐(0) 编辑
摘要: 题目大意给你一组数 a(1),a(2),a(3),...,a(n) (n<=10^5),以及 m(m<=10^5) 个 query,每个 query 的格式为 l(i) r(i),问数组中从 l(i) 到 r(i) 中的数是否是一个 lander(梯子?)一个 lander 的定义是:对于一列数 b(1),b(2),b(3),...,b(k),存在一个数 x(1<=x<=k),使得:b(1)<=b(2)<=b(3)<=...<=b(x)<=b(x+1)<=...<=b(k)做法分析定义两个数组:inc[] 和 dec[] 初始化 阅读全文
posted @ 2013-03-08 01:25 jianzhang.zj 阅读(296) 评论(0) 推荐(0) 编辑