随笔分类 -  数据结构

摘要:#include using namespace std;struct node{ int index; char name[20];};node data[100];templatevoid QuickSort(T* Array,int left,int right,bool (*com)(T* a,T* b)){ int low,high; T key; if(left>=right) return; low=left,high=right; key=Array[left]; while(low=*b;}bool com1(node* a,node* b){ return a-> 阅读全文
posted @ 2013-06-28 09:58 书山有路,学海无涯 阅读(421) 评论(0) 推荐(0) 编辑
摘要:思路:1、将原序列seq[]的下标按照seq[]的值升序排序存入res[]中。2、假如我们知道res[j]的后面小于res[j]的数的个数x的话,那么res[j]需要交换的次数为j-res[j]+x;(自己推一下就知道)。3、如何求x呢?我们可以用树状数组sum[]来统计res[]从后往前处理过的数。4、求和累加j-res[j]+x;(j从n-1到0)#include<cstdio>#include<iostream>#include<algorithm>using namespace std;#define MAX 500010 int seq[MAX], 阅读全文
posted @ 2012-11-27 23:13 书山有路,学海无涯 阅读(149) 评论(0) 推荐(0) 编辑
摘要:题意:给出编号1~n的奶牛,是乱序的并且给出了每一个奶牛前小于自己序号的奶牛数目。输出奶牛的正确位置。假设第i个奶牛的高度(就是指前面的小于自己序号的奶牛的数目)为Ai。因此第n个奶牛的序号必然是Ai+1。然后我们将这个奶牛砍掉,那么第n-1个奶牛就可以根据它的高度和已经判断出的第n个奶牛来确定。推出一般的情况:我们用Ck来保存1~k中确定的奶牛数(也就是我们砍掉的奶牛),因此还没有砍的奶牛数为(k-Ck);在倒序处理的过程中,对于奶牛j,其高度为Aj+1,我们只要找出这样的k就行了:Aj+1==k-Ck。k-Ck代表了什么意思呢?其实就是在排好序的奶牛序列中,把已经确定的牛砍去之后k的高度。 阅读全文
posted @ 2012-11-25 22:56 书山有路,学海无涯 阅读(955) 评论(0) 推荐(0) 编辑
摘要:第一道树状数组,每个第一道都那么艰难……..#include<iostream>#include<cstdio>#include<cstring>using namespace std;#define MAX 1234567890int res[10010],data[10010];int lowbite(int x){ return x & (x^(x-1));}int GetSum(int i){ int t=0; while(i>0) { t+=res[i]; i-=lowbite(i); } return t;}int A... 阅读全文
posted @ 2012-05-01 22:08 书山有路,学海无涯 阅读(166) 评论(0) 推荐(0) 编辑
摘要:一看题意,感觉可以用线段树来做,但是二维挺难处理的,后来百度了一下,大牛们是将二维化为一维,因为点已经排好了序,我们就可以省去了一维,只考虑x,然后就是赤裸裸的线段树了,而且还不用事先建树。#include<iostream>#include<cstdio>#include<cstring>using namespace std;struct node{ int x,y;}point[15010];int res[15010],tree[32000*4+10];int insert(int i,int left,int right,int x){ int m 阅读全文
posted @ 2012-04-30 18:11 书山有路,学海无涯 阅读(191) 评论(0) 推荐(0) 编辑
摘要:做了这道题我都快疯了,一开始不是道什么是散列化,看了半天才有点头绪,尝试写了,又遇到了问题,就是排序之后,如何确定新的区间,看看大牛的文章,就是看不懂,今天早上突然,灵光一闪,知道到底怎么回事了,也就是在排序的过程中,记录了染色区间的序号,以便于,散列后重新确定染色区间,就这么简单却弄了那么久,汗颜。后来,没有注意到题中给出的条件 起始点< 终点,是我一直在纠结始点等于终点的情况,唉!还有就是英语本身就不怎么样,竟然还忽略了另一个条件“open interval”,查了一下却是“开区间”的意思,导致我就是弄不明白sample output 中的47 634 是怎么来的,自己总认为是48 阅读全文
posted @ 2012-04-29 12:20 书山有路,学海无涯 阅读(176) 评论(0) 推荐(0) 编辑
摘要:并查集 讲解看如下博客:http://start07.yo2.cn/articles/ural-1003-parity.html#include<iostream>#include<cstring>#include<cstdio>using namespace std;#define BLOCK 10000int HashTable[20000],father[20000],Rank[20000],N;int Hash(int a){ int i; for(i=1;i<N;i++) if(HashTable[i]==a) return i; HashT 阅读全文
posted @ 2012-04-19 21:43 书山有路,学海无涯 阅读(187) 评论(0) 推荐(0) 编辑
摘要:纯属模拟,但关键分为三种情况:最大的(没有排好的)元素在最底下、在最上面、在其他位置。第一种情况:不需要排,因为已经在该在的位置。第二种情况:需要一步,从它应该在的位置翻转一下。第三种情况:需要两步,先把它翻转到最上面去,然后再从它应该在的位置翻转一次。翻转操作我用栈和队列来回倒换。#include<iostream>#include<cstdio>#include<cstring>#include<queue>#include<stack>#include<algorithm>using namespace std;#d 阅读全文
posted @ 2012-02-24 13:58 书山有路,学海无涯 阅读(434) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示