
ACM-数据结构
文章平均质量分 57
路小白_zZ
这个作者很懒,什么都没留下…
展开
-
uva 673(线性表)
题解:把第一个括号放到栈里,然后看后面的一个括号是否和他匹配,如果匹配就把栈里的括号取出,否则就把当前的括号也放进栈里,继续对比下一个,以此类推,一直到最后一个括号也被判断,看栈是否为空,如果是空的就是yes,否则就是no.#include #include #include #include using namespace std;int main() { int t, fla原创 2014-07-21 08:40:37 · 830 阅读 · 0 评论 -
SzNOI 双向约瑟夫(双向链表)
题意:题解: #include #include const int N = 10000; struct List { int v; List *next; List *front; }l[N]; int main() { in原创 2014-11-23 10:02:41 · 986 阅读 · 0 评论 -
uvalive 3135
题意:有一些命令 abc num period,每period秒发生一个num事件,输出前k个时间的num。题解:一个结构体存num和对应的period,然后再把下一次会发生的时间time存下来,优先队列将所有下一次发生事件的时间排序,然后每次输出队首,将队首的下一次发生时间加period,再放进队列。#include #include using namespace std;s原创 2015-04-01 20:13:33 · 623 阅读 · 0 评论 -
uva 11991
题意:有n个整数的数组,询问k和v,表示从左到右第k个v的下标(从1到n)。题解:输出查询结果,不存在输出0。#include #include #include using namespace std;const int N = 1000006;map > mp;int m, n, a, b;int main() { while (scanf("%d%d", &n, &原创 2015-04-01 18:39:06 · 547 阅读 · 0 评论 -
uva 11995(stl)
题意:1 x,表示放进x元素,2表示拿出一个元素,给出n条指令,然后2 x表示取出的数据是什么,问可以从输入输出判断出是哪种数据结构(栈,队列,优先队列),如果有多种满足,就输出not sure,都不是就输出impossible。题解:直接定义三个数据结构的stl变量,然后模拟放入数据,到拿出数据时和三种比对判断,可以知道是哪种数据结构。#include #include #i原创 2015-04-01 17:59:15 · 676 阅读 · 0 评论 -
uva 11997(priority_queue)
题意:有k个组,每组k个数,要从每组挑出一个数,k个组相加,一共有k^k种和,要求升序输出k个最小的和。题解:书上的题解的方法是用优先队列和两两归并,先看两个排好序的数组,(s, b)代表一个元素和,让s = Aa+Bb,那么下一个可能元素和就是(s', b + 1),s' = s - Bb + Bb+1,然后优先队列每次取出队首就是此时队伍中和最小的情况,然后得到s'入队,因为是排好序就不会原创 2015-04-01 22:58:10 · 589 阅读 · 0 评论 -
uva 11235(RMQ)
题意:给出非降序的n个数字的序列(有重复),然后给出i,j问[i,j]范围内出现最多次数的值的次数。题解:经典的RMQ问题,按书上题解的思路,先把序列分段,即相同数字是一个段,用val[cnt]和count[cnt]表示第cnt段的值和出现次数,num[i],l[i],r[i]分别表示位置i所在段编号(cnt),左右端点位置,那么每次查询[i,j]时,就是要计算i到i左端点的元素个数,j到原创 2015-04-04 19:44:02 · 774 阅读 · 0 评论 -
hdu 4041
题意:如下图 遍历树的方法是粉色箭头所示 此图的输入是”walpurgis(charlotte(patricia,gertrud),elly,gisela)” 要求输出经过的结点名称,和每一步的起点和终点。 题解:用栈维护,遇到’(‘把’(‘前面的数字输出并压栈,如果遇到’,’,输出当前点和栈顶,如果遇到’)’,输出当前点和栈顶并把栈顶数字弹出。#include <stdio.h>#原创 2015-05-10 22:53:23 · 742 阅读 · 0 评论 -
hdu 4006
题意:输入n、k表示有n个操作,两种操作是I a,表示把a放入一个序列中,Q 问序列内第k大的数字是什么。 题解:先输入k个数字放入set中,那么set内会自动排序,s.begin()就是第k大的数字,在之后输入数字中如果有比它大的数字,就清除 s.begin(),再插入当前数字,维护第k大数字。#include <stdio.h>#include <algorithm>#include <s原创 2015-05-10 23:18:35 · 558 阅读 · 0 评论 -
uvalive 2088(哈夫曼树)
题意:题解:原创 2014-09-24 17:10:00 · 885 阅读 · 0 评论 -
hdu 5249(set + queue)
题意: Input 有大约100组数据。每组数据第一行有一个n(1≤n≤10000),代表服务记录数。接下来有n行,每一行有3种形式 “in x”: 代表重要值为x(0≤x≤109)的请求被推进管道。 “out”: 代表服务拉取了管道头部的请求。 “query: 代表我想知道当前管道内请求重要值的中间值. 那就是说,如果当前管道内有m条请求, 我想知道,升序排序后第floor(原创 2015-05-31 00:51:05 · 931 阅读 · 0 评论 -
hdu 5412(树套树求第k小数字+离散化)
题意:有n个数字,操作1 l v 表示把第l个数字替换为v,操作2 l r k表示在区间[l,r]内输出第k小数字。 题解:用学长的树套树模板,还需要好好理解。#include <cstdio>#include <cstring>#include <cstdlib>#include <iostream>#include <algorithm>using namespace std;co原创 2015-08-22 00:30:36 · 474 阅读 · 0 评论 -
poj 2823(单调队列)
题意:有n个数字要按顺序进入一个窗口,窗口大小是k,问每次窗口内的k个数字的最小值和最大值。 题解:之前好像做过单调队列类型的题,但具体又忘了,所有再次学习一遍,这题应该是比较简单的模板题,维护队列内的值,保证输出都在队首,因为窗口大小是k,所以一旦队首的位置加k小于当前位置,就把队首向后移动。#include <cstdio>#include <cstring>#include <algor原创 2015-08-13 17:25:05 · 526 阅读 · 0 评论 -
uvalive 4329(BIT)
题意:一条街上有n个运动员,平时会一起切磋,要求有三个人,住在中间的才可以当裁判,n个人都有对应的技能值,裁判的技能值要比一个人大比一个人小。按住所给出n个人的技能值,问有多少种切磋方式。题解:如果i当裁判,i左边的比他小的有ai个,右边比他大的有bi个,那么对于i有ai*(n - i - bi) + bi*(i - 1 - ai),然后代入了BIT二叉索引树的思想来解答。#include原创 2015-04-04 00:17:26 · 645 阅读 · 0 评论 -
uva 839(二叉树)
题解:不需要建树,深搜就可以了。#include int flag;int dfs() { int wl, dl, wr, dr; scanf("%d%d%d%d", &wl, &dl, &wr, &dr); if(wl == 0 || dl == 0) wl = dfs(); if(wr == 0 || dr == 0)原创 2014-07-25 19:24:54 · 870 阅读 · 0 评论 -
uva 297(二叉树)
题解:#include #include #include #include using namespace std;const int N = 10010;struct Node { char c; Node* s[4]; Node() { c = '\0'; s[0] = s[1] = s[2] = s[3] = NUL原创 2014-07-25 13:01:22 · 863 阅读 · 0 评论 -
uva 133(线性表)
题解:#include int main() { int n, k, m, flag1, flag2, flag, a, b, c, d, i ,j; int s[25]; while (scanf("%d%d%d", &n, &k, &m) && (n || k || m)) { if (n == 1) { printf(" 1\n"); continue; }原创 2014-07-21 08:45:36 · 859 阅读 · 0 评论 -
uva 10152(线性表)
题解:输入给出原始和mubiao的两个原创 2014-07-21 16:01:40 · 760 阅读 · 0 评论 -
uva 11111(线性表)
题解:像套娃,每个大的值后面#include #include using namespace std;const int N = 10010;int main() { stack s; int a[N]; int n = 0, i; double sum1 = 0; double sum2 = 0; char c; while (scanf("%d%c", &a[n++],原创 2014-07-21 20:12:53 · 928 阅读 · 1 评论 -
uva 101(线性表)
题解:用栈的数组在存木块,然后设置了一个数组储存每个木块当前所在的位置,每次yi原创 2014-07-21 14:46:24 · 894 阅读 · 0 评论 -
uva 442(线性表)
题解:矩阵的乘法,a的行乘bd列原创 2014-07-21 19:02:55 · 974 阅读 · 0 评论 -
uva 10050(线性表)
题解:#include #include using namespace std;const int N = 3655;int main() { int t, n, p, d, flag; int map[N]; scanf("%d", &t); while (t--) { flag = 0; memset(map, 0, sizeof(map)); scanf(原创 2014-07-22 19:10:04 · 891 阅读 · 0 评论 -
uva 11234(二叉树、线性表)
题解:可以根据输入的字符串画一个二叉树出来,然后层次遍历一下就和输出结果顺序一样,所以根据输入把大写字母当做两个小写字母的根节点,将节点即运算结果当做另一个小写字母放进栈里,和另一个字母组建生成新的树放进栈里,直到最后的的根节点也放进了栈里,开始层次遍历,用数组模拟队列进行遍历,注意因为结果的顺序是从右到左,所以注意遍历的方向问题。#include #include #include #in原创 2014-07-22 16:17:17 · 1411 阅读 · 0 评论 -
uva 540(线性表)
题解:用一个#include #include #include #include using namespace std;int main() { int t, n, a, cases = 1, flag; queue q[1005]; queue q2; char str[10]; while (scanf("%d", &t) && t) { map m; for原创 2014-07-22 10:58:03 · 935 阅读 · 0 评论 -
uva 712(二叉树)
题解:#include #include #include #include using namespace std;const int N = 500;int num[10], pos;int main() { int n, ans[N], m, inp[10], cases = 1, outp[N]; string str; while (scan原创 2014-07-25 10:14:47 · 994 阅读 · 0 评论 -
uva 699(二叉树)
题解: 在剑术#include #include const int N = 85;struct Node { int val; Node* left; Node* right; Node () { val = -1; left = right = NULL; }};int ans1[N], ans2[N];原创 2014-07-25 15:36:59 · 1018 阅读 · 0 评论 -
uva 548(二叉树)
题解:给出了二叉树的中序和后序,重建二叉树,输出路径和最短的叶子的值。两个模板:给出前序和中序建树:Node* build (int n, int* preo, int* ino) { Node* node = new Node; int i = 0; if (n <= 0) return NULL; while (ino[i] != p原创 2014-07-24 23:03:46 · 1535 阅读 · 0 评论 -
uva 127(线性表)
题解:设zhi#include #include #include #include using namespace std;const int N = 55;struct Card{ char a, b;};int judge(Card c1, Card c2) { if (c1.a == c2.a || c1.b == c2.b) return 1; retu原创 2014-07-21 08:58:20 · 1241 阅读 · 0 评论 -
uva 112(二叉树)
题解:先根据括号建树,然后用神搜原创 2014-07-24 21:49:08 · 1003 阅读 · 0 评论 -
lightoj 1258(manacher)
题意:给出一个字符串,现在可以在这个字符串的右边任意添加字符串使字符串成为回文串,问回文串最短长度。 题解:因为只能在右边添加字符,添加的越少越好,所以要找一个最靠近右端点的回文串,在manacher算法中,如果出现 i + f[i] >= len说明出现了这样的串(最坏情况就是最后一个字母,回文长度是1),计算这个串的回文长度temp,结果就是2 * len - temp。#include <c原创 2015-11-01 23:02:55 · 646 阅读 · 0 评论