
训练指南上的数据结构习题
文章平均质量分 79
wjf1514
这个作者很懒,什么都没留下…
展开
-
UVA 10895 Matrix Transpose
按一定方式输入一个矩阵,转置后再按同样的要求输出。那个方式为:先输入该行非零元素的个数,再依次输入每个的位置,下一行是每数个的值。输出时也是这样,但要注意几点:1、两个数之间有空格,最后一个数后边没有空格·,而是换行。2、如果某一行都是0,则先输出0,再换行,再输出一行空行。输入的时候把行号存为列号,把列号存为行号。结构体 + vector就行啦。#include#include原创 2013-08-18 18:38:56 · 635 阅读 · 0 评论 -
UVALive 4329 Ping pong
树状数组。考虑ai(从0开始,则i左边共i个,右边n-i-1个),左边有x个比他大的,i-x个比他小的,右边有y个比他大的,n-i-1-y个比他大的。交叉乘一下就得到了以ai为裁判的比赛总数。把所有人都枚举一遍,加在一起就是答案,会超int。如何才能知道ai左边有多少比他小的呢?原创 2013-08-29 09:45:32 · 678 阅读 · 0 评论 -
UVA 548 Tree
这道题不算难,跟UVA 536Tree Recovery这道题类似,但输入略麻烦。给出中序遍历和后续遍历,求从根到叶节点的路径上所有节点权值之和的最小值的叶节点的值,如果有多个,就输出叶节点最小的那个。输入的时候一个字符一个字符的读就行啦,分别处理EOF, ‘ ’,和‘\n’。#include#include#include#include#include#include原创 2013-08-18 15:11:50 · 616 阅读 · 0 评论 -
UVALive 3644 X-Plosives
并查集。给出若干个组合a b,如果a和b属于同一集合则拒绝,输出拒绝的次数。为啥提到被拒绝总觉得苦逼呢,唉,屌丝程序员的春天在哪里啊#include#include#include#include#include#include#include#include///LOOP#define REP(i, n) for(int i = 0; i < n; i++)#de原创 2013-08-17 07:59:31 · 810 阅读 · 2 评论 -
UVALive 3027 Corporative Network
并查集,模板题,感觉见过几次。每次写都要重新推一遍,老了,记不住了。两种操作,E I 询问I到其根节点的距离,I I J 把I的父节点设为J,输入O结束,是O不是0...用d[x]来表示x到根的距离,d[x] = myabs(a - b) % 1000 - d[a] + d[b]的意思就是a的根x 到b的根y 的距离为 ab间的距离 减去 a到x的距离 再加上b到y的距离。好好理解下,画画原创 2013-08-17 08:07:38 · 567 阅读 · 0 评论 -
UVALive 4487 Exclusive-OR
UVALive 4487 Exclusive-OR 加权并查集原创 2013-08-18 10:04:31 · 1340 阅读 · 0 评论 -
UVA 536 Tree Recovery
树的遍历。输入前序和中序输出后序。前中后就是根的位置,话句话说,输入顺序为根左右,左根右,输出左右根。递归即可。用指针虽然会慢一点,但好处就是不必担心个数,然而,每次结束之后要记得释放内存,不然遇到数据量较大的Trie,不释放是会爆内存的,多写几行总比返回MLE要强吧。#include#include#include#include#include#include#includ原创 2013-08-18 14:10:19 · 1115 阅读 · 0 评论 -
UVA 540 Team Queue
把人分为t组,然后排队。当前到来的人要看之前有没有跟自己一组的人,如果有,就加到那个队的队尾,否则就加到大队的队尾。两个队列,一个是大队,一个是同组人的队。has数组表示当前大队中有没有该组,p数组表示每个数对应的组。#include#include#include#include#include#include#include#include#include///LOO原创 2013-08-19 23:57:48 · 543 阅读 · 0 评论 -
UVA 501 Black Box
输入n个数,然后是m次操作,第i个操作k是要求输出前k个数中第i大的数的值。两个优先队列,可以理解为把前k个数由小到大排序,从第i个数后断开,第一段的最后一个就是所求啦。不妨把第一段反过来,用最大堆来存储,这样顶即为所求。每个询问操作都要先把第二段的第一个(最小值,用最小堆存储)压入第一段中,之后再判断第二段的最小值是否比第一段的最大值小(是否符合不降序),小就交换。#include#i原创 2013-08-20 10:32:39 · 1609 阅读 · 0 评论 -
UVALive 3135 Argus
给出若干个信息,每个都有独立的编号,以及时间间隔。把他们放入优先队列中,每次取时间最小的(多个就取编号小的),输出编号,再把他的时间加上他的时间间隔,再放入优先队列中,执行n次。注意优先队列的优先级表示法。#include#include#include#include#include#include#include#include///LOOP#define REP(i原创 2013-08-17 07:36:02 · 652 阅读 · 0 评论 -
UVA 11995 I Can Guess the Data Structure!
开始按照训练指南上的习题来训练数据结构了。这道题需要注意删除操作,没有元素就不要再pop了。#include#include#include#include#include#include#include#include///LOOP#define REP(i, n) for(int i = 0; i < n; i++)#define FF(i, a, b) for(i原创 2013-08-17 07:20:40 · 707 阅读 · 0 评论 -
UVA 514 Rails
栈模拟一下,看看输入的顺序能否由正整数序列得到。数组模拟栈或用stl都可以。如果当前数字比栈顶大,就把之间没用过的都压进栈里,小就return 0,相等就弹栈。#include#include#include#include#include#include#include#include#include///LOOP#define REP(i, n) for(int i =原创 2013-08-18 12:56:28 · 634 阅读 · 0 评论 -
UVA 11991 Easy Problem from Rujia Liu?
给出n个元素,都不超过1000000,然后有m个询问,每次输出v第k次出现的位置,没有就输出0。可以先用vector来记录每个数出现的位置,然后判断一下直接输出就行。#include#include#include#include#include#include#include#include///LOOP#define REP(i, n) for(int i = 0;原创 2013-08-17 07:30:55 · 476 阅读 · 0 评论 -
UVA 11997 K Smallest Sums
给出n * n的数组,要求每行取一个,输出总和前n小的。题目理解不难,但不是很好想。白书上讲的很清楚。首先,每行最小的数加在一起,一定是第一个输出的数,没有比他更小的了。先把第一行由小到大排序记为Ai,然后考虑下一行Bi。把所有的Ai+Bj都加起来,排序后,只要取前n个就够了,后边的一定不会比之前的更优。但这样做会超时,所以不能都算一遍。先把B0跟所有的Ai相加,放入优先队列中,每次取队首原创 2013-08-17 07:51:44 · 563 阅读 · 0 评论 -
UVA 11988 Broken Keyboard (a.k.a. Beiju Text)
输入一个字符串,包含‘[’和‘]’,表示home和end,也就是说打字的时候光标会跑到最前边或最后边。直接用string模拟的话应该会超时,每次都要改很多东西。于是乎搞个deque吧。双端队列,两端都可以入队出队的好东东。记录一段字符串的开始和结束的下标,使得他们是连在一起的,不含[ ],注意可能是直接到字符串的最后哦。然后如果遇到home,就push_front,遇到end就push_bac原创 2013-08-17 08:15:29 · 856 阅读 · 0 评论 -
UVA 586 Instant Complexity
给出一段程序,求运行时间。现在只考虑一层LOOP,不妨用数组a[i]来表示n的i次方的系数。如果输入OP m,那么就在a[0]上加m,遇到END,就说明循环结束了,需要在系数上乘以循环次数。如果次数为数字,那么每个系数都乘以它;如果为n,那么全部右移一位(是指把n^2的系数给n^3),记得a[0] = 0。当有多层LOOP时,递归调用即可。原创 2013-08-20 16:09:52 · 729 阅读 · 0 评论 -
UVA 11987 Almost Union-Find
这几乎就是一个并查集。原创 2013-08-20 21:35:05 · 847 阅读 · 0 评论 -
UVALive 2191 Potentiometers
树状数组。对点更新,区间求和。用线段树会比较省心。而树状数组的数组中保存的并不都是单点的值,不能直接赋值(至少我现在不会。。。)。所以只要解决如何更新点的值,剩下的就是默写模板了。在开一个数组来记录每个点的值,每次更新时,用新旧两个差值来更新树状数组,要记得记录点的新值。区间求和时注意左端点是开的,右端点是闭的。#include#include#include#include#incl原创 2013-08-29 09:51:59 · 528 阅读 · 0 评论