【数据结构】
文章平均质量分 88
nyist_xiaod
这个作者很懒,什么都没留下…
展开
-
NYOJ 228 士兵杀敌五(插线问线__离线版)
题目链接:Click here~~ 观察这道题你会发现它的特点:查询操作全部在插完后进行,也就是传说中的离线问题。 这道题有种巧妙的O(n)的做法。其思想和树状数组的插线思想类似。 #include #define base 10003 const int M = 1000003; int c[M]; int main() { int n,m,Q,a,b,x;原创 2012-04-25 09:28:43 · 1351 阅读 · 3 评论 -
POJ 3468 A Simple Problem with Integers(线段树成段更新)
题目链接:Click here~~ 题意: 给你n个数,然后有两种操作,求某段区间的和 or 将某段区间元素加若干值。 解题思路: 线段树。。。模仿别人的。1516MS。 貌似zkw式线段树1329MS,两个树状数组可以做到1047MS,等以后再学,TAT。 #include #define L(x) (x<<1) #define R(x) (x<<原创 2012-08-01 15:53:30 · 900 阅读 · 0 评论 -
HDU 4267 A Simple Problem with Integers(12年长春网络赛-A题-线段树)
题目链接:Click here~~ 题意: 给你一个数列{An},有两种操作: 1、将区间 [a,b] 中满足条件 (i-a)%k = 0 的点全部加 c。 2、询问某一点的值。 解题思路: 由于更新区间的时候更新的是一些离散的点,所以我们要想办法将这些离散的点转化成连续的点。 注意到 k 的范围很小(k k 为 1 时:0、1、2、3……原创 2012-09-18 18:26:40 · 1489 阅读 · 0 评论 -
HDU 3234 Exclusive-OR(并查集偏移向量)
题目链接:Click here~~ 题意: 有n个数X0~Xn-1,开始时你不知道它们的值,逐步给你信息:1、直接给出 Xp 的值v。2、给出Xp ^ Xq的值v。然后在线询问某些(15个) Xi 异或的值。 解题思路: 好神奇的并查集啊,据说是偏移向量,基本完全仿照别人的,主要说下思路。 对于这种询问,我们并不一定要知道每个 Xi 的值,就可知道结果。 由原创 2012-10-05 08:40:29 · 1212 阅读 · 0 评论 -
HDU 4578 Transformation(13年杭州邀请赛-C题-线段树)
题目链接:Click here~~ 题意: 给一个序列 {an},有 4 种操作。 1、将一段区间的数全部加 c。 2、将一段区间的数全部乘 c。 3、将一段区间的数全部等于 c。 4、询问一段区间的和(和、平方和、立方和)。 解题思路: 很明显的一道线段树题,好久没刷线段树了,又手生了,真是弱。 自己写的代码太挫了,写完调了一天还原创 2013-08-12 10:46:39 · 1459 阅读 · 0 评论 -
HDU 3530 Subsequence(单调队列)
题目链接:Click here~~ 题意: 给一个长度为 n 的序列,找出最长的子序列满足 子序列中的最大值和最小值 的差在区间 [m,k] 范围内。 解题思路: 维护两个单调队列,分别存最小值和最大值。 利用 two pointer 的思想,出队时不断右移左指针 j,对于每个 i 不断更新 ans。 #include #include #inclu原创 2013-10-07 10:55:00 · 1012 阅读 · 0 评论 -
HDU 3231 Box Relations(拓扑排序)
题目链接:Click here~~ 题意: 在三维空间内,有n个长方体,棱都与坐标轴平行。给出一些关系,问是否可能,若可能,输出其中的一种。 关系有两种: 1、某两个长方体相交。 2、某个长方体的所有点的某一维的坐标完全小于另一个长方体的任意一点。 解题思路: 首先,对于棱与坐标轴平行的长方体,在某一维中,它里面的点可以看做包含在长方体的两个平面内,且原创 2012-10-04 08:30:59 · 1940 阅读 · 0 评论 -
HDU 4417 Super Mario(12年杭州网络赛-H题-离线 + 树状数组)
题目链接:Click here~~ 今天弄懂了这道被很多人称为水题的题。 题意: 给你一个数列{An},然后有m次查询,每次查询一段区间 [l,r] 内不大于 h 的值的个数。 解题思路: 稍加分析不难发现,问题的解满足区间减法的性质,即 ans[l,r] = ans[1,r] - ans[1,l-1] 。 于是想到可以用树状数组来存储前缀和。 然后,对数列{An原创 2012-09-25 19:28:45 · 1801 阅读 · 0 评论 -
HDU 4288 Coder(12年成都网络赛-A题-离线 + 线段树)
题目链接:Click here~~ 题意: 维护一个有序数列{An},有三种操作: 1、添加一个元素。 2、删除一个元素。 3、求数列中下标%5 = 3的值的和。 解题思路: 看的各种题解,今天终于弄懂了。 由于线段树中不支持添加、删除操作,所以题解写的是用离线做法。 我们来看它是如何解决添加、删除的问题的。 首先将所有出现过的数记录原创 2012-09-20 11:27:49 · 3029 阅读 · 0 评论 -
HDU 4358 Boring counting(离线 + 树状数组)
题目链接:Click here~~ 题意: 给一颗 n 个节点的树,每个节点有权值 wi,然后 q 次询问,每次询问根为 u 的子树有多少个 wi 恰好出现了 k 次。 解题思路: 又是对 子树 的 操作/询问,而且满足区间性质,所以可以先将每棵子树转化成相应的区间。 于是问题变成,每次询问一段区间中有多少个数恰好出现了 k 次。 做法是将询问离线搞,离线只原创 2013-10-12 08:23:57 · 974 阅读 · 0 评论 -
HDU 4630 No Pain No Game(离线 + 树状数组)
题目链接:Click here~~ 题意: 给一个长度为 n 的序列,且序列元素为 1 ~ n 的全排列。Q次询问,每次询问区间 [l,r] 的最大 gcd(a,b)。 解题思路: 继续刷。 如果将区间中的每个数换做它的因子集合出现,那么区间内的 gcd 可以看做是区间中出现 2 次以上的数,最大 gcd 即为出现 2 次以上的最大的那个数。 看到 n 不算原创 2013-10-13 21:15:26 · 1023 阅读 · 0 评论 -
HDU 4391 Paint the Wall(块状链表 | 分段哈希)
题目链接:Click here~~ 题意: 有 n 个点,每个点有一种颜色(可能相同),两种操作:1、将区间 [a,b] 染成颜色 c ; 2、询问区间 [a,b] 中颜色为 c 的点有多少个。 解题思路: 如果颜色的种类很少(5 个以内),那么就是经典的线段树区间染色的入门题。 但此题颜色太多,虽然可以进行哈希,但是规模还是能达到 10^5,根本不能朴素的用线段原创 2013-09-27 17:07:27 · 1949 阅读 · 1 评论 -
HDU 4638 Group(离线 + 树状数组)
题目链接:Click here~~ 题意: 给一个长度为 n 的序列,且序列元素为 1 ~ n 的全排列。Q 次询问,每次询问区间 [l,r] 有多少段连续的数字(可重新排列)。 解题思路: 继续刷啦啦啦。 首先可以在 O(n) 的时间内处理出所有关于区间 [1,r] 的询问。 考虑每次将区间右端点扩张,新出现的数对上次答案产生的影响 delta ,只有 -原创 2013-10-14 09:49:32 · 819 阅读 · 0 评论 -
CF 351D - Jeff and Removing Periods(离线 + 树状数组)
题目链接:Click here~~ 题意: 给一个长度为 n 的序列,Q 次询问,每次查询 [l,r] 中有多少个不同的数字,且是否存在一个数字,其出现的位置成等差数列。 解题思路: 接上篇继续刷离线查询题目。昨天想了1天,今天早上在床上想出思路了,2333333。 对于区间中不同数字的个数,可以用类似上篇的做法,c[j] 维护 [j,i] 中不同数字的个数,那么原创 2013-10-13 19:20:20 · 1494 阅读 · 0 评论 -
Treap 的实现
学会 BST 后,Treap 就比较好学了。 在 BST 的基础上,给每个节点加个随机的优先值,然后类似 Heap 的维护,让树中每个父节点的优先值大于子节点的优先值。 这样随机以后,树高的期望高度被证明为 log(n)。 从而使得操作的复杂度为 log(n) 。 /* Title : Treap Author: nyist_xiaod Date : 2013翻译 2013-03-17 21:05:23 · 919 阅读 · 0 评论 -
快速排序
#include #include #include using namespace std; const int N = 1e6 + 5; int a[N]; void quick_sort(int l,int r) { if(l >= r) return ; int magic = rand() % (r - l) + l + 1; swap(a[l],a[magic]翻译 2014-03-21 09:51:00 · 796 阅读 · 0 评论 -
HDU 2818 Building Block(带权并查集)
题目链接:Click here~~ 题意: 给 n 个独立的节点,定义一种具有传递性的关系,两种操作: 1、合并,即合并 u 和 v 各自所在的集合。 2、分离,将 u 从之前的集合中分离出来,并将其作为一个新的独立节点。 最后找出 n 个节点一共存在于多少个集合中。 解题思路: 从合并操作来原创 2014-05-08 10:36:03 · 2134 阅读 · 0 评论 -
线段树学习(一)
先从书上把定义抄下来: 一棵二叉树,记为 T (a,b),参数 a,b表示该节点表示区间[a,b)。区间的长度b-a 记为 L。 递归定义 T[a,b]: 若 L>1 :[a, (a+b)/2]为 T 的左儿子,[(a+b) /2,b]为 T 的右儿子。 若 L=1 :T 为一个叶子节点。 区间[1, 10]的线段树表示方法如下: 这里需要注意一点,图中一共有9个叶子节点,也原创 2012-03-29 16:26:29 · 1817 阅读 · 2 评论 -
HDU 4334 Trouble(Hash)
题目链接:Click here~~ 比赛时的一道题,当时没有好的思路,听学长讲了讲才知道可以用Hash做,之前用Hash只写过那个找球号的题。 题意: 有5组数,每组有n个,问能否在每组中找到一个数,令这5个数之和为0。 解题思路: 先用O(n^2)的时间求出前两组数的所有组合情况,将它们存入一个Hash表。 然后用O(n^3)的时间求出后三组数的所有组合情原创 2012-08-04 15:05:02 · 765 阅读 · 0 评论 -
HDU 4339 Query(树状数组+二分)
题目链接:Click here~~ 题意: 有s1、s2两个串,有两种操作:1、查询从i位置开始,两串中最多有多少个字符相等。2、将某串的i位置的字符变为其他字符。 解题思路: 用一棵树状数组记录两串中前 i 个位置共有多少个字符对应相等。 若某段区间[i,j]中,字符全部对应相等,则必有sum(j)-sum(i-1) = j-i+1 。 设字符串长度为n,原创 2012-08-04 19:46:17 · 675 阅读 · 0 评论 -
HDU 2647 Reward(拓扑排序)
题目链接:Click here~~ 题意: 老板给员工发薪水,有的员工要求必须比某些员工薪水高。基础薪水是888,问最少发多少薪水。 解题思路: 想要发的薪水最少,就要让员工尽量只满足要求即可,不必多发。 我们可以大致想象出员工的薪水大概是一层一层分布的,即888一层,889一层,依此类推,每层有若干个员工,但一定不会为0。(想想为什么) 接下来,我们将员工原创 2012-07-21 16:23:44 · 1218 阅读 · 3 评论 -
HDU 1811 Rank of Tetris(拓扑排序+并查集)
题目链接:Click here~~ 题意: 中文题啊中文题。 解题思路: 此题关键的一点是要意识到排序时,Rating相同的人一定排列在一起,且顺序一定存在。 故可以用并查集先将数据中Rating相同的人看做一个集合,然后将各个集合拓扑排序。 接下来就是对于拓扑排序的理解了,当找不到入度为0的点时,图中有环,故会出现冲突。 当每次找到入度为0的点大于1原创 2012-07-21 16:00:44 · 785 阅读 · 0 评论 -
并查集
弄了n年,终于弄出了个并查集的模板。贴上备忘。 简易版。 #include #include #define CLR(a,v) memset(a,v,sizeof(a)) #define N 50010 int pre[N]; void Init() { CLR(pre,-1); } int Root(int x) { return pre[x]+1 ? pre[x] =翻译 2012-07-08 08:25:43 · 524 阅读 · 0 评论 -
HDU 4171 Paper Route(树的性质+BFS)
题目链接:Click here~~ 题意: 有n+1个点,这n+1个点由n条边相连,且保证连通。然后给出各个点到出口的距离,要求从0点出发,遍历完n个点后立刻从出口出去。求最少时间。 解题思路: 由于n+1个点由n条边相连且连通,所以它肯定是一棵树,而且每个点到根节点的距离唯一。 从根节点出发遍历一棵树后,如果回到根节点,那么它一定走了2倍的树的边的权值之和。 所以我们可以把出原创 2012-05-08 10:07:23 · 945 阅读 · 0 评论 -
树状数组
在处理一些关于区间模型的问题时,常常会遇到处理前缀和(即从1到x的和)的问题。 这类问题常规解法有两种: 1、直接存储原数组,修改元素O(1),取前缀和O(n)。 2、直接存储前缀和,修改元素O(n),取前缀和O(1)。 但是如果当修改元素和取前缀和操作都比较大的时候,这两种方法就都不能用了。 怎么办呢?我们可以用另外一种解法:树状数组。 其修改元素和取前缀和的复杂度均为O(logn)原创 2012-04-25 08:48:55 · 1315 阅读 · 2 评论 -
单调队列
现在有一个数列{An},假设它有n项,问题是:求出每个区间长度为k的连续区间内数列的最小值。 有种很容易想到的解法: 遍历每个所求区间,依次找出它们的最小值。复杂度为O( (n-k)*k ) 分析上面的解法我们不难发现,在找最小值时,我们做了很多重复的比较。这样的做法无疑使复杂度变大,有没有一个好的办法可以不要做这些重复比较呢? 于是,引出了我们本文的主角:单调队列。 单调队列是这样一个原创 2012-04-06 10:23:21 · 3251 阅读 · 2 评论 -
二叉排序树(BinarySortTree)的实现
/* Title : Binary Sort Tree Author: nyist_xiaod Date : 2013.3.16 */ #include #include #include using namespace std; #define BSTdef #define Pnn pair #ifdef BSTdef #define Pre(root,par翻译 2013-03-16 20:57:05 · 981 阅读 · 0 评论 -
ZOJ 3686 A Simple Tree Problem(将对树的操作转化成区间=>线段树)
题目链接:Click here~~ 题意: 给一颗确定的树,每个节点只有 0 和 1 两种状态。 两种操作:1、将某颗子树的0变1,1变0。 2、询问某颗子树的1的个数。 解题思路: 一看这两种操作,很容易就联想到了线段树,但问题是,区间在哪里??? 由于操作都是对一颗树进行的,我们要想办法把它和区间联系起来原创 2013-04-01 14:33:30 · 1372 阅读 · 0 评论 -
SPOJ 3273 Order statistic set(Treap应用)
题目链接:Click here~~ 题意: 设计一个数据结构,可以在log(n)的时间内插入、删除、返回第 k 大、求某值的 rank。 解题思路: 可以给在 treap 的基础上,每个节点加个size 记录总共涵盖多少节点。 调了一天,终于调出来了。好累啊。 对于 null 节点取 size 的时候要格外小心,否则会指针访问未知内存,导致RE。原创 2013-03-19 12:20:32 · 1178 阅读 · 0 评论 -
HDU 3397 Sequence operation(线段树好题)
题目链接:Click here~~ 题意: 很给力的线段树题,感觉对帮助理解线段树十分有帮助。写了 200 行,debug了 2 小时。好爽。 有一个数列,然后5种操作: 1、将 [a,b] 中所有数变成0。 2、将 [a,b] 中所有数变成1。 3、将 [a,b] 中所有数取反。 4、询问 [a,b] 中 1 的个数。 5、询问 [a,b] 中原创 2013-04-01 19:47:51 · 876 阅读 · 0 评论 -
堆(Heap)的实现
学习了 Heap,其实不难。 用途:在 O(log(n)) 的时间内插入、返回和删除最大值或最小值。 它是这样一颗二叉树,父节点的值总是大于(小于)子节点的值(为了方便,我们把这句称作“要求”)。 显然,Heap 的树根就是那个动态的最大值或最小值。 首先需要一个维护堆的性质的函数 heapify,它的作用是,当以节点 i 为根的堆不满足要求时,调用这个函数使其满足要求。翻译 2013-03-14 21:38:50 · 1038 阅读 · 0 评论 -
矩形 面积并 && 周长并
算是线段树的一个应用吧,在 hanyan 学长的帮助下,一天搞定了,略爽。 问题是,平面上有 n 个矩形,矩形的边是平行于 x 轴或 y 轴的,问它们覆盖的面积和周长。 大概思路是,用一根垂直于 x 轴的直线,从左向右扫描。扫描的过程中,一定会与某些矩形的边重合。 由于 n 个矩形会有 2*n 条竖边,所以我们可以把它们分成 2*n-1 个缝隙,我们依次考虑这些缝隙的情况,最后相加即翻译 2013-04-16 19:48:50 · 2209 阅读 · 0 评论 -
三分查找
我们都知道 二分查找 适用于单调函数中逼近求解某点的值。 如果遇到凸性或凹形函数时,可以用三分查找求那个凸点或凹点。 下面的方法应该是三分查找的一个变形。 如图所示,已知左右端点L、R,要求找到白点的位置。 思路:通过不断缩小 [L,R] 的范围,无限逼近白点。 做法:先取 [L,R] 的中点 mid,再取 [mid,R] 的中点 mmid,通过比较 f(mid) 与 f(mmi翻译 2012-08-31 11:24:15 · 1868 阅读 · 0 评论 -
ZOJ 3650 Toy Blocks(DP + 线段树优化转移)
题目链接:Click here~~ 题意: 给出 n 个多米诺骨牌的 X 坐标以及高度 H,每次你可以选任意一张向左推或向右推,推倒后,会产生连锁反应,问最少几次能把所有的骨牌推倒。 解题思路: 先预处理出每张牌向 左/右 推能推到的最远位置,记为 l[i] 和 r[i]。这步可以通过递推的方法在均摊总复杂度为 O(n) 下得到。 然后 dp[i][dir原创 2013-07-22 10:26:33 · 1085 阅读 · 0 评论 -
ZOJ 3635 Cinema in Akiba(树状数组 + 二分)
题目链接:Click here~~ 题意: 有 n 个位置,从小到大分别编号为 1~n。然后有 n 次操作,每次取第 Ki 个没有被取到的编号,最后询问某次操作取出的是谁。 解题思路: 用 sum(i) 记录 1~i 位置中,一共有几个空座位。每次二分找到第 Ki 个是哪一个,然后将这个位置 th~n 全部减一。 #include #include #原创 2013-07-23 11:34:58 · 958 阅读 · 0 评论 -
HDU 1698 Just a Hook(线段树+简单lazy标记)
题目链接:Click here~~ 题意: 最经典的区间染色入门问题。 初始时区间[1,n]的颜色都是1,之后有若干操作,改变某段区间的颜色,输出最后区间[1,n]的颜色之和。 解题思路: 主要说如何做lazy标记。 就是更新时,不更新到最底层(那样太浪费时间)。 对每一个节点,用一个标记记录这段区间是否是同一段颜色。 更新时,若当前节点正好是需原创 2012-08-10 18:53:02 · 1433 阅读 · 0 评论 -
HDU 2473 Junk-Mail Filter(带分离操作的并查集)
题意: 给 n 个独立的节点,定义一种具有传递性的关系,两种操作: 1、合并,即合并 u 和 v 各自所在的集合。 2、分离,将 u 从之前的集合中分离出来,并将其作为一个新的独立节点。 最后找出 n 个节点一共存在于多少个集合中。原创 2014-05-04 22:03:51 · 2253 阅读 · 0 评论