数据结构
文章平均质量分 71
famousDT
掌握C/C
展开
-
SOJ-4072(数组模拟双向链表)
/****************************************************************************************************** ** Copyright (C) 2011.07.01-2013.原创 2011-10-06 00:27:04 · 391 阅读 · 0 评论 -
POJ-2513(trie+并查集+欧拉回路)
自认为此题有个bug#define NUMBER 500005int p[NUMBER + 5];int rank[NUMBER + 5];void make_set(int x) { p[x] = x; rank[x] = 0;}int find_set(int x) { if (x != p[x]) p[x] = find_set(p[x]); return p[x];原创 2012-03-16 12:41:25 · 2144 阅读 · 0 评论 -
【*】后缀数组(初步接触)
有点难以理解,大概知道意思。需要日后深入研究。const int Max = 20001; int num[Max];int sa[Max], rank[Max], height[Max];int wa[Max], wb[Max], wv[Max], wd[Max];int cmp(int *r, int a, int b, int l) { return r[a] == r[b原创 2012-03-19 21:37:53 · 419 阅读 · 0 评论 -
【*】POJ-3294(后缀数组)(Life Forms)
/*==========================================================*\| 后缀数组:| 这里num[0, n-1]为有效值,就是输入的字符串稍稍转化而成的数组| sa[1~n]为有效值,sa[i]=a则代表排在第i位的是第a个后缀。 a属于[0~n-1]| rank[0~~n-1]是有效值 rank[i]=b则代表第 i 个后缀排在原创 2012-03-20 14:39:05 · 539 阅读 · 0 评论 -
【*】后缀数组(dc3算法构造)
const int Max = 200001;int num[Max];int r[Max * 3], sa[Max * 3];int rank[Max], height[Max];int wa[Max], wb[Max], wv[Max], wd[Max];#define F(x) ((x) / 3 + ((x) % 3 == 1 ? 0 : tb))#define G(x) ((x原创 2012-03-20 14:52:35 · 1718 阅读 · 0 评论 -
POJ-1226(后缀数组)(Substrings)
可以暴力破解,这里贴的代码没有模版int who[Max], yes[101], ii;int len, n, nn;int ans[Max], ss;int check(int mid){ int i, j, k, t, s, flag = 0; for (i = 2; i <= len; i = j + 1) { for (; height[i] < mid && i <=原创 2012-03-20 15:37:03 · 476 阅读 · 0 评论 -
POJ-3274(hash结构)(Gold Balanced Lineup )
大概意思就是:数组sum[i][j]表示从第1到第i头cow属性j的出现次数。所以题目要求等价为:求满足sum[i][0]-sum[j][0]=sum[i][1]-sum[j][1]=.....=sum[i][k-1]-sum[j][k-1] (j中最大的i-j将上式变换可得到sum[i][1]-sum[i][0] = sum[j][1]-sum[j][0]su原创 2012-03-20 17:07:22 · 597 阅读 · 0 评论 -
【编程之美】3.9已知先序和中序遍历,求后序遍历+POJ-2255
很久以前写过,现在把我的递归版本代码贴出struct tree{ char c; struct tree * left_child; struct tree * right_child;} * root;tree * create_tree(char pre[], char in[], int len){ if (len == 0) return NULL; tree * t原创 2012-03-23 09:50:15 · 1208 阅读 · 0 评论 -
POJ-2247(pair的运用)(Humble Numbers )
typedef pair pa;int main(){ int n; int i; priority_queue, greater > p; p.push(make_pair(1, 2)); ll d[5845]; char s[][10] = {"th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th"}; int in原创 2012-05-01 10:58:16 · 632 阅读 · 0 评论 -
POJ-4040(单调队列)(Non-negative Partial Sums )
【转载自】http://blog.ac521.org/?p=123【题目描述】给定一个长n的循环队列(n=0;【解题思路】首先用循环序列的一般处理方法,两个接在一起,然后处理出来sum,使用单调队列,滚动求长n的子序列的最小值。如果最小值减去前面的sum仍然是非负的,则计数。#define N 1000002int num[N * 2];int q[N * 2], p[N转载 2012-04-18 15:44:36 · 562 阅读 · 0 评论 -
POJ-2492(看看有没有同性恋)(A bug's life)
【题目描述】给出几对虫子交配,问是否有同性恋。【解题思路】并查集变形,把每条虫的所有对象合并int p[10001];int rank[10001];int other[10001];/* 每个虫的对象 */void make_set(int x) { p[x] = x; rank[x] = 0; other[x] = -1;/* 初始化每个虫的对象 */}int原创 2012-05-04 00:29:11 · 605 阅读 · 0 评论 -
【*】POJ-3580(伸展树-slpay tree)
伸展树的优势:由于Splay Tree仅仅是不断调整,并没有引入额外的标记,因而树结构与标准BST没有任何不同,从空间角度来看,它比Treap、Red-Black Tree、AVL要高效得多。因为结构不变,因此只要是通过左旋和右旋进行的操作对Splay Tree性质都没有丝毫影响,因而它也提供了BST中最丰富的功能,包括快速的拆分和合并(这里指的是将原树拆分成两棵子树,其中一棵子树所有节点都比原创 2012-06-05 16:34:49 · 1771 阅读 · 1 评论 -
SOJ-3963(暴力可以,但是stl很强大)
【题目描述】简单字符串处理【解题思路】暴力可以解决,但是需要高效的方法,不然会超时stl确实是个好东西啊int main(){ int tt, i, j; int a, b; char s[1005]; while (cin>>tt) { while (tt--) { scanf("%d%d%s", &a原创 2012-05-18 10:40:17 · 633 阅读 · 0 评论 -
POJ-1419(Graph Coloring)
【题目意思】把给定图涂颜色,问黑色点的最大个数补图的最大独立团,可以用dfs做int m[101][101];int color[101];int ans[101];int a, b, maxn, black;void process(){ int i; if (black > maxn) { maxn = black; for (i = 1; i <= a; +原创 2012-06-13 10:55:11 · 715 阅读 · 0 评论 -
POJ-2588(snakes,抽象成图结构)
【转载思想】题目意思就不说了,这里主要说一下做法!我们把蛇连同它的攻击范围看做一个圆,再把圆抽象成一个点!点与点之间有边连接仅当两个点代表的圆有公共面积!然后我们在把上边界和下边界各抽象成一个点(S和T),同样上边界与点之间有边连接仅当点代表的圆与上边界相交,同理,可得下边界与点之间的边关系!这样处理以后如果有从左到右的路径,当且仅当不存在S到T通路!只要深搜或者广搜即可!但是题目还要原创 2012-03-16 16:16:05 · 989 阅读 · 1 评论 -
POJ-2559(单增栈)
【题目描述】给出一系列的1*h的矩形,求矩形的最大面积。如图:可转化为求找一个子序列。 使得这个序列的长度乘以序列最小数最大。分析:这是一个单调栈的问题,维护栈单调不减。 单调栈 主要是大家要自己枚举,需要找到每个元素 最左能扩展到那 ,最右能扩展到那,当然最小的是你枚举的那个元素。struct my{ ll h; int id;} wo[100005];ll d原创 2012-03-15 11:49:16 · 2540 阅读 · 0 评论 -
POJ-3630(静态trie树,动态分配空间会TLE)(Phone List)
自己写了个动态的trie被tle了,悲剧此题还能够先排序,然后用strncmp就可以判断字符串是否被后面的包含。代码如下:bool cmp(char *x,char *y){ return strcmp(x,y)<0;}int main(){ int cases,number,x,i,j,flag; char **d=new char*[10000]; for(i=0;原创 2012-03-27 14:10:41 · 927 阅读 · 0 评论 -
TOJ-1144(已知先序和中序求后序遍历)
/****************************************************************************************************** ** Copyright (C) 2011.07.01-2013.07.01 ** Author: famousDT ** Edit date: 2011-12-06****原创 2011-12-06 15:24:57 · 379 阅读 · 0 评论 -
SOJ-2664(已知满二叉树的后序求中序遍历)
因为知道小写字母代表叶子,大写字母代表非叶子,如后序为bcA,那么中序久违bAc,这样就可以用逆波兰表示法的二叉树做,把小写字母当成操作数,大写字母当成操作符,每有一个操作符就做一个操作。/******************************************************************************************************原创 2011-12-07 00:42:12 · 499 阅读 · 0 评论 -
SOJ-1953(填充数组,并查集)
/****************************************************************************************************** ** Copyright (C) 2011.07.01-2013.07.01 ** Author: famousDT ** Edit date: 2011-12-08****原创 2011-12-08 12:40:31 · 492 阅读 · 0 评论 -
POJ-1990(维持两个树状数组)
问题提出:已知数组a[],元素个数为n,现在更改a中的元素,要求得新的a数组中i到j区间内的和(1思考:对于这个问题,我们可以暴力地来解决,从a[i]一直累加到a[j],最坏的情况下复杂度为O(n),对于m次change&querry,合起来的复杂度为O(m*n),在n或m很大的情况下,这样的复杂度是让人无法忍受的.另外,如果没有元素的变更,我们完全可以存储sum[1,k](k=1,2,……)原创 2011-12-12 16:42:37 · 617 阅读 · 0 评论 -
POJ-2104(K-th Number 划分树)
【题目描述】有n个数字排成一列,有m个询问,格式为:left right k 即问在区间[left,right]第k大的数据为多少?建图:建树的过程比较简单,对于区间[l,r],首先通过对原数组的排序找到这个区间的中位数a[mid],小于a[mid]的数划入它的左子树[l,mid-1],大于它的划入右子树[mid,r]。同时,对于第i个数a[i],记录在[l,i]区间内有多少数被划入左原创 2011-12-12 20:53:29 · 3082 阅读 · 1 评论 -
POJ-1338(ugly number,STL-pair的应用)
Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequence 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, ... typedef pair node_type;int main(){ ll result[1500]; priority_queue, greate原创 2011-12-22 20:38:59 · 621 阅读 · 0 评论 -
巧妙转换为求逆序数-状态数组(POJ-3067)
n条线段,求多少个交点。先对右边的点由大到小排序(左边大的点对在前面),然后对左边的求逆序数就可以了。逆序数可以借助状态数组求得。原创 2012-02-16 13:45:28 · 531 阅读 · 0 评论 -
POJ-1840(解五元三次方程-hash)
a1x13+ a2x23+ a3x33+ a4x43+ a5x53=0 转换为-(a1x13+ a2x23) = a3x33+ a4x43+ a5x53直接数组模拟,数组开shortshort hash[50 * 50 * 50 * 50 * 4 + 1];int main(){ int a, b, c, d, e; int i, j, k, l, m; while (sc原创 2012-03-02 17:49:00 · 1523 阅读 · 2 评论 -
POJ-2001(trie字典树)
char ss[1005][30];struct trie{ int cnt; trie *p[26];} * root;void make_tree(char *s){ trie * r = root; trie * tmp; int i, j; for (i = 0; s[i] != '\0'; ++i) { if (r->p[s[i] - 'a'] == NULL)原创 2012-03-02 17:54:08 · 329 阅读 · 0 评论 -
POJ-3481(set的应用)
优先队列,只能访问第一个,不能访问最后一个;set既可以访问第一个,也可以访问最后一个;struct my{ int k, p;} P;bool operator < (my a, my b){ return a.p < b.p;}int main(){ int n; sets; s.clear(); while (cin>>n, n) { if (n ==原创 2012-03-06 11:27:37 · 757 阅读 · 0 评论 -
POJ-2002,3432(搜点,hash或二分)
hash版本,ans/2是因为如(0,0),(0,3),(3,0),(3,3)(0,0)(0,3)和(0,3)(3,3)都满足,但只有一个正方形:#define N 2001#define SUM 40005int n;int next[N], hash[SUM];struct point{ int x, y;} p[N];bool cmp(point a, point b原创 2012-03-07 11:02:23 · 381 阅读 · 0 评论 -
POJ-3697(hash+bfs)
bfsint bfs(){ int i; queue q; q.push(1); while (!q.empty()) { int index = q.front(); q.pop(); visit[index] = 1; for (i = 1; i <= a; ++i) { if (visit[i]) continue; if (!is_exist(in原创 2012-03-08 10:50:12 · 672 阅读 · 0 评论 -
POJ-1465(同余+高精度)
其实很简单的思想,外加贴一个模版【题目描述】给一个数N 然后给M个一位数 问你是否有N的倍数 完全由这些一位数组成先说算法 用BFS不停的扩展 就是X10这样的扩展 然后如果对N取余的余数没有出现过就把这个扩展得数的余数添加到队列里 如果余数是0的话就可以输出了 当然 扩展的时候要考虑到0,这些都不是最关键的 最关键的是这个数可能非常大 long long 不够 而高精的话比较麻烦原创 2012-03-11 16:42:36 · 514 阅读 · 0 评论 -
SOJ-3330(bfs)
1 1 1 01 1 0 00 0 0 0求所有0到1的最短距离struct my{ int x, y, z;} wo;int d[1001][1001];int tag[1001][1001];int main(){ int cases, a, b; scanf("%d", &cases); while (cases--) { scanf("%d%原创 2012-07-10 17:27:24 · 870 阅读 · 0 评论