ACM_算法题解
文章平均质量分 77
purevegetable
这个作者很懒,什么都没留下…
展开
-
poj 1703 Find them, Catch them
并查集的题目,有2个帮派的人,如果不是A帮就是B帮的,现在给你m组数据,里面可能有A(answer)问a,b2个人的情况,或者D(different)a,b2人在不同的帮派内, 我也是第一次做这种并查集的题目,看看下别人的思想,确实挺简单的,就是在给一个数组dif,记录与其相反的那个人,开始时初始化为-1,只需要存储一个就可以了。 #include #include #include原创 2013-09-09 13:32:54 · 719 阅读 · 0 评论 -
poj 2828 Buy Tickets
哎,线段树这个模型还真难转换过来,其实线段树只要明白了模型,然后什么都简单了。 题意:人们一个一个的来排队并将插队,按人到来的顺序给出每个人插队的位置(插在第几个人后面),并告知每个人的序号,输出最终队伍的情况,并且输出。 这题需要理解一个思想,你如果正着进行插队的话,完全不是一次更新就可以完成的,所以要反过来,倒着插入的位置便是他最后的位置,想不通的可以用笔模拟一下。原创 2013-08-08 15:22:18 · 617 阅读 · 0 评论 -
hdu 2795 Billboard
题意:给一个h*w的公告牌,h是高度,w是宽度,一个单位高度1为一行,然后会有一些公告贴上去,公告是1*wi大小的长纸条,优先贴在最上面并且最左边的位置,如果没有空间贴得下,就输出-1,可以的话,就输出所贴的位置(第几行)。 思路:建线段树时取的n,我们只需要行的数量,这个10^9很是吓人,只需要取 min(h,n)即可,因为h太多也是无用的,总共才n个广告吗,多的行建出来只是浪费空间。然后原创 2013-08-08 11:14:25 · 712 阅读 · 0 评论 -
hdu 1754 I hate it
这题又学到点东西,宏定义的max跑起来要比自己定义的max函数慢得多,就因为这个,原本应该1A的题贡献2次超时。(大家不信的可以将我代码里的max换成宏,试着提交下,算是给大家提供点经验吧。) 题意:略。 思路:只要把更新换成最大值的便可以了。 #include #include #include #define L(u) (u<<1) #define R(u) (u<<1|1)原创 2013-08-06 15:24:50 · 605 阅读 · 0 评论 -
poj 3368 Frequent values
脑子实在太死板了, 竟然就想着用纯的线段树来解决, 一直对那种不完全的区间不能分开, 看了下别人的解法, 都是离散了然后把2边可能不完全的区间去掉再进行的线段树的操作的。 #include #include #include #include #define L(u) (u<<1) #define R(u) (u<<1|1) using namespace std; const i原创 2013-09-27 21:49:29 · 723 阅读 · 0 评论 -
poj 3468 A Simple Problem with Integers
前段时间学长给我们讲线段树的课,自己当时没认真听,看了个大概就没继续听下去了,这几次的多校联合多个线段树把我搞郁闷了,特此来刷点线段树的题。 题意:在一组数中执行两种操作 "C a b c" means adding c to each of Aa, Aa+1, ... , Ab. -10000 ≤ c ≤ 10000. "Q a b" means querying the sum of Aa,原创 2013-08-06 13:48:42 · 570 阅读 · 0 评论 -
poj 3630 Phone List
开始学字典树了,以前看过AC自动机,但现在感觉和没学一样的感觉,不过字典树还是挺好理解的,不懂的点击打开链接,这题算是字典树的入门题吧,但是需要注意判断的情况,可能别人是它的前缀,或者他是别人的前缀。 #include #include #include using namespace std; const int N = 100000; struct Node { bool flag原创 2013-09-13 17:52:01 · 769 阅读 · 0 评论 -
poj 3342 Party at Hali-Bula
简单的树形dp, 先建好图, 然后在dfs的过程中进行dp dp[i][j] 标记j表示人的序号 i有2种状态 1, 0,分别表示此人是否参加聚会。 具体的dp过程 当i为1是, 他的孩子状态必须全部为0, 如果为1是则无硬性要求,只要求人最多。 这题唯一麻烦的便是唯一性的判断,要是如果j取其孩子时,如果孩子不唯一,则j肯定不唯一,这是必然的道理。 具体的判断过程原创 2014-03-20 21:30:28 · 789 阅读 · 0 评论 -
poj 2486 apple tree
继续树形dp,这题比我之前写的都要男,我也犯2了,竟然拿以前的做法来套,套了半天换来的只是测试数据都过不了。 题意:一棵苹果树,以1当root,路过k条边,最终能吃到最多苹果的数量。 思路:开始就要弄清这个过程是有方向的,不然就跟我一样走进死胡同了。 dp[0][i][x] 以i为根节点,能返回i节点,并且走x步能活得的最大苹果数 dp[1][i][x] 以i为原创 2013-08-01 10:20:53 · 645 阅读 · 0 评论 -
线段树 学习资料
一:线段树基本概念 1:概述 线段树,类似区间树,是一个完全二叉树,它在各个节点保存一条线段(数组中的一段子数组),主要用于高效解决连续区间的动态查询问题,由于二叉结构的特性,它基本能保持每个操作的复杂度为O(lgN)! 性质:父亲的区间是[a,b],(c=(a+b)/2)左儿子的区间是[a,c],右儿子的区间是[c+1,b],线段树需要的空间为数组大小的四倍 2:基本操作(d转载 2013-08-05 17:42:30 · 828 阅读 · 0 评论 -
poj 2528 Mayor's posters
看到这道题就想起了牛插队的问题,如果没做过的同学可以去看看(poj 2182 Lost Cows) ,肯定逆着来是肯定的, 不然无法进行判断。 还有一个问题便是这题的坐标范围实在太大了,如果真按照他的坐标来建立线段树,超时爆内存是肯定的事。 这题的点是突破口, 点的数目才10000,这时离散化便起作用了(我离散化也不大行,参考了下依然的),离散化了就变成了前面的奶牛问题了,这题很适合练习原创 2014-02-19 11:28:57 · 658 阅读 · 0 评论 -
哈希表
数据结构:数据间关系 +数据存储方式。常见的数据结构有链表,堆,栈,队列,表,树,图等。选择何种数据结构,取决于需要解决什么样的问题。 哈希表(hash table),即散列表,是根据关键码值(Keyvalue)而直接进行访问的数据结构。其核心思想是选择一个哈希函数或者随机函数,用一个和记录相关的值作为函数的参数,生成存放该记录的块地址。这个算法的优点是寻址的时间复杂度是o(1),缺点是数转载 2013-09-11 09:58:15 · 725 阅读 · 0 评论 -
poj 1823 Hotel (分段线段树)
很长时间没写过分段的线段树了,自己开始一看也感觉一头雾水,但是最长的长度分为左最长,最长和右最长这是一开始就必须清楚的,分段更新我也不太熟悉,看了下别人的博客,感觉思路很清晰,敲出来,最后2个数据怎么搞都是错的,整整改了2个小时,最后看着别人的代码一句一句的对着看,终于发现自己看掉了一种情况,记事在左右结点的状态改变后,父节点也需要按条件进行改变。也就是upDate中的 if(node[L(u)原创 2014-02-20 20:45:36 · 809 阅读 · 0 评论 -
poj 1947 Rebuilding Roads
典型的树形dp,自己想了半天,实在没憋住,看了下网上的思路,便也A出来了,大家千万不要向我学,本人智商愚钝,关键的是树形dp还才入门。 题意:给你一棵树,求最少剪掉几条边使能够得到一个p个节点的树。 思路:dp[i][j]表示以i为根节点,最后只剩下p个结点需要最少剪的边数, 除了root结点,其余的初始的时候都是1,对每个子树的处理方式有2种:1.是直接将这条根子树切掉,另外一种是在子树原创 2013-07-31 17:43:29 · 718 阅读 · 0 评论 -
hdu 1394 Minimum Inversion Number
线段树入门第三题。 这题想了会发现没思路,找队友讨论了下,发现是如此的水,但就因为在query里把left与right写反了,又调试了半天(承认自己很挫)。最终还是1A了,这题确实很好,不愧是hh大神推荐的,做完都感觉爽。 题意:给你一个0~n-1的序列,输入的顺序是无序的,可以移动前任意个到最后面去,问你逆序对(对应的位置与大小相反)最少的数目。 思路:0~n-1不方便,直接在每个上+1,原创 2013-08-06 17:10:19 · 592 阅读 · 0 评论 -
poj 2777 Count Color
时隔2天才搞定, 哎, 最近各种忙啊, 忙得晕头转向。 明显的线段树, 对于搞过状态压缩的, 一看到颜色为1~30, 于是马上想起了位运算, 这题需要成段更新, 不然绝对的超时, 其余的按照模板来就行了。 #include #include #include #define L(u) (u<<1) #define R(u) (u<<1|1) using namespace std; con原创 2013-09-27 20:20:19 · 688 阅读 · 0 评论 -
poj 1091 跳蚤
终于知道容斥定理是个啥玩意了,真神奇。 题意略,其实幻化为表达式就是a1*num1+a2*num2+a3*num3+......an*numn = 1;本人没学过数论,但是一眼就看出这个表达式的意思就是说这n个数的gcd为1,结果baidu了一下,竟然真中枪了,原话是这样的(n个数的最大公约数规定为这n个数线性和的最小自然数,所以此题就是要求最大公约数为1的数列的个数);其实这题数据很水,明显会原创 2013-09-04 16:02:10 · 669 阅读 · 0 评论 -
POJ 2057 The Lost House
感想:基本看的是资料和解题报告才A出来的,实话说,这题真心不是树形dp的入门题,不骂人,和谐。 详情请参考黄劲松的《贪婪的动态规划》 ,如果没找到的话可以留言,我发给你。 题意:蜗牛的房子遗失在了一棵树的某个叶子结点上,它要从根结点出发开始寻找它的房子。有一些中间结点可能会住着一些虫子,这些虫子会告诉蜗牛它的房子是否在以这个中间结点为根的子树上,这样蜗牛就不用白跑路了。当然,如果有些结原创 2013-08-01 16:52:44 · 667 阅读 · 0 评论 -
poj 3140 Contestants Division
感想: 本来是准备练树形dp的,其实树形dp是可以写的,但是这题来个树形搜索就ok了。 题意:给你一棵树,(本人感觉M是欺骗性的数据,其实只可能等于n-1),然后减掉树上的一个边,将树分成2个部分,要求最小的2部分和的差得绝对值。 思路:首先看到这里面的数据就发现可能超int型的范围,所以果断用long long,然后那个abs函数也别用,直接自己写,速度更加快。搜索每一个根的时候,用tm原创 2013-08-01 12:51:21 · 726 阅读 · 0 评论 -
poj 2182 Lost Cows
题意: 有n头牛, 标号为1~n, 它们不听话, 喝多了酒, 吃晚饭的时候没有按照序号排队, 告诉你此时队列里第2头牛到第n头牛它们前面序号比他们序号小的牛的数目, 让你求出这时排队的序列。 思路:咋看上去确实有点不像线段树, 但是倒着考虑下给你的那个数组, arr[i]表示的就是前i头牛, arr[i]的序号排第arr[i]+1名, 要逆着来, 每次都将找出来的牛拿出去就行。原创 2013-09-23 21:13:36 · 833 阅读 · 0 评论 -
poj 2001 Shortest Prefixes
哎,开始理解错题意了,还以为找的是已经存在的字符串, 搞得连个测试数据都过不了,结果看了下别人的博客,才发现又会错了意,哎,做题须谨慎啊。 #include #include #include using namespace std; const int N = 3010; struct Node{ int flag; int count; Node *next[26]; }root;原创 2013-09-13 19:58:41 · 982 阅读 · 0 评论 -
poj 2503 Babelfish
还是字典树的基本题,算是很简答的,注意下数组的大小,我数组开小了,直接运行错误了,求大牛解答怎么算最大的结点数,这个控制条件借鉴了下依然的,第一次看见,竟然还能往缓冲区返回的。 #include #include #include using namespace std; const int N = 260050; char eng[N][11]; int tot; struct Nod原创 2013-09-13 18:20:50 · 679 阅读 · 0 评论 -
poj 2886 Who Gets the Most Candies?
题意:N 个小孩围成一圈,他们被顺时针编号为 1 到 N。每个小孩手中有一个卡片,上面有一个非 0 的数字,游戏从第 K 个小孩开始,他告诉其他小孩他卡片上的数字并离开这个圈,他卡片上的数字 A 表明了下一个离开的小孩,如果 A 是大于 0 的,则下个离开的是左手边第 A 个,如果是小于 0 的,则是右手边的第 -A 个小孩。游戏将直到所有小孩都离开,在游戏中,第 p 个离开的小孩将得到 F(原创 2013-08-08 17:25:55 · 617 阅读 · 0 评论