=====数据结构=====
文章平均质量分 56
林伏案
妖蛾子良多的范老爷
展开
-
poj1988
/*solution: 并查集note: 注意每次调用getParent都要更新under数组。这是最容易出错的地方! 由于路径的压缩,所以每次更新under时都相当与沿着路径更新。date: 2016.8.17*/#include #include #include using namespace std;const int maxn = 30000+5;in原创 2016-08-17 20:03:38 · 233 阅读 · 0 评论 -
poj3368(RMQ,ST算法)
/*translation: 给出一列数列,按照不递减的顺序。并且给出若干查询操作,查询某一区间出现频率最频繁的次数是多少?solution: RMQ的ST算法 首先设置数组dp[i][j]表示从i开始长度为2^i次方的查询结果。则根据动态规划有: dp[i][j] = max(dp[i][j-1], dp[i+(len >> 1)][j-1])。 然后根据数据不递减的特点,可以将其原创 2016-11-16 23:20:54 · 576 阅读 · 0 评论 -
poj3104(二分判断可行性)
/*translation: 要使得一排衣服晾干,自然风干每分钟蒸发1单位的水分。用烘干机的话每分钟蒸发k单位的水分。求把所有衣物晾干的话至少需要多长时间?solution: 二分查找最小可行解 首先二分枚举最短的时间mid。然后是判断该时间是否可行。可以发现对于水分单位量小于mid的衣服。只需要待其自然风干即可。 而对于a[i]>mid的衣物来说,要使得能够在mid时间内完成衣物的烘原创 2016-11-02 20:06:49 · 355 阅读 · 0 评论 -
poj3273(二分最大化最小值)
/*translation: 将N个数字分割成M个段,使得每个段和的最大值最小。solution: 二分最大化最小值即可note: *:这道题注意输出的边界。稍不注意就会错误。现在统一总结下写法: 二分最大(小)化最小(大)值时候。check函数里面=所在的位置决定了是最大化还是最小化 而输出是输出pr是输出最大值,输出pl是输出最小值date: 2016.11.2*/原创 2016-11-02 20:17:49 · 409 阅读 · 0 评论 -
poj3468(线段数区间操作模板)
/*translation: 给出一列数组,有两种操作,将某一区间所有的数字都加上c,查询某一区间的和。solution: 线段树区间操作模板note:date: 2016.11.18*/#include #include using namespace std;const int maxn = 100000 + 5;const int INF = 1e9 + 10;原创 2016-11-18 09:57:46 · 718 阅读 · 0 评论 -
poj2528(线段树,离散化)
/*translation: 有一堵墙,往上面贴海报,每张海报有各自的范围,可以相互覆盖,求最后还能看见多少张海报?solution: 线段树,离散化 每张海报的粘贴就是一个区间操作,所以可以考虑用线段树来解决。但是题目中所给的墙的长度数据量太大,都存下来 肯定MLE,所以考虑利用离散化,将每张海报的端点存储下来。然后利用这些端点来建立一颗线段树。然后就是查询操作 了,为了不让先后顺原创 2016-11-18 20:35:46 · 3474 阅读 · 2 评论 -
hdu1698(线段树区间操作,绝对懒惰标记)
/*translation: 有一段数列,初始值为1,后来有若干操作,把连续一段的数字改成1,2,3中的某一个。问经过若干操作后 这段数列的和是多少?solution: 线段树的区间操作。note: 注意这道题和poj3468的不同是poj3468的操作顺序对结果没有影响,而这道题是有影响的。 所以懒惰标记无论在更新还是查询的时候都要往下面带。date: 2016.11.18原创 2016-11-18 21:33:34 · 400 阅读 · 0 评论 -
hdu4027(线段树)
/*translation: 给出一列数列,有两种操作,一种是将数列的连续一部分的值变为原来的平方根。 另外一种是查询连续一段的和。solution: 线段树即可note: #: 一开始纠结怎么更新节点上的和,因为是将每一个值都变为原来的平方根,所以不可能在常数时间内更新完连续的 一段和。想了好久没有头绪,看了题解才知道关键是发现一个很重要的隐藏条件:只要一段连续区间的和等于r-原创 2016-11-19 15:03:49 · 399 阅读 · 0 评论 -
hdu4614(二分查询线段树)
/*translation: 程序媛经常收到花:),现在有若干花瓶,以及对应的若干个操作,1 a b表示程序媛将从a号花瓶起,从左往右在每个空的 花瓶里放置1朵花,遇到花瓶里有花的就跳过。2 a b表示程序媛将清空a~b号 花瓶。对每个操作输出对应的信息,1操作输出最开始放置花和最后放置花的花瓶编号。2操作输出a~b之间的花朵数目。solution: 线段树+二分 很容易想到对1操作原创 2016-12-01 22:30:18 · 287 阅读 · 0 评论 -
hdu1540(线段树维护连续区间模型)
/*translation: 打地道战,n个村庄用地道连成一条直线,鬼子有时破坏掉一个村庄,这时八路军要修好这个据点。现在要求询问任意一个村庄, 得出这个村庄现在与几个村庄相连,包括它本身。solution: 线段树维护连续子区间 将村庄抽象成一个点,正常下值为1,被破坏后变成0,即可将题目抽象成一个求目标节点所在的最长连续1序列的区间的长度。 所以在线段树里面维护3个信息,前缀最长原创 2016-11-19 19:57:50 · 3428 阅读 · 1 评论 -
hdu4578(线段树多种区间操作)
/*translation: 对于一个区间有4个操作: 1.将a~b都加上c 2.将a~b都乘上c 3.将a~b都变成c 4.查询a~b的每个数的p次方的和。(p=1,2,3)solution: 典型的线段树应用,不过增加了多种操作。一开始没写对,WA了好久,后来意识到更新的时候各个sum之间更新顺序 是有讲究的,于是改了过来,然而还是WA。最后憋得没办法,看题解才发现各个懒惰标原创 2016-12-04 11:23:11 · 2517 阅读 · 0 评论 -
hdu4553(神TM烦的线段树维护连续区间ORZ)
/*translation: 中文题意,不表solution: 线段树维护连续区间 此题还是按照基本的线段树维护连续区间的方式来,但是有一点较为复杂,就是要同时维护 DS和NS两个线段树。所以要清楚二者之间的关系,NS能够影响到DS的树,而DS不能影响到 NS的区间。注意合并区间过程中极易出错。note: #: 之前WA了几次都是因为m=(s[o]+e[o])>>1和m=(l+r原创 2016-11-27 00:04:42 · 765 阅读 · 0 评论 -
hdu1166(线段树)
/*translation: 给出一个数列,并且有若干操作,对某一数据增加或者减少。查询一段区间的和,给出查询的结果solution: 线段树直接搞note:date: 2016.11.16*/#include #include #include using namespace std;const int maxn = 50000 + 5;struct Node{原创 2016-11-16 23:10:58 · 354 阅读 · 0 评论 -
poj2456(二分最大化最小值,贪心)
/*translation: 有n间牛舍在一条直线上面,要住进c头牛。求每头牛之间的最大的最小距离能是多少?solution: 二分最大化最小值,贪心 首先二分枚举最优解,其次就是判定该次最优解是否可行。这一步骤可以按照贪心法来判定。 最后逐步缩小范围。note:date: 2016.11.1*/#include #include #include #include原创 2016-11-01 23:28:41 · 400 阅读 · 0 评论 -
poj1182
/*translation:中文题solution: 并查集 本题除了需要维护相同集合的这个关系外还需要维护不同集合间的关系,如果像图论那样开个数组来 维护集合之间的关系会MLE。所以需要在并查集上进行改造使其能够表示不同集合之间的关系。方法 如下:因为总共只有三个大的集合,只是不知道每个元素属于这三个集合中的哪一个,所以并查集中 的元素形式可以改变成i~a,表示i号元素属于a集合。原创 2016-08-31 10:13:24 · 198 阅读 · 0 评论 -
poj2976(二分求解0/1分数规划模型)
/*translation: 给出n场考试,每场考试有总题量,和你答对的题量。现在要求你去掉一些考试项目,使得你的正确率能够达到最大是多少?solution: 0/1分数规划,二分解决 赤裸裸的0/1分数规划,但是此题不能采用dp,因为a,b数据太大,超时。所以考虑采用二分来枚举可能的最大正确率。 然后判断该次枚举的是否可能。这样就转化成了二分确定最大值的问题。现在怎么判断是个问题。因原创 2016-11-03 20:32:28 · 472 阅读 · 0 评论 -
poj3111(均值的二分最大/小化)
/*translation: 给出n件物品,已知每件物品的重量和价值。要从这n件物品中选出k件,使得它们的单位价值最高。该选择哪几件?solution: 均值二分最大化 这道题同样不能用贪心。因为列出公式就可以看到每次的决策和全部的价值总和以及重量总和有关。故简单的贪心肯定是错误的。 所以对于这类问题可以二分枚举最优解,然后转化问题为判断当前枚举的最优解是否可行。即判断sum(V0..原创 2016-11-04 10:46:33 · 285 阅读 · 0 评论 -
poj3579(二分求解第k小/大值)
/*translation: 给出串数列,其中每每两个数的差的绝对值构成一个集合,求这个集合中的中位数。solution: 二分法求第k小/大 首先枚举第k小/大的数值,然后判断是否有k个值小/大于等于它即可,然后不断逼近。 具体快速判断的方法见代码注释。具体复杂度接近O(n)note: *:注意本题快速判断小于等于mid值的个数的方法date: 2016.11.4*/#i原创 2016-11-04 19:43:54 · 456 阅读 · 0 评论 -
poj1703(并查集维护不同集合关系的方法)
/*translation: 已知所有元素要么属于第一个集合,要么属于第二个集合,给出两种操作。第一种是D a b,表示 a,b两个元素不在一个集合里面。第二种操作是A a b,表示询问a,b两个元素是否在同一个集合 里面。如果不能确定的话打印not sure。否则给出答案。solution: 并查集。 这道题有点类似poj1182(食物链),两题的关键点都在于如何维护不同集合的关系原创 2016-10-17 20:48:45 · 3006 阅读 · 6 评论 -
poj2236(并查集)
/*translation: 多个电脑连成一个网络,给出修复和查询两种操作。输出每次查询两台电脑是否能够通信的结果solution: 并查集简单应用即可note: 注意输入。date: 2016.10.17*/#include #include #include #include #include using namespace std;const int max原创 2016-10-17 22:10:17 · 301 阅读 · 0 评论 -
aoj2170(并查集操作更改)
/*translation: 给出一棵树,根节点为1。一开始只有根节点被标记。现在有两种操作,一种是查询某一节点最近的一个标记 父节点,另外是将某一节点标记。求所有查询父节点下标的和。solution: 按照题意,依次父节点遍历即可。note: #这道题一开始被归类为并查集,害得我想了半天。并查集的路径压缩会破坏树的父子节点的关系而此题又要 维护父子节点的关系,形成矛盾。后来想可不原创 2016-10-19 22:50:29 · 296 阅读 · 0 评论 -
poj1064(二分处理浮点类型技巧)
/*translation: 给出n条电缆以及他们的长度,要从它们当中切取出k条长度相同的绳子。这k条绳子每条最长能够有多长?solution: 二分即可,浮点类型处理的一些技巧note: 1:注意输出的时候要做下floor处理 2:二分判断退出的条件不能是认为切割条数等于k条就退出。这样求出的不一定是最优解。正确姿势是不断让它循环求解到某个预先 设定好的次数。这个次数不能太原创 2016-10-31 21:49:14 · 245 阅读 · 0 评论 -
hdu3974(多叉树时间戳建模成线段树)
/*translation: 一个公司里面每个员工都有一个顶头上司,一旦给某个员工分配任务后,这个员工以及该员工的所有下属都在做该任务。 有若干操作,分配给员工任务以及查询该员工正在执行的任务。solution: 线段树,时间戳一般化 很明显该公司的所有员工间的关系可以用一颗多叉树来表示。然后就是dfs给这棵树打上时间戳。根据新分配的id号码 将其节点对应映射到线段树上面。这样分配任原创 2016-11-28 20:09:30 · 1224 阅读 · 1 评论 -
poj3685(二分查找第k小)
/*translation: 给出一个矩阵,其中每项的值为:i*i + C*i + j*j - C*j + i*j;(i,j分别为所在的行和列)。求其第m小的数字solution: 二分查找k小数字 观察发现矩阵的规律是从上倒下递增,从左到右递减。可以根据这个规律来二分查找有几个小于当前给出的值。详见代码note:date: 2016.11.5*/#include #incl原创 2016-11-13 21:27:22 · 472 阅读 · 0 评论 -
poj1759(二分找寻最值)
/*translation: 有n个灯泡挂在距离地面分别是hi的高度上。对每个hi有如下几个条件的限制: H1 = A ; Hi = (H i-1 + H i+1)/2 - 1, for all 1 < i < N ; HN = B ; Hi >= 0, for all 1 <= i <= N 求最大的B值是多少solution: 二分枚举第二个灯泡的高度即可note: #:输原创 2016-11-13 22:00:59 · 274 阅读 · 0 评论 -
la2678(前缀和,二分/尺取法)
/*translation: 有n个正整数组成一个序列。给定整数s,求长度最短的连续序列,使得他们的和大于等于ssolution: 前缀和,尺取法/二分 这道题可用尺取法或者二分法。 无论是尺取还是二分,都要求出前缀和。用二分法时,枚举起点,然后二分查找满足条件的 终点,同时更新维护答案即可。(根据前缀和的单调性) 如果用尺取法的话,就是最简单的原创 2017-03-11 15:09:49 · 676 阅读 · 0 评论