
数据结构
文章平均质量分 69
gg_gogoing
这个作者很懒,什么都没留下…
展开
-
POJ 1417 True Liars(并查集+DP)
大意:一个岛上有神与恶魔两个种族,神会说真话,恶魔会说假话。已知神与恶魔的个数,但不知道具体个人是属于哪个。n,x,y这个人问n次 ,x为神的个数,y为恶魔的个数。每次的问题为 xi,yi,a 问xi ,yi是否为神? a为yes/no。注意xi,yi可能为同一个人若最终可得出哪些是神则从小到大输出神的编号,并最终输出end否则输出no思路:经过简单推理原创 2014-08-22 12:37:15 · 2811 阅读 · 0 评论 -
POJ 2155 树套树—线段树套线段树
Matrix 楼教主出的题目。题意:一个矩阵初始值都为0,每次给“C X1 Y1 X2 Y2" 去反转这个矩阵。或者"Q X1 Y1"查询这个点是0/1。第一次接触树套树的题目。一句AC:对于基本的线段树,再在每个节点建一个y方向上的线段树。tree[n][m]这道题目更新的时候,对于X方向就是(X1,X2)这个区间,再在其上对Y1,Y2进行更新。对于查询,X方向上,自顶向下到原创 2014-10-29 10:00:32 · 1602 阅读 · 0 评论 -
poj 2352 stars (树状数组)
这个题目刚开始没读懂,以为就是二维树状数组求上角矩阵和。其实根本不用二维,因为数据已经有序,每次求的时候都是X方向上的比较。不过误打误撞也写了个离散化的代码。WA:#include#include #include #include#includeusing namespace std;#define N 15000int c[N][N],n,mm; int d[N];原创 2014-10-29 17:42:45 · 570 阅读 · 0 评论 -
poj 3321 Apple Tree(树状数组)
辉煌北大的月赛题质量真高啊,这种树状数组真难想到。树状数组的基本用法是区间,单点的应用,起初这个怎么都想不到如何套用到树状数组。转化方法是 将树上的节点信息查询,转为深度优先中节点顺序(代表结点编号)。进结点与出结点分别代表该结点管辖范围。题目大意级是说,给你一颗树,最初每个节点上都有一个苹果,有两种操作:修改(即修改某一个节点,修改时这一个节点苹果从有到无,或从无到有)和查询原创 2014-10-30 22:17:21 · 690 阅读 · 0 评论 -
poj 1195 Mobile phones(树状数组)
裸树状数组,关键在于二维的求和操作不要写错。getsum(u+1,v+1)+getsum(x,y)-getsum(u+1,y)-getsum(x,v+1);#include#include #include#include#include #include#includeusing namespace std;#define N 1050int n,m原创 2014-10-31 00:07:08 · 650 阅读 · 0 评论 -
poj 3067 Japan(线段树 | 树状数组)
题意:有M个城市到N个城市修高速,问这个过程会有多少个交叉点?这道题和Stars很像,基本一个模型。在纸上画一画会发现,按照一个(小到大)顺序下来,交点的个数是以另一边为数组,大于该数把所有路按照以东海岸变为起点u,西海岸为终点v保存下来。然后按照u从小到大顺序排序(v的顺序不重要)。排完序之后,依次枚举就相当于从西海岸的城市1开始依次开始建立连接一直到n为止。当处理到第i条边时,原创 2014-10-31 21:19:24 · 733 阅读 · 0 评论 -
POJ 2481 Cows(树状数组)
当前树状数组练习最后一道题。借此写一下常用模型。Stars Japan 等线段树,树状数组的题目除了非常裸的模版题目(敌兵布阵)。都是将几个属性值按照次序排列。完后,所求即是线性区间个数问题。看规模很少有二维的,利用序将多维降维。(这题刚开始将E-S也当作一个属性在考虑.....失误)这道题也是,对于S,E的次序调整好,将两个变量(E-S的这个其实是区间长度包含意思,本身并不影响)换好原创 2014-11-01 10:17:00 · 710 阅读 · 0 评论 -
学习 LCA&&RMQ
参考:点击打开链接 点击打开链接 点击打开链接(一些总结) 点击打开链接(不错的模板)题目:点击打开链接花了4天时间做完了这个专题,LCA的问题用处还是很大,同时能体会RMQ的ST算法中dp的味道.基本方法就是ST,LCA转RMQ,LCA的Tarjan,LCA倍增(这个可存储边权)这个专题后面四道题都非常好,推荐大家做做.细节:1. ST方法2^i 包含自己,因此其真原创 2015-02-13 09:32:56 · 1048 阅读 · 0 评论 -
BST最优二叉检索树(java版本)
这个内容是去年暑假讲的,但是一直没有实现,其实说白了就是区间dp,求一个序列构成二叉树,中序遍历有序.核心和其他区间dp一样,枚举中间值.然后枚举出来后再将整个区间的概率累加,因为相当于加深了一层.JAVA代码,附测试数据import java.util.Arrays;import java.util.Scanner;public class Main { /*原创 2015-04-10 10:09:37 · 1165 阅读 · 0 评论 -
AVL平衡树(详解)-JAVA/C版本
平衡二叉树在进行插入操作的时候可能出现不平衡的情况,AVL树即是一种自平衡的二叉树.它通过旋转不平衡的节点来使二叉树重新保持平衡,并且查找、插入和删除操作在平均和最坏情况下时间复杂度都是O(log n)AVL树的旋转一共有四种情形,注意所有旋转情况都是围绕着使得二叉树不平衡的第一个节点展开的。RBT VS AVL:实际上插入AVL树和红黑树的速度取决于你所插入的数据.如果你的数据分原创 2015-04-13 10:21:43 · 1206 阅读 · 0 评论 -
STL学习(multiset Vector)
Vector比数组好用多了,毕竟是可变长的. 常用来建图. 需要掌握的就是构造函数,添加数据,删除数据.#include<set>#include<ctime>#include<cmath>#include<cstdio>#include<vector>#include<cstring>#include<iostream>#include<algorithm>#define ma原创 2015-05-16 11:10:06 · 1421 阅读 · 0 评论 -
拓扑排序,树的直径模板(CF14D 枚举删边)
HDU4607 树的直径#include <stdio.h>#include <string.h>#include <iostream>#include <queue>#include <vector>using namespace std;#define N 100005#define INF 1<<30int n,dis[N],E;bool vis[N];vector<int原创 2015-05-27 08:57:15 · 905 阅读 · 0 评论 -
单调队列 单调栈总结
单调队列单调栈应用范围:原创 2014-10-20 19:56:06 · 4749 阅读 · 0 评论 -
树链剖分学习
解决的问题 对于给出的树上两点求之间的最值或者更新操作变为logn。其他方法 Tarjan求LCA的复杂度为 O(N+Q)所以不断更新复杂度太高。本质: 就是将树划分为不重合的多条链每条链都有一个线段树中的编号(可类比dfs序转换线段树的想法)+线段树。在求的过程中根据重链不断逼近再用线段树维护即可。 入门文章 练习题目一般有对点建树和对边建树两种方案,看题目要求。对第几条边进行操作这种情况原创 2015-06-03 08:40:50 · 641 阅读 · 0 评论 -
TopMap
经常有一种需求,是需要存储键值对,放入一个对象对应的使用次数。 然后需要获取前10%、20%等数据。如果进行Map的全量排序输出会非常慢,因此需要用TreeMap。包装后如下:@Test public void testHashMap() { Map<String, Integer> topMap = new HashMap<>(); List<String> li原创 2016-04-13 17:07:35 · 1119 阅读 · 0 评论 -
树链剖分(模版)
树链剖分是解决在树上进行插点问线,插线问点等一系列树上的问题假如现在给你一棵树,然后没两条边之间有一条权值,有一些操作,1:x---y之间的最大权值是多少,2:改变x---y之间的权值当前这样的操作有很多,如果直接用暴力的方法的话肯定不行,那么就要想一个好的方法,我们可以想一下能不能借助线段树解决,能不能想一种方法对树上的边进行编号,然后就变成区间了。那么我们就可以在线段树上进行操作了原创 2014-10-23 16:25:54 · 678 阅读 · 0 评论 -
HDU 1166 敌兵布阵 (树状数组入门)
树状数组的引入:对于查询和修改要求差不多,使用树状数组可以达到logN的复杂度红色矩形表示的数组C就是树状数组.这里,C[i]表示A[i-2^k+1]到A[i]的和,而k则是i在二进制时末尾0的个数,或者说是i用2的幂方和表示时的最小指数。所谓的k,也是该节点在树中的高度.修改第i个元素,为了维护数组C的意义,需要修改C[i]以及C[i]的全部祖先,而非C[i]的祖先的节点则对原创 2014-08-30 10:47:45 · 911 阅读 · 0 评论 -
BestCoder Round #16 Revenge of Segment Tree (树状数组)
今天第一次参加bc,虽然由于运动会耽误了时间,但还是开始做了题目。第一道题恰巧是最近做的树状数组类型,nlogn 复杂度。规律推算很简单。一个长度的区间累加过程中会消掉中间部分,区间长度的改变会导致减掉加上的部分改变。减掉的是最前面k-1,加上后面n-k+1个第二题一直没很好明白题意,虽然认为不难。起初没有用long long 溢出了两次,o(︶︿︶)o 唉 以后看到取模之类的直接原创 2014-11-01 21:14:20 · 544 阅读 · 0 评论 -
线段树入门(poj 3274 3468 2528)
概念:在一类问题中,我们需要经常处理可以映射在一个坐标轴上的一些固定线段,例如说映射在OX轴上的线段。由于线段是可以互相覆盖的,有时需要动态地取线段的并,例如取得并区间的总长度,或者并区间的个数等等。一个线段是对应于一个区间的,因此线段树也可以叫做区间树。线段树常用于区间多次插入查询,经常改变数据。而线段树的核心在于如何设计一个节点的信息这里针对线段树的应用有三个方面:1.原创 2014-08-23 15:16:15 · 720 阅读 · 0 评论 -
POJ 1151 Atlantis(线段树+离散化+扫描线)
题目很短,大意为有多个矩形求合计面积。(会有重叠,要剔除)1.线段树,将y轴当作线段,然后在计算的时候从x轴扫描过去2.数据离散化,而这里区别于前面的题目,只有有区间才可能有长度,所以这里的叶子节点不是l=r,而是l+1=r3.扫描线,这是我最郁闷的一个地方。刚开始不理解。其实质上是从x轴扫描过去,(把一段段平行于y轴的线段表示成数组 )遇到了看线段树中的标记位。若大于0则为正,表明覆原创 2014-08-24 20:42:01 · 645 阅读 · 0 评论 -
字典树的多种实现方法
姿势1:静态数组形式struct Trie { int ch[maxnode][sigema_size],val[maxnode],sz; Trie() {sz=1;memset(ch[0],0,sizeof(ch[0]));memset(val,-1,sizeof(val));} void insert(bign s,int v) {转载 2014-10-16 15:36:30 · 601 阅读 · 0 评论 -
(高斯消元)HDU 5006 Resistance 2014 鞍山网赛
题目链接题意:有一个电路,用0/1的电阻连接起来。给定两点,问之间的电阻为多少?先回忆一下中学物理知识,若用并联串联去做,碰到复杂电路根本分析不清。这里用到基尔霍夫定理。在任一瞬时,流向某一结点的电流之和恒等于由该结点流出的电流之和。在任一瞬间,沿电路中的任一回路绕行一周,在该回路上电动势之和恒等于各电阻上的电压降之和。那么我们对于图中的点(电阻为0的看作一个点原创 2014-10-17 10:06:35 · 1269 阅读 · 3 评论 -
POJ 1470 LCA tarjan 离线算法
这里有个讲解非常明白,虽然没证明。点击打开链接 还有个数据结构的学习 点击打开链接 伸展树/Treap/划分树/ 归并树步骤:tarjan算法的步骤是(当dfs到节点u时):1 在并查集中建立仅有u的集合,设置该集合的祖先为u1 对u的每个孩子v: 1.1 tarjan之 1.2 合并v到父节点u的集合,确保集合的祖先是u2 设置u为已遍历3原创 2014-10-19 21:21:10 · 692 阅读 · 0 评论 -
并查集(含关系并查集)
并查集用来判断元素是否在同一集合中,原创 2014-07-12 15:48:43 · 916 阅读 · 0 评论 -
HDU 1325 POJ 1308 Is It A Tree? (并查集)
这道题就是裸并查集,关键在于对不是树几种的判断1. 空树是树 2. 森林不是树 3. 无环或者从入度来看:1,无环;2,除了根,所有的入度为1,根入度为0;3,这个结构只有一个根,不然是森林了。这道题本来暑假做的POJ 1308 但是HDU没有过。在于空树没有考虑。用并查集判断有多少个森林注意编号是随机的,不是次序..../*input:0 01 1 0 0原创 2014-11-04 20:41:43 · 748 阅读 · 0 评论 -
hdu 4417,poj 2104 划分树(模版)归并树(模版)
这次是彻底把划分树搞明白了,与此同时发现了模版的重要性。写程序一个字符都不能错啊~~~划分树详解:点击打开链接题意:求一组数列中任意区间不大于h的个数。这个题的做法是用二分查询 求给定区间内的中值再与K进行比较。重点介绍划分树:数据结构:t[20][maxn] // 树结构,划分树存储sum[20][maxn] // 记录该行[l,i] 中i到原创 2014-10-18 11:10:45 · 955 阅读 · 0 评论 -
POJ 3253 Fence Repair 题解(优先队列实现哈夫曼树)
题目大意:一个农夫用一根长木板切成若干自己原创 2014-08-18 09:49:11 · 610 阅读 · 0 评论 -
POJ 2777 count color(线段树,lazy标记)
这里有一个思想:我们在更新的时候不必要更新到叶子节点,只要更新到当前区间包含线段树区间即可。设计一个标志位,更新到此。A Simple Problem with Integers 也是一个类似的题目设计两个函数push_down 将结点信息传递到下层节点(inc, sub,)push_up 将下层节点信息反馈到上层(max,min,count)#i原创 2014-10-19 10:52:27 · 1020 阅读 · 0 评论 -
线段树小结
感觉以后什么东西如果说你学精了,那么是否能有一句通俗的话表达出来,然后再说细节问题。原创 2014-10-17 21:25:39 · 612 阅读 · 0 评论 -
K-th Number (划分树学习)
刚开始的朴素想法,也就是老师上课说的部分快排。但原创 2014-07-10 22:56:41 · 675 阅读 · 0 评论 -
Ultra-QuickSort 学习归并排序(树状数组+离散化)
以前学习归并排序,只是很简单的知道其思想,约莫老万的就是开辟原创 2014-07-07 09:42:48 · 620 阅读 · 0 评论 -
HDU 1754 I Hate It(线段树,单点更新,线段查询)
这道题是线段树入门题,其问题是单点更新,线段查询。这里本来还打算用lazy标记做一下,但是不行,必须更新到单点#include #include #include #include #include #include #include #include #include #include #include #include #include using n原创 2014-10-19 10:01:39 · 689 阅读 · 0 评论 -
HDU 5147 BestCoder #23(树状数组区间 前缀和,后缀和)类似LA4329
类似LA43291..n个数字放到n个格子中,求四元组满足(a,b,c,d) a这道题刚开始看就知道要用树状数组去做,起先想的是枚举a,c 这样的话复杂度n^2 必然TLE而且a,c之间大于a的数字也无法统计。题解:枚举c点。然后得到c之前满足a,b的数量再乘上比c大的d 的数量就是枚举c此时的数量。这里用了一个子问题的技巧,当枚举c到i点的时候,i-1的情况已知,即存储原创 2014-12-21 08:55:17 · 813 阅读 · 0 评论 -
AVL平衡树(详解)-JAVA版本
平衡二叉树在进行插入操作的时候可能出现不平衡的情况,AVL树即是一种自平衡的二叉树.它通过旋转不平衡的节点来使二叉树重新保持平衡,并且查找、插入和删除操作在平均和最坏情况下时间复杂度都是O(log n)AVL树的旋转一共有四种情形,注意所有旋转情况都是围绕着使得二叉树不平衡的第一个节点展开的。RBT VS AVL:实际上插入AVL树和红黑树的速度取决于你所插入的数据.如果你的数据分原创 2016-11-17 16:52:04 · 598 阅读 · 0 评论