上一页 1 ··· 20 21 22 23 24 25 26 27 28 ··· 30 下一页
摘要: 笛卡尔树: 每个节点有2个关键字key、value。从key的角度看,这是一颗二叉搜索树,每个节点的左子树的key都比它小,右子树都比它大;从value的角度看,这是一个堆。题意:以字符串为关键字key,数字为关键字value,构造一个二叉搜索大堆,最后按要求中序遍历 笛卡尔树的构造。建立笛卡尔树的O(n)的算法: 从别人博客里拷贝过来的,这里给出链接:http://hi.baidu.com/yy17yy/item/cd4edcf963944f6a3d148553 首先按key关键字进行排序,这样建树的时候从左下角往右下角建。根据定义可知,每个数组的末尾节点必是位于树的最右路上且不可能有... 阅读全文
posted @ 2013-10-06 21:13 辰曦~文若 阅读(629) 评论(0) 推荐(0)
摘要: #include #include #include #include using namespace std;const int maxn=60000+10;int heap_size=0; //堆的元素个数struct Node{ char name[100]; int para,pri; int t; //用于存储信息加入的顺序,当优先级相同时,t小的先出队列}node[maxn];//交换node[a]和node[b]的值void exchange(int a,int b){ Node tmp; tmp=node[a]; node[a]=node... 阅读全文
posted @ 2013-10-05 10:42 辰曦~文若 阅读(247) 评论(0) 推荐(0)
摘要: 题意:给出一棵字母二叉树删除叶子节点的序列,按删除的顺序排列。让你输出该棵二叉树额前序遍历的序列。思路:先把一棵树的所有删除的叶子节点序列存储下来,然后从最后一行字符串开始建树即可,最后遍历输出。 这里为方便起见,将子母转化成整数值存储。#include #include #include #include /*AC题意:给出一棵字母二叉树删除叶子节点的序列,按删除的顺序排列。让你输出该棵二叉树额前序遍历的序列。思路:先把一棵树的所有删除的叶子节点序列存储下来,然后从最后一行字符串开始建树即可,最后遍历输出。 这里为方便起见,将子母转化成整数值存储。*/using namespace s... 阅读全文
posted @ 2013-10-02 20:23 辰曦~文若 阅读(394) 评论(0) 推荐(0)
摘要: 题意:给出一颗二叉树的前序遍历和中序遍历的序列,让你输出后序遍历的序列。思路:见代码,采用递归。#include #include #include /*由一颗二叉树的前序遍历和中序遍历,输出该二叉树的后序遍历。*/using namespace std;const int maxn=30;int len;char dlr[maxn],ldr[maxn]; //dlr:前序遍历的序列,ldr:中序遍历的序列/*l1,r1:前序遍历的区间段l2,r2:中序遍历的区间段这两个区间对应的是同一颗子树*/void dfs(int l1,int r1,int l2,int r2) { int k... 阅读全文
posted @ 2013-10-02 14:30 辰曦~文若 阅读(263) 评论(0) 推荐(0)
摘要: 题意:给一个这样的二叉树,每个节点用一对数(a,b)表示,根节点为(1,1)。设父亲为(a,b),左儿子(a+b,b),右儿子(a,a+b)。 给几组数据,(i,j),求从根节点到(i,j)节点需要向左子树走多少次,往右子树多少次。思路:可以发现:当i>j时,(i,j)为左儿子;当ij时:i=a+b,j=b -> a=i-j,b=j l++; 2.i a=i,b=j-i r++;当然,写代码时不能一个一个减,会超时的。一次性把能减的都减去。#include #include /*AC给一个这样的二叉树,每个节点用一对数(a,b)表示,根节点为(1,1)。设父亲为(a,b),左儿子( 阅读全文
posted @ 2013-10-02 12:14 辰曦~文若 阅读(462) 评论(0) 推荐(0)
摘要: 题意:一棵树,有很多分叉,每个分叉上最多有1个苹果。 给出n,接下来n-1行,每行u,v,表示分叉u,v之间有树枝相连。这里数据中u相当于树中的父节点,v相当于子节点。 给出两个操作: 1.C x 如果分叉x有一个苹果,表示该苹果被摘下;如果没苹果,表示该分叉长出1个苹果。 2.Q x 查询以分叉x为根节点的子树中所含有的苹果,包括分叉x。思路:用树的后根遍历将树转化成一个序列,然后用树状数组维护。 树的后根遍历(先遍历每棵子树,再遍历根节点)实质上是按照自下而上、从左至右的顺序将非线性结构的树转化为一个线性序列。 每棵子树对应这个线性序列的一个连续的子区间,这样就可以用... 阅读全文
posted @ 2013-10-01 16:05 辰曦~文若 阅读(327) 评论(0) 推荐(0)
摘要: 题意:给出一棵树,再给出两个节点a、b,求离它们最近的公共祖先。方法一: 先用vector存储某节点的子节点,fa数组存储某节点的父节点,最后找出fa[root]=0的根节点root。 之后求每个节点的“高度”,更节点的高度为1,每往下一层高度+1。 读取a和b后,先求出它们位于同一个高度的祖先: 1.若此祖先相同,则即为最近的公共祖先。 2.若不相同,则求各自的父节点,知道两者的父节点相同,即为最近的公共祖先。#include #include #include #include #include using namespace std;const int maxn=10010;int n. 阅读全文
posted @ 2013-09-27 21:31 辰曦~文若 阅读(208) 评论(0) 推荐(0)
摘要: 题意:给出一个序列,求至少需要用到多少次操作,才能将序列从小到大排序。思路: 数据量很大,n#include #include #include using namespace std;const int maxn=500000;int a[maxn+10]; //存储离散后的数据序列,顺序是原来序列的顺序int c[maxn+10]; //树状数组求和int n;struct Node{ int idx,ranks; //一开始的位置,离散后的值 long long value; //最初的值}node[maxn+10];//按value从小到大排序bool cmp1(... 阅读全文
posted @ 2013-09-27 14:57 辰曦~文若 阅读(352) 评论(0) 推荐(0)
摘要: 题很水,数据注意一下四点即可:1.有些team会在一道题AC了之后还提交,这个时候只需要算第一次ac的时间以及这之前的wa,之后的全部忽略。2.如果一道题没有ac,那么在计算时间时不应该加上它的wa带来的惩罚。3.先按做题最多的排,如相等,再按提交时间最少的排,如相等,再按队号最小的排。4.给的数据,提交的时间不是按顺序排的。#include #include #include #include using namespace std;const int maxn=1010;int C,N;int c,p,t,r;int res[maxn][maxn]; //res[c][p]=1表示队伍c. 阅读全文
posted @ 2013-09-26 21:00 辰曦~文若 阅读(431) 评论(0) 推荐(0)
摘要: 题意:有多组数据,每组数据给出n,m,n表示需要打印的文件个数,m表示要打印的目标位置(m为0~n-1)。 接下来给出n个数,第i个值对应第i-1个位置的优先级大小。 打印规则如下: 将队列中的第一个打印工作J从队列中取出; 如果在队列中有优先级高于J的打印工作,则不打印J,将J移到队列最后端; 否则打印J。 每打印一个需要1分钟,问到目标文件被打印完成需要多少分钟。#include #include #include #include using namespace std;const int maxn=110;int q[maxn]; //模拟的队列int t,n,m;int first. 阅读全文
posted @ 2013-09-26 16:19 辰曦~文若 阅读(1417) 评论(0) 推荐(0)
上一页 1 ··· 20 21 22 23 24 25 26 27 28 ··· 30 下一页