数据结构
文章平均质量分 72
omsobliga
这个作者很懒,什么都没留下…
展开
-
673 - Parentheses Balance
简单括号匹配问题#include #include #include #include using namespace std;int main(){ int n; scanf("%d",&n); getchar(); char stack[130]; int top; for(int cas=0;cas<n;cas++) { memset(stack,0,siz原创 2012-01-19 00:24:54 · 435 阅读 · 0 评论 -
POJ 1442 Black Box(堆实现)
/*题意:ADD(a)表示向集合中增加元素a,get表示取出第k小元素,k根据get出现的次数不断变化,出现多少次取第几小数题解:每次取第k小元素,k不断更新。使用两个堆,来完成。小顶堆负责,选出最小的元素大顶堆负责,选出k个元素中最大的元素,即第k小元素*/#include using namespace std;const int nMax = 30010;int tre原创 2012-08-15 20:18:45 · 658 阅读 · 0 评论 -
HDU 4006 The kth great number(优先队列、堆实现)
/*题意:"I"表示输入数据,"Q"表示输出第k大数据题解:优先队列,从大到小,队列中只需要k个元素。每次输出最小的即可我用小顶堆实现,如果插入元素比tree[1]小,则直接舍掉。否则,更新。*/#include using namespace std;const int nMax = 1000010;int tree[nMax];int n, k;void build(原创 2012-08-14 21:40:18 · 742 阅读 · 0 评论 -
POJ 3250 Bad Hair Day(单调队列)
/*题意:第i头牛,只能看到它右边比他矮的牛的牛头,问所有的牛能看到牛头总数题解:从后往前搜索,队列中存储牛的最高身高,到第i头牛的时候,对队列进行一次搜索,找到比第i头牛高的牛的最小身高和所在位置j,这样j - i - 1就是第i个牛能够看到的牛头数*/#include using namespace std;const int nMax = 80010;const int I原创 2012-08-10 09:49:52 · 546 阅读 · 0 评论 -
HDU 3415 Max Sum of Max-K-sub-sequence(单调队列)
/*AC思路:使用sum[i]存储前i个序列之和,队列中存储区间内出现过最小序列和,这样只需要sum[i]前去最小序列和即可。*/#include using namespace std;const int nMax = 100010;const int INF = 0x7fffffff;int A[nMax];int sum[2 * nMax];//这里需要增倍struct Q原创 2012-08-09 19:54:36 · 1256 阅读 · 0 评论 -
POJ 2823 Sliding Window(单调队列)
/*单调队列适合解决的问题,多次查询k个连续序列中最大或最小值。可以将复杂度从O(n*n)缩短到O(n)。实现模式:队列实现,只不过其中元素单调(依次增大或减小),我们假设求最大值。入队时比较队尾元素与插入元素的大小,如果队尾元素小与插入元素,则对尾元素出对,直到大于等于位置。这样插入k个元素后,队列中队首即为最大值。继续进行第二次查询时,需要比较队首元素在原来元素中的位置,判断是否在这次原创 2012-08-09 11:29:44 · 487 阅读 · 0 评论 -
线段树
谈对线段树的理解:线段树又称(区间树),实质就是:树中节点可表示一个区间,所以称为区间树更合适一些。节点中可添加适当的数据来实现相应的一些操作,每个节点的数据都是建立在左子树和右子树之上。这样做的目的使查找效率从O(n)降为O(log(n))线段树的模型:适用与使用线段树解决的问题:某些数据需要按区间进行区分,按区间进行修改,而且需要多次按区间进行查询。例如多次查询第k小元素,原创 2012-04-20 18:17:59 · 781 阅读 · 0 评论 -
HDU 1251 统计难题(很基础的Trie)
/*一道很基础的Trie树的问题过了,不过200ms,使用静态数组实现可能效果更好一些*/#include #include #include #include using namespace std;const int SonNum = 27;int T, N;struct Trie{ Trie *next[SonNum]; int num; Trie() {原创 2012-08-23 23:05:46 · 563 阅读 · 0 评论 -
POJ 3630 Phone List(Trie树,静态数组实现)
/*这道题动态分配内存会超时先建图,建图完成后,再判断,这样不容易出错*//*解法一:Trie树,静态数组实现*/#include #include const int nMax = 200000;struct Trie{ Trie *next[10]; int count;}trie[nMax];int pos;void buildTrie(char *原创 2012-09-03 20:46:07 · 803 阅读 · 0 评论 -
排序算法
冒泡排序,稳定,复杂度n*n选择排序,不稳定,复杂度n*n不稳定:快速排序,递归实现,不稳定,复杂度n*log(n),空间复杂度堆排序,大小顶堆实现,不稳定,复杂度n*log(n)稳定:在快速排序中添加另外一个控制变量合并排序,两个有序队列合并1、快速排序示例//快速排序示例#include #include int p[50];int le原创 2013-04-18 09:05:41 · 894 阅读 · 0 评论 -
hdu 1556 Color the ball(线段树的另一种应用)
/*线段树这道题做完以后,收获很大,学到了线段树的另一种应用:如果需要对某个区间内所有元素进行同样操作,则只需要对线段树上对应区间进行操作即可。统计每个气球被涂次数,只需要匹配到线段树的对应的区间即可,不需要统计到叶子节点。否则会超时,在最后统计结果的时候则需要搜索到叶子节点。即:①处的作用*/#include using namespace std;const int nM原创 2012-08-22 22:08:15 · 897 阅读 · 1 评论 -
HDU 1754 I Hate It(线段树)
/*标准的线段树模板*/#include using namespace std;const int nMax = 200010;struct Node{ int l, r; int max; Node(){} Node(int l, int r, int max):l(l), r(r), max(max){}}node[nMax * 4];int A[nMax];i原创 2012-08-22 22:20:37 · 579 阅读 · 0 评论 -
表达式求值
Description 给出的表达式全为合法的四则运算表达式,含括号。Input 每行一个表达式,数字全为int型整数,长度不超过100字符Output 输出表达式的值,一律保留小数点后4位。Sample Input11+2-1+2-1+(-2)Sample Output1.00003.00001.0000-3.原创 2012-03-27 10:35:16 · 553 阅读 · 0 评论 -
101 - The Blocks Problem
#include #include #include #include using namespace std;const int Max=30;struct node{ int stack[Max]; int top;//+1 node():top(0){}}s[Max];int n;void init(){ for(int i=0;i<n;i++) s[原创 2012-01-19 00:23:05 · 440 阅读 · 0 评论 -
133 - The Dole Queue
#include #include int main(){ freopen("data.in","r",stdin); freopen("data.out","w",stdout); int N,k,m; int q[25]; while(scanf("%d%d%d",&N,&k,&m)) { if(N==0 && k==0 && m==0) break; mems原创 2012-01-19 00:26:01 · 410 阅读 · 0 评论 -
127 - "Accordian" Patience***
//栈的模型,后进先出//题不是很难,关键涉及什么数据结构要想清楚//细节处理,考虑全#include #include #include #include #include using namespace std;int len;typedef struct{ char face_value; char suit;}Card;struct Rank{ Card ca原创 2012-01-19 00:16:36 · 430 阅读 · 0 评论 -
10152 - ShellSort
//找规律题//从后向前找升序的第一个值,把它及其它之前的全部输出……#include #include #include #include using namespace std;int main(){ //freopen("data.in","r",stdin); int T; scanf("%d",&T); while(T--) { int n; vecto原创 2012-01-20 23:13:07 · 426 阅读 · 0 评论 -
10050 Hartals
//简单找规律题,一边AC#include #include int main(){ /* freopen("data.in","r",stdin); freopen("data.out","w",stdout); */ bool h[3700]; int t,n,p; scanf("%d",&t); while(t--) { memset(h,0,sizeof(h)原创 2012-01-19 23:33:03 · 468 阅读 · 0 评论 -
442 - Matrix Chain Multiplication***
//题目刚做是思路出现了问题,栈中元素只需要row 和column 即可。//字典可以包含一个char,但更好的做法是将char型转换成下标//新函数append()#include #include #include #include using namespace std;struct Type{ int row; int column; Type():row(0),c原创 2012-01-20 23:12:12 · 448 阅读 · 0 评论 -
判断表达式是否合法(推荐:*****)
Problem D: 表达式Time Limit: 1 Sec Memory Limit: 4 MBSUBMIT: 375 Solved: 31[SUBMIT][STATUS]Description设S是一个合法的表达式,E为一个数字字符序列,则合法的表达式可以表示为:E, +E, -E, (S),+(S),-(S),S+(S),S-(S),S*(S原创 2012-03-21 16:56:55 · 1998 阅读 · 0 评论 -
11234 - Expressions*****
/*题意:根据后缀表达式,输出使用队列实现相同效果的序列需要用到栈、队列、二叉树*///无指针,推荐,可是未通过!!!#include #include #include #include #include #include using namespace std;const int kMax=10007;struct Node{ int parent,left,r原创 2012-01-21 20:43:24 · 532 阅读 · 0 评论 -
540 - Team Queue***
//提交未成功#include #include #include #include using namespace std;const int nMax=1005;struct Queue{ int q[nMax]; int front,rear; Queue():front(0),rear(0){}}queue[nMax];struct Team{ int t[nMa原创 2012-01-20 23:19:49 · 480 阅读 · 0 评论 -
二分法
/*需要注意:①推荐l = mid, r = mid的使用②因为r的值永远取不到,r的值需要大1③最后返回时,需要做一次判断其实做题时候,找个临界状态判断一下即可*/int bsearch(int left, int right, int x){ int l = left, r = right; for(l + 1< r) { int mid = (l + r) /原创 2012-09-04 11:10:36 · 477 阅读 · 0 评论