
数据结构
oranges_c
落寞是岁月的痕迹
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
PAT(A)1111 Online Map (30)(最短路)
题目大意: 给你n个点,m条路。 接下来m行,V1 V2 one-way length time one-way 表示是不是单向边,1是0否 求最短和最快的距离和时间 并输出路径。 如果路径不一样,则按一下格式输出 Distance = D: source -> v1 -> … -> destination Time = T: source -> w1 ->原创 2016-12-06 17:59:15 · 731 阅读 · 0 评论 -
优先队列的优先级定义
这是stl里定义的比较结构 我们都知道用greater是小顶堆,less是大顶堆,默认是less。/// One of the @link comparison_functors comparison functors@endlink. template<typename _Tp> struct greater : public binary_function<原创 2017-03-20 17:04:00 · 1894 阅读 · 0 评论 -
PAT(A)-1102. Invert a Binary Tree (25)(数据结构+bfs)
题目链接题目大意: 给你n个点的树,让你输出层序和中序遍历序列。#include <bits/stdc++.h>using namespace std;#define ALL(v) (v).begin(),(v).end()#define cl(a,b) memset(a,b,sizeof(a))#define clr clear()#define pb push原创 2017-03-10 20:11:22 · 315 阅读 · 0 评论 -
PAT(A)-1126. Eulerian Path (25)(欧拉图的判断)
题目链接题目大意: 给你一个图,判断是欧拉回路,还是不是欧拉回路的欧拉通路,还是不是欧拉图。#include <bits/stdc++.h>using namespace std;#define cl(a,b) memset(a,b,sizeof(a))typedef long long LL;const int INF = 0x3f3f3f3f;const in原创 2017-03-07 20:35:11 · 292 阅读 · 0 评论 -
PAT(A)-1127. ZigZagging on a Tree (30)(树的重建)
题目链接题目大意: 给你一颗二叉树的中序和后序。 要你输出指定顺序的序列。又是树的重建。。 输出的序列跟层序差不多,判断一下是否逆序存放就行了。PS:这次春季,水的一匹。。这树的重建出了不知道多少遍。。#include <bits/stdc++.h>using namespace std;#define cl(a,b) memset(a,b,sizeof(a))#原创 2017-03-07 20:39:55 · 872 阅读 · 0 评论 -
PAT(A)-1099. Build A Binary Search Tree (30)
题目链接题目大意: 一棵二叉排序树,有n个点,告诉你每个点的左右儿子编号; 给你n个值。 确定每个值所在的位置。输出层序序列。先将值排好序。 从根节点开始递归建树。 每次确定当前点在当前区间排第几,也就是要知道当前点的左子树上有多少个点。搜索一遍即可。#include <bits/stdc++.h>using namespace std;#define fi f原创 2017-03-21 17:41:01 · 257 阅读 · 0 评论 -
2017浙理工校赛重现-G.最佳淘汰算法(优先队列模拟)
题目链接要先预处理一下每一个值的下一个相同值的位置。注意要把各元素放在一个结构里,在用优先队列进行排序。 之前分开放一直过不了。#include <cstdio>#include <iostream>#include <cstring>#include <algorithm>#include <vector>#include <queue>using names原创 2017-03-22 15:34:06 · 647 阅读 · 0 评论 -
PAT(A)-1123. Is It a Complete AVL Tree (30)(AVL+bfs)
题目链接题目大意: 给你n个值,建一棵AVLtree,输出这棵树的层序遍历,并问这棵树是否是完全二叉树其实只要搞清楚LL旋转就可以推出其余三种旋转了。 我觉得代码说的还是很清楚的,看具体的代码吧。 还是不懂的话可以参考这里 不过链接里代码有两处有点问题,认真的看的话看的出来的。#include <bits/stdc++.h>using namespace std;原创 2017-03-13 20:01:46 · 294 阅读 · 0 评论 -
PAT(A)-1129. Recommendation System (25)(优先队列)
题目链接题目大意: 给你n个数和k大小的空间。 在每次访问第i个数之前,先输出第i个数之前k个按出现次数从大到小排列后的数,如果次数相同则按数的大小从小到大输出。用一个优先队列来维护,每次输出前k个。 几个数组: vis[i] := 表示i是否在前k个输出的数里 use[i] := 表示i是否之前出现过。 对于每一个访问的数(除了第一个),先输出前k个,不满k个则原创 2017-03-24 13:21:45 · 493 阅读 · 0 评论 -
PAT(A)-1130. Infix Expression (25)(树的中序遍历)
题目链接题目大意: 给你n个点的值以及左右孩子编号。 输出表达式。遍历的时候,如果是叶子节点的就不需要给左右括号 输出的时候去掉最外面的一对括号。 注意n==1的情况#include <bits/stdc++.h> using namespace std;#define cl(a,b) memset(a,b,sizeof(a))#define clr clear原创 2017-03-24 13:28:39 · 432 阅读 · 0 评论 -
hiho一下-第104周-平衡树·Splay
题目链接这题可以直接用set做。 这里记下模板。#include <bits/stdc++.h>using namespace std;#define MINK 0#define MAXK 1000000001struct Node{ Node *father,*left,*right; int v; Node(int k, Node* f)原创 2017-03-16 18:56:59 · 360 阅读 · 0 评论 -
团体程序设计天梯赛-练习集-L2-018. 多项式A除以B
题目链接不给数据范围。让我说什么好。。我还犹豫了半天要不要用数组。。 最后想了想,算了用数组暴力一发。。 结果就过了。。就是两个循环; 第一重枚举a多项式的头 第二重进行计算 PS:大区赛时敲得代码。略丑。#include <bits/stdc++.h>using namespace std;#define cl(a,b) memset(a,b,sizeof(a)原创 2017-03-26 16:37:29 · 1049 阅读 · 0 评论 -
之江学院第0届校赛-H.qwb与学姐(最大生成树+lca)
题目链接一开始看到这题,想的是最大生成树+树链剖分+线段树。时间复杂度大概是O(mlogm+n+nlogn+klogn)O(mlogm+n+nlogn+klogn) 然而貌似是因为线段树的常数大然后炸了。。(不会zkw线段树,待学。orz然后题解说的是最大生成树+倍增法lca 就是创建一个数组 dis[i][j]:=表示i点跟它的第2j个祖先之间路径的最小值dis[i]原创 2017-06-03 13:54:47 · 465 阅读 · 0 评论 -
zkw线段树
网上好多zkw线段树版本都是错的。。坑啊。 主要是连zkw的ppt上都是不完整和有错误的。统计的力量结点信息struct Node{ int sum,mx,mn;}T[maxn<<2];int M,a[maxn];建树void build(int n){ for( M = 1; M <= n+1; M <<= 1); for( int i = M + 1;原创 2017-06-22 16:02:29 · 655 阅读 · 0 评论 -
Codeforces 831-E.Cards Sorting(线段树)
题目链接题目大意:给你一个n(1≤n≤100000)个数的序列,a1,a2,...,an(1≤ai≤100000)循环遍历数组,当当前数是序列里的最小值时删除这个数,问需要遍历多少次才能使数组为空。原创 2017-07-17 12:31:18 · 372 阅读 · 0 评论 -
【HDU6183】Color it(线段树)
Do you like painting? Little D doesn't like painting, especially messy color paintings. Now Little B is painting. To prevent him from drawing messy painting, Little D asks you to write a program to maintain fol原创 2017-09-02 13:54:47 · 1566 阅读 · 2 评论 -
【HDU3966】Aragorn's Story(树链剖分+线段树)
树链剖分用一句话概括就是:把一棵树剖分为若干条链,然后利用数据结构(树状数组,SBT,Splay,线段树等等)去维护每一条链,复杂度为O(logn)那么,树链剖分的第一步当然是对树进行轻重边的划分。定义size(x)为以x为根的子树节点个数,令v为u的儿子中size值最大的节点,那么(u,v)就是重边,其余边为轻边。当然,关于这个它有两个重要原创 2017-02-03 17:00:38 · 548 阅读 · 0 评论 -
【BZOJ1036】[ZJOI2008]树的统计Count(树链剖分+线段树)
题目链接 Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w。我们将以下面的形式来要求你对这棵树完成 一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值 III. QSUM u v: 询问从点u到点v的路径上的节点的权值和 注意:从点u原创 2017-02-03 18:44:53 · 317 阅读 · 0 评论 -
PAT(A) 1119 Pre- and Post-order Traversals (30)(数据结构)
发现今年秋季的好简单。。亏了。应该都写过知道中序和先序或者后序的一个然后重建树。题目大意: 给你二叉树的先序和后序遍历序列。输出任意一种中序遍历序列(不唯一)。知道先序和后序很容易知道根节点,然后从先序的根结点往后 和 后序序列的开头往后找按升序或降序排列后一样的序列,然后递归建树。#pragma comment(linker, "/STACK:1024000000,102原创 2016-12-06 15:45:20 · 442 阅读 · 0 评论 -
【UESTC1060/ZCMU1783】秋实大哥与快餐店(字典树)
PS: 一道字典树问题,纯粹考数据结构,涉及建树与匹配。 今年校赛的一道题。。 还好学长队友强,一看就给了思路,然后就由作为主键盘手的我来敲。 用键盘敲的时候有点忐忑,后来用手写了下,就有了信心。 RE了一发,2Y.———————–分割线————————- 就是把菜的编号转化成21位的二进制数,不够补零。 然后就是插入,节点的值左0右1,根节点不放数。叶子节点放原创 2016-12-23 14:54:04 · 560 阅读 · 1 评论 -
【POJ2763】Housewife Wind(树链剖分+线段树(基于边权))
题目链接 题目大意: n个点,m个操作,初始位置为s 有两个操作: 1.ope to :输出从s到to的路径长度,并将to赋值给s 2.ope i v :将第i条边的长度改为v基于边权,要将边权转化为点权。 将这条边的值作为这条边两端点深度大的点权即可 接着用线段树维护即可。 PS:差点wa到吐血。。#include <cstdio>#include <cs原创 2017-02-04 15:41:37 · 303 阅读 · 0 评论 -
【POJ3237】Tree(树链剖分+线段树(基于边权))
题目链接 题目大意: 有T组数据 给你n个点的树 有三种操作: 1.CHANGE i v :将第i条边的值改为v 2.NEGATE a b :将a点到b点路径上的边权取反 3.QUERY a b :查询a点到b点路径上最大的边权值由于有取反操作,我们记录最大值的同时记录下最小值 如果要取反,则将最大最小值取反并交换即可 用线段树维护注意懒惰标记原创 2017-02-04 17:18:50 · 576 阅读 · 0 评论 -
【SPOJ】QTREE - Query on a tree(树链剖分+线段树(基于边权))
题目链接 题目大意: 给你n个点树,有两种操作 1.CHANGE i ti :将第i条边的值改为ti 2.QUERY a b :查询a点到b点的路径上的最大值跟上题类似,不过这题还简单点,没有取反操作。 直接套就行了。#include <cstdio>#include <cstring>#include <algorithm>using namespace原创 2017-02-04 17:30:27 · 336 阅读 · 0 评论 -
【POJ3253】Fence Repair(优先队列+贪心)
题目链接 题目大意: 将一块长度为L的木板切割为两块,花费为L,切割后的两块木板的长度和为切割前的长度。给你N个切割后的木板的长度,问最小花费是多少。书上的一道贪心题。用huffman编码的思想贪心,感觉挺有趣的。 我们可以考虑将两块合并成一块木板,花费为合并后的木板的长度。 根据huffman思想,每次选取长度最小的两个合并,以此贪心,最后可以保证花费最少。如何选取原创 2017-02-07 14:42:48 · 503 阅读 · 0 评论 -
Codeforces Round #390 (Div. 2)-DFedor and coupons(优先队列)
题目链接 题目大意: 给你n个区间,问k个区间相交的最大区间。PS:这类题型貌似挺经典。用优先队列去维护很方便。 把区间按左端点从小到大排序。 创建一个优先队列,默认是大顶堆,但我们要维护区间右端点的最小值 所以只需把区间右端点取负数即可。 判断区间相交大小只需用到队头与当前的区间。#include <bits/stdc++.h>using namespace原创 2017-01-08 13:30:56 · 271 阅读 · 0 评论 -
【POJ2155】Matrix(二维树状数组)
题目链接 题目大意: 给你n*n的矩阵初始为0,有T次操作 两种操作: 1.C x1 y1 x2 y2 修改(x1,y1)到(x2,y2)的子矩阵值,即0变1,1变0 2.Q x y 查询(x,y)的值树状数组有两种应用。跟线段树类似 1.单点修改,区间查询 2.区间修改,单点查询具体的证明及解释戳我#include <cstdio>#include <ios原创 2017-02-08 14:21:34 · 275 阅读 · 0 评论 -
Codeforces Round #396 (Div. 2)-D. Mahmoud and a Dictionary(关系并查集)
题目链接 题目大意: n个单词,m个关系,q次查询 有两种关系: 1 a b表示a,b两个单词同义 2 a b表示a,b两个单词反义 如果关系跟之前的关系冲突则无视当前关系 每次查询问两个单词属于1还是2,都不属于则输出3一看就发现跟poj1703和poj1182两道关系并查集很像,,可以说是结合后的题。 这里我把关系1,2变成0,1刚好是%2后的数PS:为什原创 2017-02-08 16:48:30 · 382 阅读 · 0 评论 -
团体程序设计天梯赛-练习集-L2-012. 关于堆的判断(小顶堆)
题目链接这里建堆要每输入一个值就插入并且向上调整 在堆顶设置一个哨兵会省点操作 还要注意值有负数,在处理字符串的时候要注意。(之前一直不知道哪里有问题,后来才发现负数忘了处理,一直过不了)#include <cstdio>#include <iostream>#include <cstring>#include <string>#include <algorith原创 2017-02-19 18:01:17 · 1031 阅读 · 0 评论 -
团体程序设计天梯赛-练习集-L3-002. 堆栈(线段树-区间第k大)
题目链接其实可以套主席树求动态的区间第k大。但是这里规定了范围[1,100000] 我们可以建立一颗线段树,线段树的节点值表示在这个区间内数的出现次数的总和 比如区间为[2,2]的节点的值为2的出现次数 这样相当于对整个栈序列排了个序。 然后我们可以用二分的方法查询区间第k大。 这里的k就是当前栈序列大小的中值#include <cstdio>#include <原创 2017-02-19 18:08:59 · 706 阅读 · 0 评论 -
团体程序设计天梯赛-练习集-L2-007. 家庭房产(并查集)
题目链接 并查集的略微扩展,用Size数组记录人数,num数组记录房产数,area数组记录面积 就是处理起来会有点麻烦。#include <cstdio>#include <iostream>#include <cstring>#include <string>#include <algorithm>#include <vector>#include <set原创 2017-02-11 16:39:28 · 578 阅读 · 0 评论 -
主席树笔记
给几个链接。 http://www.cnblogs.com/oyking/p/3230296.html http://blog.youkuaiyun.com/metalseed/article/details/8045038 http://www.cnblogs.com/Rlemon/archive/2013/05/23/3094635.html等以后再来完善。。原创 2017-01-27 16:28:18 · 548 阅读 · 0 评论 -
主席树模板题
POJ2104 POJ2761 HDU2665 题意都是区间求第k小主席树插入是按数组序列从小到大后排名的插入。 所以之后查询才可以按左右子树的个数递归查询#include <cstdio>#include <iostream>#include <algorithm>using namespace std;const int maxn = 100000 + 1原创 2017-01-29 17:53:02 · 632 阅读 · 0 评论 -
51nod-1682 中位数计数
题目链接考虑如何计算一个数的答案: 定义一个b数组,把所有大于自己的值定义为1,小于自己的值定义为-1,等于自己的定义为0。 如果包含这个数的区间这个数是中位数,则定义后的总和为0。 考虑前缀和,那么问题就变成了在这个数两边有多少对相等的数。 可以先把左边的数统计一下,右边的数就可以O(1)O(1)查询,时间复杂度O(n)O(n) 总时间复杂度O(N2)O(N^2)原创 2017-03-02 21:02:33 · 308 阅读 · 0 评论 -
【Wannafly挑战赛10】D.小H的询问(线段树的区间合并)
链接:https://www.nowcoder.com/acm/contest/72/D来源:牛客网小H给你一个数组{a},要求支持以下两种操作:1. 0 l r(1<=l<=r<=n),询问区间[l,r]中权值和最大的有效子区间的权值和,一个子区间被认为是有效的当且仅当这个子区间中没有两个相邻的偶数或者奇数。2. 1 x v(1<=x<=n,-109<=v<=109),将a[x]的值修改为v。原创 2018-02-28 13:50:31 · 544 阅读 · 0 评论