数据结构
文章平均质量分 65
acraz
这个作者很懒,什么都没留下…
展开
-
POJ 2823 Sliding Window(单调队列)
单调队列顾名思义就是单调的队列(双端队列),单调队列的操作有头出,尾进尾出。 维护单调递增队列思路是:对于当前要添加的元素a,一直从队尾抛出元素直到队尾元素小于(或小于等于,看题而定)元素a,然后把a添加到队尾。然后每次从队首取出最小值。 所以求最小值维护单调递增队列,同理可知求最大值维护单调递减队列。 #pragma warning(disable:4996) #include usin原创 2015-08-28 21:09:14 · 339 阅读 · 0 评论 -
POJ 1703 Find them, Catch them(经典并查集)
并查集的经典问题,我用到的是并查集的经典方法。。就是用relation数组记录与根节点的关系,例如relation[i]=1表示i跟i的根节点在同一个集合,relation[i]=0表示i跟i的根节点不在同一个集合。 然后就可以方便的查询他们之间的关系了。 主要是在find和union函数里面要对relation数组的修改,这个修改要自己在不同的题目中细心找出,,,因为找错一次wa了一次,fin原创 2015-09-14 22:10:38 · 287 阅读 · 0 评论 -
POJ 1724 ROADS(费用最短路:优先队列+BFS)
题目意思很简单,就是求费用最短路,数据比较小,考虑暴力bfs。 状态定义为(花费,最短路,终点)的一个三元组。 优先队列按照最短路长度排序,每次从队列里取出最短路长度最短的状态,然后把跟该状态终点相邻的点加入队列。因为数据比较小,所以不用记录访问情况也能ac。 #pragma warning(disable:4996) #include #include #include #inclu原创 2015-09-09 12:34:42 · 402 阅读 · 0 评论 -
hihoCoder 1079 离散化(线段树离散化)
根据提示我们要给长度为L的区间建立线段树,但是L很大,所以不能直接对L建树。 转化一下就是一共n个区间,最多2*n个点,所以我们可以使用较小的2*n个数来代替这些比较大的数而保证他们的相对大小不发生变化。然后我们就可以对长度为2*n的区间建立线段树了。 然后需要注意的一点是离散的线段树结点为[i,i],左儿子区间为[l,mid],右儿子区间为[mid+1,r]。 但是对于连续的区间线原创 2015-08-21 19:00:35 · 308 阅读 · 0 评论 -
UVA 11987 Almost Union-Find(带删除操作的并查集)
删除操作: 找一个新点代替旧点,,之后对旧点的所有操作都转移到新点上来。旧点的影响消失。 #pragma warning(disable:4996) #include #define N 200001 using namespace std; int sum[N], cnt[N], fa[N], id[N]; int SIZE; void init(int n){ for (原创 2015-08-03 18:59:41 · 341 阅读 · 0 评论 -
POJ 3250 Bad Hair Day(单调栈)
单调栈其实很简单,,不懂的阔以先移步了解一下 #include #include using namespace std; //本题要求每头牛看到多少头牛的和,, //可以转化为每头牛被多少头牛看到的和。 //然后就可以用单调递减栈解决问题了 stacks; int main(){ long long n, ans = 0, num; cin >> n; for (int原创 2015-08-03 17:05:48 · 312 阅读 · 0 评论 -
POJ 2492 A Bug's Life(扩展并查集)
#pragma warning(disable:4996) #include #include #include #include using namespace std; //扩展并查集 int fa[2001], relation[2001]; //同性为0,异性为1 int find(int x){ if (x == fa[x])return x; int tmp = fa[原创 2015-08-03 16:22:55 · 265 阅读 · 0 评论 -
UVA 11997 K Smallest Sums(优先队列)
#pragma warning(disable:4996) #include #include #include #include using namespace std; int a[751][751]; int k; //归并思路: //归并两个有序的数组A[],B[] //首先把所有的A[i]+B[1]放入优先队列,然后开始取出 //每次取出优先队列里的top时,例如top=A[原创 2015-08-02 15:23:05 · 312 阅读 · 0 评论 -
CodeForces 295A Greg and Array(线段树)
#include #define LL long long using namespace std; const int N = 100001; //两颗线段树维护一下就OK了 struct seg{ LL a[N], add[N << 2], sum[N << 2]; int l[N << 2], r[N << 2]; void pushDown(int i){ add[i *原创 2015-08-02 21:32:49 · 330 阅读 · 0 评论 -
POJ 1862 Stripies(优先队列)
#pragma warning(disable:4996) #include #include #include #include using namespace std; //思路: //每次都去最大的两个碰撞,最后得到的一定最小 //证明: //假设有a,b,c,答案是d,,那么d=2*sqrt(2*sqrt(a*b)*c) //d*d=8*sqrt(a*b*c*c)可知c的贡献比a原创 2015-08-02 15:54:27 · 314 阅读 · 0 评论 -
hihocoder 1074 字体设计(RMQ问题,ST算法)
题意: 抽象一下问题,现在给出输入数组 a, 定义 ax 可以被 al 和 ar 插值得到为: 存在 l x r 使得 al ≤ ax ≤ ar 或者 al ≥ ax ≥ ar。 求最少的「锚固」(固定)元素的数目,使得非锚固元素都可以由其左右最靠近它的锚固元素插值得到。并输出锚固元素的下标。 思路: 先找到整个数组的最大值和最小值,假设最小值角标 i原创 2015-08-07 10:39:47 · 489 阅读 · 0 评论 -
HDU 1541 Stars (树状数组)
根据题意我们要维护前n-1个点中按照x值排序的前缀和,那么我们就可以用树状数组来维护一个大小为32000+的数组的前缀和,然后logn的更新,logn的查询就能过了。 #pragma warning(disable:4996) #include #include #include using namespace std; const int M = 32005; const int N =原创 2015-09-20 08:22:28 · 272 阅读 · 0 评论