数据结构
文章平均质量分 67
「已注销」
SYSU
展开
-
POJ 1363 Rails(模拟/数据结构)
//模拟/数据结构——栈堆(stack)#include#includeusing namespace std;const int MAXN = 1000 + 10;int n,target[MAXN],temp;int main(){ while(cin >> n) { if(n == 0)break; while(1) { sta原创 2010-02-19 15:54:00 · 1295 阅读 · 0 评论 -
POJ 2828 Buy Tickets(线段树)
//线段树,利用线段树的灵活性,实现排队 //算法关键:逆序插入,线段树区间维护该区间剩余有效地空位,每从线段树中找到一个合适位置插入,都会减去一个有效空位 //相当于整个队列的序号向右移了一位,通过树状结构维护remain值,便可实现O(NlgN)的复杂度 //倒序插入,每找到一个合适的位置,这个位置就肯定是最终确定的位置 #include #define MAX 200005 using namespace std; struct seg { int l,r,remain; }se原创 2010-07-20 21:27:00 · 802 阅读 · 0 评论 -
POJ 2524 Ubiquitous Religions(并查集)
//并查集的简单应用——带路径压缩的并查集 //平摊分析后,每个点只需遍历一次即可建立相应并查集,搜索的复杂度是O(1); #include using namespace std; int fa[50010],n,m,ans,vis[50010]; void initSet()//初始化 { for(int i = 1;i原创 2010-07-23 10:21:00 · 682 阅读 · 0 评论 -
POJ 2236 Wireless Network(并查集)
#include #include using namespace std; struct coord { int x,y; }P[1005]; int n,d; char cmd; int fa[1005],x,y; vector ok; void init() { for(int i = 1;i原创 2010-07-24 10:12:00 · 844 阅读 · 0 评论 -
POJ 2492 A Bug's Life(并查集)
//并查集,类似于POJ 1703 //通过维护当前结点与父亲的关系来实现对同性恋的判断 //并查集的分类依据是能否相互确定关系,能相互确定关系的在同一颗树种 #include #define MAX 2005 using namespace std; bool ok; int x,y,n,m,k,t; struct node { int parent; int sex;//记录关系,假设0为男,1为女 }set[MAX]; void init()//初始化 { for(原创 2010-07-24 11:40:00 · 1281 阅读 · 1 评论 -
Sicily 1800 Sequence(RMQ)
//线段树 //A这道题后,懂得了对数列的转换,如果要求连续区间和,就必须把它转化成SUM[I],表示从1到I的区间之和 //这样的话要求任意区间的和,假设[I,J]的和,只需要sum[j] - sum[i-1]就可以立即求出来了 //注意sum[0] = 0; //思路:枚举从L开始到的的sum[i](i >= L) //对符合长度条件的区间中找到一个最大的sum[j] (max(0,i-U) #define MAX 32780 #define INF 2147483647 using原创 2010-07-25 11:29:00 · 1309 阅读 · 0 评论 -
Sicily 1686 Happy Children's Day(线段树)
//线段树 //WA了很多次,最后查出原因居然是建树的时候初始化有最大糖果的下标错了 //我只有在叶子节点有初始化,其他点没有,所以错了,正确初始化应该是每个区间最左边的点为maxid //线段树插入和修改的inherit和update函数是关键,直到这道题总算摸索出套路了 //建树什么都差不多,关键就看如何识别标记,如何处理区间与区间之间关系,如何回溯传递结果 #include #define MAX 100005 using namespace std; struct seg {原创 2010-07-28 02:37:00 · 1107 阅读 · 0 评论 -
POJ 2513 Colored Sticks(Trie+并查集+欧拉回路)
//TRIE + 并查集 + 欧拉回路 //A了这道题,学会了用并查集判断无向图的连通性 #include #include #include using namespace std; const int MAX = 500003; int N; int fa[MAX]; int deg[MAX]; struct trie { int color; trie *next[26]; trie() { color = 0; memset(next,0,sizeo原创 2010-08-03 23:29:00 · 807 阅读 · 0 评论 -
Sicily 1426 Phone List(Trie树)
//Trie树 //对每个号码构造Trie树,利用状态status进行识别 #include #include using namespace std; struct Node { Node *num[10]; int status;//status = 1表示前面已有电话号码经过该结点,2表示电话号码在该结点结束 Node() { for(int i = 0 ;i num[phoneNum[i] - '0']) { p = p->num[phoneNum[i原创 2010-06-09 13:14:00 · 1983 阅读 · 1 评论 -
Sicily 1021 Couples(数据结构——栈)
//数据结构——栈 //先开一个数字然后标记号是couple的编号 //接着从1~2n一个个塞进栈中,同时调用couple数组进行检查,看是否能与栈顶元素合并 //如果能合并,就从栈顶中移除 //到最后如果栈顶为空,则说明能够全部移除 #include #include #include using namespace std; int couple[200010]; int main() { int n,l,r; while(scanf("%d",&n) && n) {原创 2010-06-17 21:16:00 · 4207 阅读 · 5 评论 -
Sicily 1802 Atomic Nucleus Investigation(线段树)
新手赛的题目,让我回想起打酱油的时光//线段树 #include #include #include #define INF 100000000 using namespace std; int T,M; char cmd[10],n; bool R[100005],G[100005]; struct seg { int l,r,_max,_min,delta;//记录最大值,最小值,最优差值,_max,_min为0表示不存在这个数 }tree[100005*4]; void u原创 2010-10-14 21:59:00 · 2900 阅读 · 3 评论 -
ZOJ 3324 Machine(线段树)
给定操作有2种,一种是让[X,Y]下压1格,一种是让[X,Y]向上恢复1格,恢复操作必定是之前下降过的。初始状态在LEVEL=0处,对每个操作回答LEVEL=0处有几块连续的方块。首先这道扑街题的规模高达10^8,因此还要对区间进行离散化。离散化过程中还要保存被操作结点之间相对位置,即之间是否有空格存在。幸亏用SET判重+MAP离散对应还不慢,使代码简洁了很多。接下来总结下这道题对标记域使用。cnt是必要的,记录当前区间的连续块数。为了合并区间,还要记录区间的左连续和右连续情况。再用cov记录当前区间被覆盖原创 2010-12-06 01:18:00 · 3638 阅读 · 2 评论 -
POJ 1703 Find them, Catch them(并查集)
//并查集,NND忘了个句号WA了3次! //A过POJ1182的食物链后再来做这道题就轻松多了,这是食物链的简单版 //并查集的集合是以能否确定关系来分的,而不是以属于同一个帮派或不同帮派来分的 //这类题只需建立一个并查集,然后维护每个结点和他的根结点之间的关系属性即可 //如果2个点不在同一个并查集中,那么这2个点无法确定关系 //在同一个并查集中的每个点,都能确定集合中的相互关系 #include using namespace std; struct node { int f原创 2010-07-23 17:07:00 · 883 阅读 · 0 评论 -
POJ 1611 The Suspects(并查集)
//并查集,统计不相交集合的元素个数 #include using namespace std; int n,m,k,fa[30010],num[30010],x,y; void initSet() { for(int i = 0;i原创 2010-07-23 12:33:00 · 1400 阅读 · 0 评论 -
POJ 2777 Count Color(线段树+位运算优化)
//线段树 //A完这道题收获很大,一开始我不会用位运算,是用vis[30]数组一个一个标记颜色过的,速度比较慢800+MS //经大牛指点,使用位运算来记录颜色,结果快了一倍 //通过这道题,对线段树的架构有了清晰的了解 //对于线段树,特别的地方在于对区间的标记,搜索时后要先读取区间的标记,然后更新左右子树的标记 //通过标记便可以不用再修改到要求区间的时候改变子树的区间状态,等到下次修改时有经过这个节点,再修改左右子树状态 //只有这样才叫做实现O(logN)的修改和插入,否则会退化成O(原创 2010-07-22 00:36:00 · 954 阅读 · 0 评论 -
Sicilly 1194 Message Flood(字典树+搜索)
//搜索+字典树(Trie)//维基百科关于字典树的介绍//Trie,又称单词查找树,是一种树形结构,是一种哈希树的变种。//典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。//它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。#include#includeusing namespace std;in原创 2010-04-18 02:45:00 · 1810 阅读 · 3 评论 -
POJ 3750 小孩报数问题(模拟/数据结构—循环链表)
//其实是一道水题,但是可以用它来学习双向循环链表的构建和基本使用方法#include#includeusing namespace std;struct List//双向链表结构体{ char name[20]; struct List *front;//前指针 struct List *rear;//后指针};List* create(int n)//构原创 2010-04-29 01:19:00 · 3469 阅读 · 0 评论 -
POJ 2388 Who's in the Middle(堆排序)
今天看《算法导论》学了堆排序,试下改用堆排序来写复杂度O(nlgn),还能为霍夫曼树的优化作铺垫//堆排序#includeusing namespace std;int arr[10001],n;inline int left(int i)//返回左儿子的数组下标,要用内联或宏定义写{ return 2*i;}inline int right(int i)/原创 2010-05-09 02:41:00 · 1199 阅读 · 0 评论 -
POJ 3253 Fence Repair(构造Huffman Tree)
//构造Huffman Tree,非叶子节点值总和即为结果,用最小优先队列维护#include#includeusing namespace std;priority_queue,greater > q;//最小优先队列,用greater作为比较函数即可,less则为最大优先队列int main(){ //freopen("in.txt","r",stdin); l原创 2010-05-09 10:54:00 · 1025 阅读 · 0 评论 -
Sicily 1799 Slides(离散化处理)
//离散化处理 #include #include #include #include using namespace std; struct coordinate//坐标结构体 { int x,y; int id;//为每个点标记一个ID,方便关联,id和id+1的便属于同一个矩形 int color; bool used; }; vector v; bool vis[100005];//检测颜色是否出现过 int ans; int G[205][205];原创 2010-07-03 16:07:00 · 947 阅读 · 0 评论 -
POJ 3125 && Sicily 1443 Printer Queue(模拟/队列)
//简单的队列模拟#include#include#include#includeusing namespace std;int priority[101];struct Job{ int priority; bool yours;}job[101];bool cmp(int a,int b){ return a > b;}int m原创 2010-05-15 00:51:00 · 1824 阅读 · 2 评论 -
POJ 3264 Balanced Lineup(RMQ)
//RMQ,求给定区间的最大值和最小值之差 #include #include using namespace std; int n,m,k,st,ed; int Max,Min; int _max[50010][17]; int _min[50010][17]; void RMQ_init()//RMQ初始化模板 { for(int j = 1;(1原创 2010-07-13 22:00:00 · 687 阅读 · 0 评论 -
POJ 3468 A Simple Problem with Integers(线段树)
//线段树 #include using namespace std; int data[100010]; long long int ans; struct seg { int l,r,add;//ADD表示该区间内增加的量 long long int sum;//sum为改区间的总和 }segTree[400010]; //静态线段树的空间必须是给定区间大小的4倍,因为最坏情况是树最底层被分成1个区间点和1个空结点 void buildTree(int fa,int l,int原创 2010-07-16 00:03:00 · 659 阅读 · 0 评论 -
POJ 2182 Lost Cows(线段树)
//线段树 //题意:给定数列的顺序数,进而确定数列的排列 //思路:逆向思考,对给定的N个数,从第N个数入手,如果他的顺序数是k,则说明他在1~N中排第k+1位 //确定一个元素的位置K后,从1~N这个序列中删除K //之后计算第N-1个数,同理在1~N-1个数中看他排第几位,确定他的位置 //EXAMPLE: //序列:1,2,3,4 //顺序数:1,1,2 //3+1 = 4,在1,2,3,4中排第4位,ans[4] = 4,在1,2,3,4中删除4,剩1,2,3 //1+1 =原创 2010-07-13 17:11:00 · 1044 阅读 · 0 评论 -
POJ 2528 Mayor's posters(离散化+线段树)
//线段树的染色类型题目 //这题通过逆序修改线段树可以简单的实现,这是一种比较巧妙地做法 //也可以通过记录左颜色和右颜色来维护线段树实现 //下面的代码是通过逆序覆盖来实现的,逆序覆盖,即将最后一次贴上去的海报优先处理 //这样的话可以省去很多按顺序插入处理步骤,但是无法实现动态询问 //在离散化的时候我一开始使用MAP来实现,结果800MS,差点爆掉,实践证明MAP的查询速度是很慢的,还不如写个二分搞定 //但下面的代码严格来说是错误的,离散化有问题,不过数据太弱,还是可以AC的 #in原创 2010-07-17 23:09:00 · 692 阅读 · 0 评论 -
Sicily 1949 && 1876 Basic Graph Problem(RMQ+并查集)
//RMQ+并查集,RMQ套模板即可,此题关键是并查集的使用 //sicily 1949 1876是同一道题,但是注意CASE的大小写,时间区别是5s和1s #include #include #include using namespace std; int _max[100010][18],_min[100010][18]; bool ok; int father[100010]; int n,query,st,ed,u,v; void RMQ()//套模板即可 { for(i原创 2010-07-20 11:35:00 · 891 阅读 · 0 评论 -
POJ 2761 Feed the dogs(Treap求第K小数)
//TREAP求第K小数 //感谢JSH大牛的指点 //这道题之所以可以用TREAP做是因为题意中有个条件,询问区间不会出现包含的情况,因此通过对询问区间进行排序 //然后通过插入和删除的方法,来维护区间的第K小 //平衡树的话自然首选TREAP了,TREAP中比较难的就在于删除那里,删除的方式是通过将要删除的结点通过左右旋的方式,在维护LEV为堆的同时,将要删除结点旋到叶子结点处,然后删除 #include #include #include #include using namespa原创 2011-01-29 00:34:00 · 3755 阅读 · 1 评论