数据结构
smallacmer
这个作者很懒,什么都没留下…
展开
-
http://acm.hdu.edu.cn/showproblem.php?pid=3308&&线段树之区间合并
由于这几天学算法的情绪高涨,于是就复习了之前学的线段树,这进一步加深了对线段树的理解,顺便记录一下自己的心得:1,做线段树题首先要考虑的是线段树中节点的属性,比如左右边界,区间和,在该区间插入的值,延迟标记,等等。2,弄清楚孩子节点的更新对父亲节点的影响,父亲节点的更新对孩子节点的影响,从而设计好push_up()和push_down()函数。3,在弄清前两步的基础上设计好build(原创 2012-11-07 11:05:25 · 1032 阅读 · 0 评论 -
二叉树及其遍历
好吧,我承认关于深度优先搜索和宽度优先搜索以前我确实没有理解,,,,#include#include#include#define N 1000#includeusing namespace std;int ans[N];int tot;typedef struct Tnode{ int flag; int v; struct Tnode *left,*right;原创 2012-03-29 14:08:07 · 438 阅读 · 0 评论 -
http://acm.nyist.net/JudgeOnline/problem.php?pid=150
栈的应用水题,,#include#include#include#includeusing namespace std;string a[20];int main(){ int n; string s,s1; while(cin>>n) { stack Q; cin>>s>>s1; int i=0,j=0; int tot=0; bool ok=0;原创 2012-03-28 13:24:18 · 810 阅读 · 0 评论 -
http://acm.nyist.net/JudgeOnline/problem.php?pid=119
一开始想的是写两个查询一个找最大值,一个找最小值,没想到却tle,,最后写了一个查询,,却莫名其妙的过了,杯具的线段树求法~~~~#include#include#include#include#include#includeusing namespace std;const int MAX = 0xfffffff;const int N = 100005;int max原创 2012-03-29 09:23:58 · 548 阅读 · 0 评论 -
http://acm.nyist.net/JudgeOnline/problem.php?pid=128&&前缀式计算
#include#includeusing namespace std;int pos;char str[500];double pre_calucate(){ pos++; if(str[pos]==' ') pos++; if(str[pos]>='0'&&str[pos]<='9') { int len; double temp; sscanf(&str[原创 2012-03-27 08:43:07 · 492 阅读 · 0 评论 -
表达式求值问题之表达式树
#include#include#include#include#define M 1005#define CLR(arr,now) memset(arr,now,sizeof(arr))using namespace std;stackshu;typedef struct Node{ char ope[10]; struct Node *lchild,*rchild; N原创 2012-03-27 08:19:34 · 817 阅读 · 0 评论 -
http://acm.hdu.edu.cn/showproblem.php?pid=1754&&线段树区间求最值
I Hate ItTime Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 13403 Accepted Submission(s): 5188Problem Description很多学校流行一种比较的习惯。老师们很喜欢询问,从某原创 2012-03-23 14:43:10 · 978 阅读 · 0 评论 -
http://acm.nyist.net/JudgeOnline/problem.php?pid=128&前缀式计算
istringstream对象可以绑定一行字符串,然后以空格为分隔符把该行分隔开来。#include#includeusing namespace std;int main(){ string str, line; while(getline(cin, line)) { istringstream stream(line); while(stream>>str) c原创 2012-03-08 09:35:21 · 384 阅读 · 0 评论 -
http://acm.hdu.edu.cn/showproblem.php?pid=2795&&线段树之求最小区间端点值
刚看到这一题还以为用的是二维线段树,,于是一个劲的想模型,想了一个上午还是没有理清头绪来,,,最后看看了hh神牛的博客,,才明白是怎么回事,以行数对应线段树的端点建树,以该行没有被覆盖列数为该区间的最大值。从而转化为求区间最大值大于给定数的最小端点值问题,,,但要注意的是更新子节点对父节点的影响#include#include#includeusing namespace std;原创 2012-03-24 17:03:15 · 1366 阅读 · 0 评论 -
http://acm.hdu.edu.cn/showproblem.php?pid=1698
第一次写线段树题,写的是静态的飘过~~~线段树:它主要用于处理一段连续区间的插入,查找,统计,查询等操作。复杂度: 设区间长度是n,所有操作的复杂度是logn级别。一线段树的建图有两种。1、最后一层建成线段,就是所有区间都是开区间,最后一层是[1,2] [2,3] [3,4]。。。。。。2、最后一层建成点,类似[1,1] [2,2]..二、更原创 2012-03-22 20:28:02 · 826 阅读 · 0 评论 -
http://acm.nyist.net/JudgeOnline/problem.php?pid=409&&中缀转化为前缀和后缀并求值
这一题,弄了整整一天。。这一题其实不难,蛋疼的是。。一定要输出其中缀转化为前缀的表达式。。没想到在万念俱灰下。。不可思议的过了。。。。#include#include#include#include#include#include #includeusing namespace std;stack fu;stackshu;stack Q;float cal(flo原创 2012-03-07 21:09:07 · 448 阅读 · 0 评论 -
http://acm.nyist.net/JudgeOnline/problem.php?pid=221
已知一棵树的先序和中序遍历,求该树的后序遍历,,,例如:DBACEGF ABCDEFGACBFGEDAC代码:#include#includevoid build(int n,char *s1,char *s2)//构造后序遍历过程{ if(n<=0) return; int p=strchr(s2,s1[0])-s2; build(p,s1+1,s2);//访问左原创 2012-03-29 15:26:59 · 535 阅读 · 0 评论 -
http://acm.hdu.edu.cn/showproblem.php?pid=1710
二叉树遍历。。。。。。。。。。。。。。飘过#include#include#define N 1005using namespace std;int pre[N],mid[N];void build(int s,int s1,int n,bool flag){ if(n<=0) return; int i; for(i=0;i<n&&pre[s]!=mid[s1+i];++i原创 2012-04-01 15:19:59 · 636 阅读 · 0 评论 -
http://acm.hdu.edu.cn/showproblem.php?pid=1496
思路:主要将等式化为左右两部分,用一个hash数组先把左边的值存起来,,然后在计算右面的值时只需要寻址就行了,,,,EquationsTime Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2456 Accepted Submission原创 2012-04-01 08:54:35 · 586 阅读 · 0 评论 -
http://acm.hdu.edu.cn/showproblem.php?pid=3791&&二叉搜索树
Problem Description判断两序列是否为同一二叉搜索树序列Input开始一个数n,(1接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。Output如果序列相同则输出YES,否则输原创 2012-07-09 18:31:59 · 696 阅读 · 0 评论 -
先序建树中序后序遍历及求叶子节点个数
#include#include#includeusing namespace std;typedef struct node{ char date; struct node *Tr,*Tl;}Ttree,*Titree;int s;void Creat(Titree *T){ char a; cin>>a; if(a=='-') *T=NULL; else原创 2012-02-14 09:42:51 · 622 阅读 · 0 评论 -
插入排序
#include#include#includeusing namespace std;int n;void insertsort(int a[])//直接插入排序{ for(int i=1;i<n;++i) { int key=a[i]; int j=i-1; while(j>=0&&a[j]>key) { a[j+1]原创 2012-02-16 11:26:39 · 538 阅读 · 0 评论 -
分治排序
#include#include#includeusing namespace std;int n;void merge(int a[],int p,int q,int r)//合并 { int L[20]={0},R[20]={0}; int n1=q-p+1,n2=r-q; for(int i=0;i<n1;++i) L[i]=a[p+i原创 2012-02-16 13:42:37 · 476 阅读 · 0 评论 -
http://poj.org/problem?id=1330&&LCA
第一道LCA题~~~LCA转化为RMQ来解决。。。#include#include#include#include#include#include#define N 10005using namespace std;int lev[2*N],first[N],visit[2*N];int head[N];typedef struct str{原创 2012-04-06 15:43:35 · 667 阅读 · 0 评论 -
LCA算法
LCA算法:LCA(Least Common Ancestor),顾名思义,是指在一棵树中,距离两个点最近的两者的公共节点。也就是说,在两个点通往根的道路上,肯定会有公共的节点,我们就是要求找到公共的节点中,深度尽量深的点。还可以表示成另一种说法,就是如果把树看成是一个图,这找到这两个点中的最短距离。 LCA算法有在线算法也有离线算法,所谓的在线算法就是实时性的,比方说,原创 2012-04-06 15:46:31 · 3110 阅读 · 0 评论 -
http://poj.org/problem?id=3264&&RMQ
水题 不解释。。。#include#include#include#include#define N 50005using namespace std;int dpmax[N][20],dpmin[N][20];void RMQ(int num){ for(int j=1;(1<<j)<=num;++j) for(int i=1;i+(1<<j)-1<=num;++i)原创 2012-04-06 09:15:39 · 521 阅读 · 0 评论 -
http://acm.nyist.net/JudgeOnline/problem.php?pid=119&&Rmq
rmq求区间最值。。。#include#include#includeusing namespace std;const int N=100005;int dpmax[N][20],dpmin[N][20];int main(){int a,b;scanf("%d%d",&a,&b);for(int i=1;i<=a;++i) scanf("%d",&dpmin[i][0]),dp原创 2012-04-05 21:57:29 · 552 阅读 · 0 评论 -
RMQ (Range Minimum/Maximum Query)算法
1. 概述RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j当然,该问题也可以用线段树(也叫区间树)解决,算法复杂度为:O(N)~O(logN),这里我们暂不介绍。2.RMQ算法对于该问题,最容易想到的解决方案是遍历,复杂度是O(n)。但当数据量非常大转载 2012-04-05 21:55:37 · 418 阅读 · 0 评论 -
http://poj.org/problem?id=2503&&hash
题意:给你一些英语单词和这些单词翻译成其他语言时的单词,在后面给你一些其他语言的单词,看能否用字典来翻译。思路:hash表,字典树,排序。。我的第一个蹩脚的hash~~~~AC代码:#include#include#include#include#define N 100005using namespace std;int head[N];typedef stru原创 2012-03-31 09:31:08 · 639 阅读 · 0 评论 -
http://acm.nyist.net/JudgeOnline/problem.php?pid=305
去年省赛的一道题。。。有两个知识点值得注意:一个就是数字的入栈,一个就是特殊的测试数据,, #include#include#include#include#include#includeusing namespace std;stackshu;stackfu;string s;int cal(char ch,int x,int y){ if(ch=='d') ret原创 2012-03-16 08:19:32 · 549 阅读 · 0 评论 -
http://acm.nyist.net/JudgeOnline/problem.php?pid=267
表达式求值问题。。中缀转化为后缀。。。#include#include#include#include#include#include #includeusing namespace std;stack fu;stackshu;stack Q;float cal(float a,float b,char c){ switch(c) { case'+':retu原创 2012-03-07 20:05:30 · 450 阅读 · 0 评论 -
http://acm.nyist.net/JudgeOnline/problem.php?pid=257&&中缀表达式变后缀表达式
郁闷的C小加(一)时间限制:1000 ms | 内存限制:65535 KB 难度:3描述 我们熟悉的表达式如a+b、a+b*(c+d)等都属于中缀表达式。中缀表达式就是(对于双目运算符来说)操作符在两个操作数中间:num1 operand num2。同理,后缀表达式就是操作符在两个操作数之后:num1 num2 operand。ACM队的“C小加”正在郁闷怎样把一个中缀表达原创 2012-03-07 11:01:12 · 463 阅读 · 0 评论 -
http://acm.hdu.edu.cn/showproblem.php?pid=2256&&构造矩阵求值
#include#include#include#define N 1024using namespace std;typedef long long L;typedef struct str{ L s[2][2];//注意数据范围}Node;Node a,b;Node ceil(Node p,Node q){ Node c; memset(c.s,0,sizeof(原创 2012-03-05 19:23:19 · 1104 阅读 · 0 评论 -
http://acm.hdu.edu.cn/showproblem.php?pid=1892&&二维树状数组
二维树状数组,,,,今天长见识了。。。这一题题意:对一个矩形框的书进行,插入,挪动,删除。。。。#include#include#include#includeusing namespace std;#define N 1005int s[N][N];int lowbit(int x){return x&(-x);}void update(int x,int y,原创 2012-02-27 21:55:28 · 620 阅读 · 0 评论 -
http://acm.hdu.edu.cn/showproblem.php?pid=1541
在网上搜了一下说是树状树状模板题。。于是果断看了,,但坑爹的英语,,读不懂题意。。。于是用了有道才读懂,题意是让求每个星星的水平,就是每个星星左下方有多少个元素包括自己,有多少就处于第几水平,这一题由于输入时纵坐标是按照升序排列故只考虑横坐标。。就行。。#include#include#define N 32005int s[N];int lev[N];using namespace原创 2012-02-27 19:51:20 · 1017 阅读 · 0 评论 -
http://poj.org/problem?id=1007
归并排序。。。。AC代码:#include#include#include#include#define N 60using namespace std;char a[101][N],b[N];struct str{ int value; int id;}c[101];bool cmp(str x,str y){return x.value<y.value;}l原创 2012-02-19 12:48:13 · 548 阅读 · 0 评论 -
快速排序
快速排序是一种就地排序方法。。每次找一个基准点,左边小于该基准点,右面大于该基准点。。。#include#includeusing namespace std;int partion(int *v,int p,int r){ int x=v[r]; int i=p-1; for(int j=p;j<r;++j) if(v[j]<=x) { i++;原创 2012-02-18 18:50:15 · 438 阅读 · 0 评论 -
c++&&堆
#include#include#include#include#includeusing namespace std;class heap{ private: int *v; int heap_size; public: heap() {} heap(int size) { heap_size=size; v=new int[10*siz原创 2012-02-18 18:46:13 · 481 阅读 · 0 评论 -
优先级队列
分为最小优先级队列和最大优先级队列。优先级队列是一种用来维护一组元素构成的集合s的数据结构,这一组元素都有一个关键字key,一个最大优先级队列支持的操作:insert(s,x);把x插入到集合s中maxmum(s);返回s中最大元素extra_max(s);去掉s中最大关键字并返回该最大关键子increase_key(s,x,k);将元素x的关键字的值增加到k,这里k的值不原创 2012-02-18 14:22:49 · 446 阅读 · 0 评论 -
堆数据结构
(二叉)堆数据结构是一种对象数组,它可以被视为完全二叉树,树中的每个结点和数组中存放该结点值的元素对应,树中每一层都是满的最后一层可能除外(最后一层从一个结点左子树开始填),堆数组有两个属性对象一个是length[A]是数组元素个数,heap_size[A]是堆元素个数,其中heap_size[A]=A[i],即根节点元素值不小于孩子结点元素值;最小堆性质A[parent[i]]保持堆性质的算原创 2012-02-18 10:24:56 · 619 阅读 · 0 评论 -
回文字符串
(1)判断一个字符串是不是回文子串,分为两种情况,一种是字符串的长度为奇数个,另一种为偶数个,当为偶数个时对称相等就行。当为奇数个时,注意考虑要有一个字符的情况。 代码实现:#include#includeusing namespace std;int main(){ int n; cin>>n; while(n--) { string s; cin>>s原创 2012-02-26 09:13:09 · 513 阅读 · 0 评论 -
http://acm.hdu.edu.cn/showproblem.php?pid=2852&&树状数组+二分
#include#include#include#include#define N 100001using namespace std;int s[N];inline int lowbit(int i){ return i&(-i);}void update(int x,int a){ while(x<=N) { s[x]+=a; x+=原创 2012-02-26 12:39:18 · 585 阅读 · 0 评论 -
求逆序数之分治排序
求逆序数时间限制:2000 ms | 内存限制:65535 KB 难度:5描述 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。现在,给你一个N个元素的序列,请你判断出它的逆序数是多少。比如 1 3 2 的逆序数就是1。输入 第一行输入一个整数T表示测试数据的组原创 2012-02-17 08:42:53 · 830 阅读 · 0 评论 -
http://acm.hdu.edu.cn/showproblem.php?pid=2689
树状数组求逆序数应用,,不解释。。#include#include#include#include#define M 1000000001using namespace std;typedef long long L;int s[M];int lowbit(int x){ return x&(-x);}void update(int x){ while(x<=M)原创 2012-02-29 20:56:32 · 568 阅读 · 0 评论 -
http://acm.hdu.edu.cn/showproblem.php?pid=2688&&树状数组求正序数
#include#include#include#include#define N 10001#define M 3000001using namespace std;int kp[M];int s[N];int n;int lowbit(int x){return x&(-x);}void update(int x){ while(x<N) { s[x]+原创 2012-03-01 21:12:36 · 1146 阅读 · 0 评论