
数据结构
文章平均质量分 68
dumeichen
这个作者很懒,什么都没留下…
展开
-
poj 3630 Trie树(电话号码组是否成立)
题意:给定若干电话号码,如果没有号码是其他号码的前缀则原创 2014-07-15 18:09:27 · 513 阅读 · 0 评论 -
poj 1611 并查集(需要隔离的人数)
题意:有n个人,其中分原创 2014-07-15 18:25:43 · 444 阅读 · 0 评论 -
poj 2001/1056 Trie树(求单词表的最短前缀/判断立即码)
题意:输入若干单词组成单词表原创 2014-07-17 21:03:41 · 532 阅读 · 0 评论 -
poj 1990 树状数组(耳背的牛谈话)poj2231
题意:一群耳背的牛,每头牛有一个音量阈值xi。当两头牛i,j交流的时候,交流的最小声音为max{x[i],x[j]}*他们之间的距离。现在有n头牛,求他们之间两两交流最少要的音量和。思路:n的大小为20000显然不要n^2的算法。思路为首先按照阈值x对牛排序。那么新顺序下两头牛交流他们的max{x[i],x[j]}必为后面的牛的阈值,接下来就是快速求出当前牛和排在它前面所有牛的距离之和。需要用原创 2015-08-07 21:24:34 · 502 阅读 · 0 评论 -
poj 3468 线段树(区间和,有更新)
题意:给定Q(1 ≤ Q≤ 100,000)个数A1,A2… AQ,,以及可能多次进行的两个操作:1)对某个区间Ai … Aj的每个数都加n(n可变)2) 求某个区间Ai … Aj的数的和原创 2014-07-22 19:46:01 · 361 阅读 · 0 评论 -
poj 2403 map
题意:给出一些单词和整数对作为词典,再给出若干文章片段,求文章的值。值为其包含的在词典中出现的单词对应的数字之和。思路:词典用map来存储即可。注意可以直接用char*来作为map的键。另外摘自(http://www.cnblogs.com/zhixing/archive/2013/06/04/3116814.html)的char*和string之间的转换方式。1. string转cons原创 2015-08-27 08:50:13 · 350 阅读 · 0 评论 -
poj 3667 线段树(Hotel)
题意:有一个线段,从1到n,下面m个操作,操作分两个类型,以1开头的是查询操作,以2开头的是更新操作。1 w 表示在总区间内查询一个长度为w的可用区间,并且要最靠左,能找到的话返回这个区间的左端点并占用了这个区间,找不到返回0 。初始时所有区间都可用,比如当n=10 , 1 3 查到的最左的长度为3的可用区间就是[1,3],返回1,并且该区间被占用了。2 a len , 表示从单位a开始,清除一段原创 2015-07-30 20:23:11 · 389 阅读 · 0 评论 -
poj 1151 线段树+扫描线(Atlantis矩形面积)
题意:给定n个矩形 (n思路:线段树+扫描线。用一条直线从左到右扫描,碰到一条矩形竖边的时候,就计算该直线有多长被矩形覆盖,以及被覆盖部分是覆盖了几重。碰到矩形左边,要增加被覆盖的长度,碰到右边, 要减少被覆盖的长度。每碰到一条矩形的纵边,覆盖面积就增加 Len * 该纵边到下一条纵边的距离。Len是此时扫描线被矩形覆盖的长度。在Y轴进行离散化。n个矩形的2n个横边纵 坐标共构成最多2n-原创 2015-08-25 16:09:10 · 416 阅读 · 0 评论 -
poj 2051 priority_queue应用
题意:每一行输入一个编号,再给定它每一次出现的间隔时间,最后以“#”结束。之后是m次查询,根据他们出现的时间从早到晚把前m个编号打印出来,若在同一时间有多个编号,那么先输出小的编号。思路:用优先队列维护时间点,每次堆中最小的输出,然后加上间隔再push进去即可。#include #include #include #include #include #include using原创 2015-08-24 16:09:14 · 410 阅读 · 0 评论 -
poj 1195/2155 二维树状数组(子矩阵值之和)
题意:一个由数字构成的大矩阵,开始是全0,能进行如下两种操作:1、对矩阵里的某个数加上一个整数(可正可负);2、查询某个子矩阵里所有数字的和。要求对每次查询,输出结果。思路:二维树状数组。二维树状数组的思路和一维的比较类似。树状数组C[x][y] = Σ {a[i][j]},其中x-lowbit[x]+1 Sum(x,y) = Σ {C [i][j]} (从[1,1]到[x,y]这个矩阵里原创 2014-12-03 15:01:46 · 546 阅读 · 0 评论 -
poj 1204 trie树/AC自动机(在二维词表中找词)
题意:给定一个n*m大小的二维词表(0思路:一开始想也没想就写了暴搜,果断TLE。之后瞄了一眼题解都说用trie或者ac自动机。就算这样还是没想出怎么用trie存词表。原来是用trie存待查得单词,对于词表,仍然是暴搜。注意虽然题目中没给每个单词的长度,但是长度上限可以确定,也就是词表的长或宽的上限,即1000。(一开始还在想对角线最长,大概是1000倍的根2,犯傻逼了)有个地方还是没太明原创 2015-02-12 15:54:59 · 376 阅读 · 0 评论 -
poj 2528/3277 线段树(海报覆盖)
题意:给定一些海报,可能互相重叠,告诉你每个海报宽度(高度都一样)和先后叠放次序,问没有被完全盖住的海报有多少张。思路:原创 2014-07-22 22:38:28 · 932 阅读 · 0 评论 -
poj 2828 树状数组or线段树(还原排队的人的序列)
题意:人们一个一个的来排队并插队,按人到来的顺序给出每个人插队的位置(插在第几个人后面),并告知每个人的id号,输出最终队伍的情况。思路:按照hint给的思路显然是n2复杂度,对于200000个点来说大了点。1、按照与2182同样的思路可以用树状数组来做。只不过这次二分是求第i个人应该最终排在哪个位置。2、线段树也能做,记录区间目前还剩的空位数量,每一次插入的时候,如果该节点左儿子的空原创 2014-12-09 18:28:33 · 609 阅读 · 0 评论 -
poj 3321/3263 树状数组(苹果树/排身高)
题意:每个分叉点及末梢可能有苹果(最多1个), 每次可以摘掉一个苹果,或有一个苹果新长出来,随时查询某个分叉点所在的子树里, 一共有多少个苹果。思路:深度优先遍历整个苹果树,为每个节点标记一个开始时间和结束时间(所有时间都不相同),显然子树里面所有节点的开始和结束时间,都位于子树树根的开始和结束时间之间。那么苹果的有无只需在开始时间那个点(在结束时间那个点上也可以)上面进行加减1的操作即可。然原创 2015-07-22 21:40:42 · 855 阅读 · 0 评论 -
poj 2985 树状数组+并查集(第k大组数)
题意:一开始有n个数,有两种操作,0 a b表示将a所在组和b所在组合并,1 a表示查询当前的第k大组数有多少个。思路:合并集合很简单用并查集即可。查询的方法是:用树状数组记录数集中某个数出现次数,即tree[i]表示含有i个数的组有多少个。查找的时候二分即可。#include #include #include #include #include #include using原创 2015-08-19 19:58:00 · 483 阅读 · 0 评论 -
poj 2761 线段树(多次查询不覆盖区间的第k小数)
题意:给定n个数,m次查询(a,b,k),表示查询第a个数到第b个数(闭区间[a,b])中的第k小数。其中这m个区间保证没有一个完全覆盖另外一个。思路:首先考虑没有区间覆盖的意思:对于最小的区间终点,它对应的起点一定是最小的区间起点。首先离散化。然后使用线段树,每个节点(如表示区间为[a,b])维护一个值small表示位于其左儿子的个数。然后对于每个区间(对区间先排序)更新查询即可。时间复杂度原创 2016-10-27 18:39:24 · 683 阅读 · 0 评论 -
trie 403 Forbidden
题意:(题目链接http://hihocoder.com/problemset/problem/1289)给定n个IP地址,后面可能跟着一个前缀长度,并给出这个IP地址是allow还是deny,然后给出m个ip地址,判断应该allow还是deny。匹配的规则是在n个地址表里从前往后,碰到匹配就输出,如果全部不匹配就allow。思路:暴搜肯定是会超时的,这里用trie。将n个地址看成一个二进制串原创 2016-04-13 14:33:00 · 346 阅读 · 0 评论 -
poj 2002 hash(平面上若干点能够成多少正方形)
题意:给定二维平面上不超过1000个点(点坐标的绝对值思路:枚举两个顶点,可以确定另外两个顶点的位置,判断另外两个顶点是否存在于点集中。先用hash把点存储一下,然后判断。此处用了stl 的set。因为多组,所以一开始要清空set,忘了这一步导致wa了多次。#include #include #include #include using namespace std;int原创 2016-02-13 11:08:31 · 760 阅读 · 0 评论 -
poj 1733 并查集(奇偶校验,判断第一个矛盾)
题意:一个由0,1组成的数字串,现在你问一个人,第i位到第j位的1的个数为奇数还是偶数。一共会告诉你n组这样的数。要你判断前k组这个人回答的都是正确的,到第k+1组,这个人说的是错的,要你输出这个k,要是这个人回答的都是正确的,则输出组数。思路:并查集。注意输入的区间非常大,所以要离散化一下。离散化的时候还要注意,如果两个数字相邻但是其差不为1,那么中间必须再加上另一个数。比如将出现的数字排序原创 2015-12-06 15:55:01 · 538 阅读 · 0 评论 -
poj 3784 带插入的动态查询中位数
题意:输入若干个数,对第k个输入,如果k为奇数,则输出前k个数的中位数。思路:用两个堆, 大顶堆和小顶堆。每次输入一个数,如果这个数比当前的中位数大,就存入小顶堆中, 否则就存入大顶堆。然后调整, 小顶堆元素的个数要等于大顶堆的元素个数,或者比其多1。如果小顶堆的元素太多,就塞到大顶堆里,反之亦然。实际上还可以加上删除中位数操作:只要保证大顶堆的元素=小顶堆的元素或者比小顶堆元素多一即可原创 2015-10-29 23:54:44 · 509 阅读 · 0 评论 -
hdoj 4347 KD树
题意:首先给出n(n思路:KD树,讲解可以参考统计学习教材K近邻那章。我的代码是参照(http://blog.youkuaiyun.com/wxfwxf328/article/details/8158187)写的。首先是建树,难点不多,用到了nth_element函数,正好符合我们的所需:将中间点固定,小于这个点的弄到左边去,大于的弄到右边去。这里的一个技巧是point结构体的小于号重构,里面居然可以原创 2015-10-24 12:23:29 · 465 阅读 · 0 评论 -
poj 3171 dp+线段树(最小代价覆盖全部区间)
题意:给定一个需要覆盖的区间[m,e],给出n个区间[ai,bi],每个区间有一个权值wi。求能够把[m,e]覆盖所选取的区间的最小代价之和。思路:如果没有权值,那么贪心可以解决这个问题,见poj2376。但是此处带权,那么贪心不成立,需要考虑用动态规划。先将所有区间的代价设置为无限大,然后将给的n区间按左优先排序,然后进行一趟遍历:第i个区间为[a,b],先查询[a-1,b-1]区间的最小值原创 2015-09-17 11:57:16 · 651 阅读 · 0 评论 -
poj 1984 并查集(在线查询曼哈顿距离)
题意:一个图中,只有上下左右四个方向的边。给出这样的一些边,求任意指定的2个节点之间的曼哈顿距离。查询时还有第三个参数k,表示只知道图中前k条边的信息时查询,此时如果不能确定,则输出-1。思路:并查集。时时维护相对于并查集树顶结点的坐标偏移cx和cy两个数组。合并的时候仅仅更新树顶结点,其他结点在find操作时更新。#include #include #include #incl原创 2015-09-16 14:50:11 · 450 阅读 · 0 评论 -
poj 2227 优先队列应用(能装多少水)
题意:一个n*m矩形区域,其中每个1*1都是有高度的矩形块,高低起伏,求最多储水量。(边界不能储水)题解:先将边界装入优先队列中(高度越小越优先),并标记为已访问。看队首元素四周未访问过的点,1、如果该点不比队首低,则将它加入队列,标记为已访问,即它变成了新的边界。2、该点比队首低,意味着该点可以储水,更新res值,同时将它加入队列中,但是它的高度为原队首元素的高度,即以它为边界的点不能超过这原创 2015-09-14 10:48:51 · 1039 阅读 · 0 评论 -
poj 2777 线段树(区间染色)
题意:给一个固定长度为L的画板。有两个操作:1、C A B C:区间AB内涂上颜色C。2、P A B:查询区间AB内颜色种类数。思路:区间显然要用线段树。颜色因为不超过30,所以可以用位运算。关键在于优化:每次更新到完整区间的时候标记一下,不更新到叶子节点,当后面更新或者查询需要用到比这个区间小的区间的时候再往下带。#include #include #include using n原创 2015-07-26 18:11:21 · 455 阅读 · 0 评论 -
poj 1785 构造笛卡尔树(右链插入/RMQ)
题意:给定n个(label,priority)的二元组,以此构建笛卡尔树。所谓笛卡尔树(treap),看label为二叉排序树,而看priority为堆。思路:(http://www.cnblogs.com/rainydays/archive/2011/06/15/2081266.html)先把节点按lable排序,从小到大依次插入,这样每次插入的节点就要插到排序二叉树的最右边。之前先建立一个原创 2015-03-02 20:44:33 · 676 阅读 · 0 评论 -
poj 2029 二维树状数组(用给定大小矩形能够囊括的最大数量)
题意:一个H * W的大矩形,里面的某些格子种有树。现在要你找出一个h * w的小矩形,使得里面树的数量最多,问最多有多少棵树?思路:1、树状数组。首先按照给定的有树的格子进行构造二位树状数组,然后遍历h*w的矩形区域中的数量,求最大值。2、题目中不涉及更新,看到有人用dp去做,本质上也是遍历所有可能。#include #include #define max(a,b) ((a原创 2015-01-26 16:13:47 · 538 阅读 · 0 评论 -
poj 1456 贪心+并查集优化(卖带截止时间货物的最大利润)
题意:给定若干中商品,每种商品有两个属性,一个是其售价,另一个是其最晚售出时间,从思路:原创 2014-08-22 21:08:44 · 812 阅读 · 0 评论 -
poj 2418 BST(计算树木的比例)
题目翻译:硬木在植物学中是一类树,它具有阔叶,生产水果或者坚果,并且通常在冬天休眠。美国的温度气候产生了上百种硬木品种,即拥有特定生物学特征的树。例如,尽管橡树、枫树和樱桃树都属于硬木,但是它们属于不同的品种。总体来说,在美国所有的硬木品种大约占据所有树木的百分之四十。另一方面,软木(或者称之为针叶树),拉丁语意为“圆锥轴承”,是有针状叶子的一类树。美国广泛存在的软木包括雪松、冷杉、铁杉、松树原创 2014-09-03 17:04:24 · 838 阅读 · 0 评论 -
poj 2492 并查集(虫子交配,同性恋?)
题意:一组昆虫性别性别有个哦你原创 2014-09-23 10:20:19 · 2350 阅读 · 0 评论 -
poj 1573 栈的应用(Robot Motion)
题意:给定一个n*m的矩阵指令,没思路:原创 2014-08-07 16:18:32 · 335 阅读 · 0 评论 -
poj 1308 并查集(判断一组点对是否能够组成树)
题意:给定一组有序点对,如(a,b)表示有边从a指向b。原创 2014-08-05 21:34:47 · 392 阅读 · 0 评论 -
poj 2352 树状数组(星星的级别)
题意:在二维平面上,每个星星有一个坐标。思路:原创 2014-07-23 20:18:24 · 523 阅读 · 0 评论 -
poj 3253 huffman(切木棍)
题意:切木棍,切一刀的花费是木棍的长度。要求把木棍切成给定的长度,we原创 2014-07-10 21:16:14 · 487 阅读 · 0 评论 -
poj 2442 堆的应用(m组数取前n小)
题意:思路:原创 2014-07-16 10:46:47 · 516 阅读 · 0 评论 -
poj 2524 并查集(信仰数量)
题意:有n个学生,已知其中m对原创 2014-07-07 17:09:20 · 361 阅读 · 0 评论 -
poj 2481 树状数组(覆盖每个区间的区间个数)
题意:在数轴[0,100000]内给定n个区间,区间端点为整数。问对于每个区间,有多少个区间能够包含这个区间。如果两个区间端点全部相同不算包含,只有一个端点相同的属于包含关系。思路:树状数组。按照终止节点从大到小排序,相同的则按照起始节点从小到大,目的使得只有前面的区间可能包含后面的区间。遍历n处理两种情况:1、区间的两端点都和上一个完全相同,则输出值也和上一个区间相同;2、如果不是,那么计算原创 2014-12-05 10:24:26 · 671 阅读 · 0 评论 -
poj 2182 树状数组(给牛排序)
题意:有n头牛从1-n标号。现在给出n-1个数,表示第i头牛前面比它序号小的牛的个数。根据此还原牛的原始排序。思路:从最后向前扫面序列。每次对于未确定的最后一个数来说是可以根据它前面有多少数字比它小以及之前确定的数字(在它后面的数字)而确定它是几的。二分查找当前位置填几,设这个数字为a,应满足树状数组求和结果sum(a),即后面已经填好的比a小的个数,加上f[i],即前面比a小的个数,等于a-原创 2014-12-09 09:34:45 · 614 阅读 · 0 评论 -
poj 3067 树状数组(高速公路的交叉数量)
题意:在Japan的东西两边都有海岸线。两边分别有n,m个城市,他们的编号分别都为1....n, 1....m。要在东西海岸的城市间建立一些高速路,通过点对给出。求所有的交点有多少个(一个交点保证只有两条路穿过)。思路:树状数组。具体来说,如果把1...m重新从大到小编号(具体的操作可以用m+1减去原来编号)。则问题变成求一对儿的x和y完全大于另一对儿的对数。这与苹果那题便如出一辙。将(n,m原创 2014-12-10 10:17:08 · 548 阅读 · 0 评论 -
poj 3494 dp(最大全1子矩阵)
题意:给定一个n*m大小的0-1矩阵,原创 2014-09-05 20:35:38 · 685 阅读 · 0 评论