
ACM
文章平均质量分 75
Hewie
这个作者很懒,什么都没留下…
展开
-
pku 1011(dfs)
dfs题目 有点麻烦啊 先写了一次wrong answer了参考了一下discuss错在了这种类型的数据上1021 14 13 11 9 6 4 3 2 1正确的匹配应该是:2114 4 313 6 211 9 1分析了一下应该是 在确定长度为21 是否满足条件时我是这么搜的2114 6 113 4 3 这里无法满足条件后就直原创 2010-04-13 12:07:00 · 485 阅读 · 0 评论 -
pku 1511 Invitation Cards (SPFA 和 dijkstra+优先级队列优化)
<br />简单的最短路题目,只需建两次图,分别调用单源最短路算法即可。<br /> <br />但是由于数据量较大,所以需要用邻接表存储,以及对普通算法进行些优化。<br /> <br />注意最后的求和需要用long long型变量存储<br /> <br />分别用SPFA 和 加了优先级队列的dijkstra写了一遍,效率差不多,用的STL的priority_queue,如果手写堆的话应该可以更快。<br /> <br />SPFA版本:1511Accepted33016K1750MSG++23原创 2010-08-26 16:54:00 · 1067 阅读 · 0 评论 -
AC自动机(Aho-Corasick automaton)
AC自动机,说白了还是一种处理字符串的数据结构。在建立的trie树的基础上,用kmp。 达到快速匹配的目的。一个最简单的应用,就是给定一些单词,然后给定一段文本,求这些单词中有多少个在这段文本中出现过。看到网上一堆都是hdu2222的解题报告,我也结合此题说说自己对AC自动机的理解吧题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2222 就是AC自动机最基本的应用。因为AC自动机是建立在字典树的基础上的,所以首先要建立trie这是节点的结构:struct原创 2010-09-07 10:11:00 · 2285 阅读 · 0 评论 -
pku 2823(单调队列、线段树)
这个题目之前就用线段树做了一遍,今天看了下单调队列。重新写了一遍, 对于此题来说,比线段树快不少。单调队列呢,比如说 一个用来求最大元素的单调队列,那么,这个队列中的元素就是非递增的。这个时候也许就会有疑问,优先级队列也有这个特性。为什么还要用这个所谓的单调队列。这里有个问题是普通的 FIFO 队列,只能从队首删除元素,但是优先级队列可以从队尾进行删除。 这就是单调队列最重要的一个特性。对于此题来说,就是一个区间求最值的问题。所以方法呢,也是有很多的。 比如RMQ、线段树等等。至于单调队列的做法就是原创 2010-09-09 14:13:00 · 881 阅读 · 0 评论 -
hdu 3308 LCIS (线段树)
<br />题意不难理解 就是求某一区间的最长连续递增子序列。<br />虽然猜测是线段树做法,但是之前没见过类似题目。 所以搜了下解题报告。<br /><br /><br />对于某一区间 ,我们保存以从该区最左边点为起点的最长子序列长度,和以该区间最右边的点为终点的最长子序列,以及该区间的最长子序列。<br /> <br /><br />对于中点mid 如果a[mid]>=a[mid+1] 断开 那么有左边最长=左儿子左边最长 右边最长=右儿子右边最长 全局最长=Max(两个儿子的全局最长)<原创 2010-09-22 11:48:00 · 1076 阅读 · 0 评论 -
hdu 3487 Play with Chain(伸展树)
此题乃传说中splay的简单应用。不愧是传说中的数据结构,花了两天才写出来,第一次写debug可是费了不少功夫啊。老实说写这种数据结构还真实不简单,上次学treap的时候也是花了好大功夫。 不过最终好歹是写出来了,而且学到了不少东西。算是值了。上次写treap的时候,旋转操作写了两个函数,这次学会了一种新写法,可以将旋转操作直接写成一个操作。在结构体中 用ch[2] 来记录儿子节点。用ch[0]表示左儿子,用ch[1]表示右儿子。于是rotate操作就可以写成void rotate(int x, i原创 2010-09-23 14:27:00 · 1815 阅读 · 0 评论 -
hdu 3006 The Number of set
<br />很巧妙的用位的方法来表示集合 用位运算的方法,集合a和集合b的并 就是a|b<br /> <br />然后简单模拟即可<br /> <br /> /* * File: main.cpp * Author: liuwei * * Created on September 27, 2010, 1:58 PM */#include <cstdlib>#include <cstdio>#include <cstring>using namespace s原创 2010-09-27 14:20:00 · 1094 阅读 · 0 评论 -
hdu 3118 Arbiter
<br />看起来很难的一个题。 其实做法就是枚举<br /> <br />将该图枚举成一个二分图 一部分节点标记为 1 剩下的标记为0 同类型节点之间不可达,所以若一条边的两个节点属于同一类型我们就把该条边去掉。<br />我们右发现n比较小不大于15,所以我们可以用为运算来解决此题。<br /> <br />首先自然是建图,用邻接阵来存储不同端点间边的个数。<br /> <br />然后分类的方法自然是有 (1<<n)-1 种 ,我们令i为0, i ——(1<<n)-1 每个原创 2010-10-05 09:04:00 · 1049 阅读 · 0 评论 -
poj 3264 Balanced Lineup rmq/线段树
<br />题意很简单,区间最值之差。<br />rmq或线段树都可。<br /> <br />比较郁闷的是,G++提交3000+MS,C++1700+MS,差别很大<br /> <br />rmq的代码,跑了1766MS:<br />#include <cstdio>#include <cstring>#include <iostream>#include <string>#include <cmath>using namespace std;const int MAXN = 50原创 2010-10-09 09:56:00 · 651 阅读 · 0 评论 -
poj 2186 Popular Cows (强连通分量,缩点)
<br />一直不明所谓缩点为何意,弄完这题算是明白了。<br /> <br />其实很简单,我们求强连通分量时,给每个顶点做一个标记,标记该顶点属于哪个强联通分量,然后属于同一个强连通分量的点就可以看作同一个点了。这就是所谓的“缩点”<br /> <br />此题用了个定理 :有向无环图(DAG)中,从任意一个点出发,必定可以到达某一个出度为0的点。<br /> <br />这个不用证明,直观想一下就行了。 因为无环,所以从一个点出发,必定会到达终点,终点的出度即是0<br />求强连通的目的也就是将原原创 2010-10-09 16:09:00 · 4549 阅读 · 1 评论 -
hdu1403 poj2774(后缀数组)
后缀数组的简单应用推荐罗穗骞的论文,我的主要代码也是按照论文上来的。两个题基本一样可以用同样的代码通过代码如下:/* * File: main.cpp * Author: liuwei * * Created on October 14, 2010, 7:30 PM */#include #include #include #include using namespace std;#define MAXN 200010char str[100010];原创 2010-10-14 19:34:00 · 1302 阅读 · 0 评论 -
hdu 1428(漫步校园)
<br />算法应该是最短路加DP吧。<br /> <br />按照提议,做题思路自然是先求出所有点到 n,n 的最短距离,吧n,n当源点求最短距离即可。我是直接bfs求的。<br /> <br />求完最短距离后求方法数,用记忆化搜索,状态方程不难。<br /> <br />这样写貌似效率很低,用G++提交还超时,我估计应该是求最短路的bfs()耗时太多,主要是太懒,不想重新建图。不过还是凑合AC了<br /> <br />附上该效率低下的代码:<br /> <br />/* * File:原创 2010-10-28 19:49:00 · 1317 阅读 · 1 评论 -
关于树状数组的一个小问题
虽然说树状数组的原理是早就懂了,不过一直也没多想那么神奇的位运算到底是怎么回事,只是照葫芦画瓢。今天研究的时候研究了下位运算的内容,也弄懂了树状数组中的一个小问题首先说说位运算的一些基本操作:c语言的几个基本操作符自然不必多说置位(Set bit)A |= 1 清位(Clear bit)A &= ~(1 测位(Test bit)(A & 1 (A >> bit & 1) != 0取最后一个非0位(Extracting every last bit)A & -A原创 2010-08-10 16:26:00 · 519 阅读 · 0 评论 -
pku 1017 贪心
题目大意就是在一个6*6的盒子里,放一些不同大小的方片 1*1、2*2、......6*6求把所有方片放下所需盒子的最小数量 用sum记录对于6*6的方片,必须得用一个盒子 sum+=num[6]; 对于5*5的方片,首先必须用一个盒子才能将其装下,所以sum+=num[5];剩下的空间只能装1*1的方片了,所以判断num[1]与11的大小,num[1]>11?nu原创 2010-04-25 10:26:00 · 534 阅读 · 0 评论 -
NKOJ 1791 Party at Hali-Bula(树状DP)
题目大意是某些人将去参加一次party 但是他们和他们不能和他们的上司一起参加,问满足此条件的情况下能去的最多人数首先由给出的条件建好树,我是用邻接矩阵来存的,主要是为了方便,实际上效率还是比较低的。需要保存两个状态 一是某节点不用(即此人不去的情况)时该节点和该节点子树的最大值dp[i][0]; 二是是用该节点时,该节点及其原创 2010-04-27 16:02:00 · 481 阅读 · 0 评论 -
toj 3505. Naughty Mike(树状数组)
前天加了个acm群,群里一个人问的一个问题 看了一下,虽然知道是用线段树或者树状数组做,但是自己确不会这两种数据结构 看了看,贡献了无数次wa后,借助模板过了 题意很简单,就是求子段和, 但是由于数据量较大,普通的方法肯定超时,所以用树状数组。 数据量大只能用scanf 和printf 用cin 和cout超时 代码如下: #i原创 2010-04-29 08:43:00 · 561 阅读 · 0 评论 -
pku 2106 Boolean Expressions
类似表达式求值的题目 和表达式求值的做法也差不多 用两个栈分别储存 操作数 和 运算符 运算符的优先级 为 ! > & > | 有个地方需要注意的是,如果是! 与 ! 自己进行比较, 应该当作 ! 因为第二个! 准备进栈时,如果此时处理 第一个!,储存操作数的栈为空栈,如果此时调用pra.top() 就会出现RE 代码如下: #inc原创 2010-05-23 20:10:00 · 697 阅读 · 0 评论 -
pku 1056(字典树)
<br />字典树,做的,据说暴力能过。。。<br /> <br />代码:<br />#include <iostream><br />#include <string><br />using namespace std;<br /><br />struct tree {<br /> int nxt[2];<br /> bool isWord;<br /> void init() {<br /> nxt[0]=nxt[1] = -1;<br />原创 2010-07-28 14:51:00 · 511 阅读 · 0 评论 -
pku 1915 Knight Moves(双向广度优先搜索)
<br /> 题意比较简单,就是模仿马在国际象棋棋盘的动作,给出起始点和终点,求最少步数<br /> <br />先用 BFS写了一遍过了,然后看到不少人提到双向BFS ,看了后重新写了一遍<br /> <br />其实双广也并不难,理解了也很容易写出来, 就是起点和终点同时开始搜索,直到发现重合点为止。<br /> <br />对于此题来说,从起点开始搜已被搜索的点vis置为1,从终点开始搜索已被搜索的点vis置为2, <br />若从起点开始搜遇到vis为2的点,或者从终点开始搜遇到vis为1的点原创 2010-07-29 15:48:00 · 695 阅读 · 0 评论 -
pku 1042 Gone Fishing
<br />贪心做法,思想主要是枚举需要去几个地方钓鱼, 选定了地方后,直接把在路上的时间减去就是钓鱼上所画时间了。接下来按哪个地方鱼多九分配给哪个地方就行,不用考虑路程时间了。<br />这样做的原因是 如果你先在1处钓鱼,然后 某个时间去了x, 然后再次回到1,这样的话和一开始就在1多钓几次鱼的效果一样,而且前者还多花了路程上的时间。 枚举去前n个地方,然后在1处掉,掉完后去2,然后去3... 直到到n处为止。<br /> <br />具体的可以参照黑书。<br /> <br />比较好原创 2010-07-28 11:16:00 · 489 阅读 · 0 评论 -
pku2442 Sequence
<br />题意是 给出 m组数,<br />每组 n个数 然后从m组中 每组选出一个进行求和 ,然后取其中前n小的数输出<br /> <br />选择的总数自然是 n的m次方,暴力法自然是超时的。<br /> <br /> <br />一个简单的思路是,从第一组到第m组依次处理<br /> <br />首先第一组的n个数自然是最小的n个数, 然后这n个数和第二组的n个组进行组合,形成n×n个数,保留其前n个数,再处理第三组,依次类推直到第m组<br /> <br />为什么保留前n个数就可以了呢?原创 2010-06-03 19:16:00 · 923 阅读 · 1 评论 -
pku1442 Black Box
<br />用优先级队列做的,由于一个细节问题,贡献了N次的RE<br /> <br />问题就是要求动态的查询第 k小的数,k由1开始递增<br /> <br />做法是用两个优先级队列 (也可以说是堆),一个最大优先级队列,一个最小优先级队列<br /> <br />由于是求第k小的数,所以每次查询的时候保持最大堆有有前k小的数就行了 然后返回qMax.top()<br /> <br />为了提取这前k小的数,所以我们一开始把数加入到qMin中,由qMin来返回前k小的数<br /> <br />要原创 2010-06-11 18:37:00 · 527 阅读 · 0 评论 -
pku 1472 Instant Complexity
<br />纠结的一道模拟题 ,快被它弄崩溃了,不做评论,栈模拟做的,<br />需要注意的地方有:注意LOOP的参数为0的情况,然后输出的格式相当复杂,但我的错误不是这两个。 <br /> <br />我是错在这种情况:<br /> <br />BEGIN LOOP n OP 1 END LOOP n OP 1 END END<br /> <br />正确的答案应该是 2*n 我之前的结果好象是 n^2+n<br /> <br />也就是没有考虑到LOOP 并行的情况,当成总是嵌套的来处理了。原创 2010-06-12 19:16:00 · 461 阅读 · 0 评论 -
hdu1251 统计难题(字典树)
<br />#include <iostream><br />#include <string><br />using namespace std;<br /><br />struct node<br />{<br /> bool isWord;<br /> int next[26],cnt;<br />}tree[1000010];<br /><br />string word;<br />int total;<br /><br />void init(原创 2010-06-17 21:38:00 · 406 阅读 · 0 评论 -
hdu 3682(To Be an Dream Architect)
<br />把坐标映射成一个 n进制数 hash一下,去掉重复的即可。处理方法有很多种。 用STL的set、和map会超时<br /> <br />val = x*n*n + y *n + z;<br /> <br />我用了sort排序然后手动统计不同数目就过了<br /> <br />代码:<br /> <br />/* * File: main.cpp * Author: Hewie * * Created on November 15, 2010, 10:06 AM原创 2010-11-15 11:17:00 · 1776 阅读 · 0 评论