![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 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 · 1290 阅读 · 0 评论 -
POJ 2828 Buy Tickets(线段树)
//线段树,利用线段树的灵活性,实现排队//算法关键:逆序插入,线段树区间维护该区间剩余有效地空位,每从线段树中找到一个合适位置插入,都会减去一个有效空位//相当于整个队列的序号向右移了一位,通过树状结构维护remain值,便可实现O(NlgN)的复杂度//倒序插入,每找到一个合适的位置,这个位置就肯定是最终确定的位置#include#define MAX 200005using namespace std;struct seg{ int l,r,remain;}se原创 2010-07-20 21:27:00 · 801 阅读 · 0 评论 -
POJ 2524 Ubiquitous Religions(并查集)
//并查集的简单应用——带路径压缩的并查集//平摊分析后,每个点只需遍历一次即可建立相应并查集,搜索的复杂度是O(1);#includeusing namespace std;int fa[50010],n,m,ans,vis[50010];void initSet()//初始化{ for(int i = 1;i原创 2010-07-23 10:21:00 · 681 阅读 · 0 评论 -
POJ 2236 Wireless Network(并查集)
#include#includeusing 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 · 843 阅读 · 0 评论 -
POJ 2492 A Bug's Life(并查集)
//并查集,类似于POJ 1703//通过维护当前结点与父亲的关系来实现对同性恋的判断//并查集的分类依据是能否相互确定关系,能相互确定关系的在同一颗树种#include#define MAX 2005using 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 · 1277 阅读 · 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 2147483647using原创 2010-07-25 11:29:00 · 1305 阅读 · 0 评论 -
Sicily 1686 Happy Children's Day(线段树)
//线段树//WA了很多次,最后查出原因居然是建树的时候初始化有最大糖果的下标错了//我只有在叶子节点有初始化,其他点没有,所以错了,正确初始化应该是每个区间最左边的点为maxid//线段树插入和修改的inherit和update函数是关键,直到这道题总算摸索出套路了//建树什么都差不多,关键就看如何识别标记,如何处理区间与区间之间关系,如何回溯传递结果#include#define MAX 100005using namespace std;struct seg{原创 2010-07-28 02:37:00 · 1106 阅读 · 0 评论 -
POJ 2513 Colored Sticks(Trie+并查集+欧拉回路)
//TRIE + 并查集 + 欧拉回路//A了这道题,学会了用并查集判断无向图的连通性#include#include#includeusing 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 · 804 阅读 · 0 评论 -
Sicily 1426 Phone List(Trie树)
//Trie树//对每个号码构造Trie树,利用状态status进行识别#include#includeusing 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 · 1981 阅读 · 1 评论 -
Sicily 1021 Couples(数据结构——栈)
//数据结构——栈//先开一个数字然后标记号是couple的编号//接着从1~2n一个个塞进栈中,同时调用couple数组进行检查,看是否能与栈顶元素合并//如果能合并,就从栈顶中移除//到最后如果栈顶为空,则说明能够全部移除#include#include#includeusing namespace std;int couple[200010];int main(){ int n,l,r; while(scanf("%d",&n) && n) {原创 2010-06-17 21:16:00 · 4205 阅读 · 5 评论 -
Sicily 1802 Atomic Nucleus Investigation(线段树)
新手赛的题目,让我回想起打酱油的时光//线段树#include#include#include#define INF 100000000using 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 · 2897 阅读 · 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 · 3631 阅读 · 2 评论 -
POJ 1703 Find them, Catch them(并查集)
//并查集,NND忘了个句号WA了3次!//A过POJ1182的食物链后再来做这道题就轻松多了,这是食物链的简单版//并查集的集合是以能否确定关系来分的,而不是以属于同一个帮派或不同帮派来分的//这类题只需建立一个并查集,然后维护每个结点和他的根结点之间的关系属性即可//如果2个点不在同一个并查集中,那么这2个点无法确定关系//在同一个并查集中的每个点,都能确定集合中的相互关系#includeusing namespace std;struct node{ int f原创 2010-07-23 17:07:00 · 880 阅读 · 0 评论 -
POJ 1611 The Suspects(并查集)
//并查集,统计不相交集合的元素个数#includeusing 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 · 1395 阅读 · 0 评论 -
POJ 2777 Count Color(线段树+位运算优化)
//线段树//A完这道题收获很大,一开始我不会用位运算,是用vis[30]数组一个一个标记颜色过的,速度比较慢800+MS//经大牛指点,使用位运算来记录颜色,结果快了一倍//通过这道题,对线段树的架构有了清晰的了解//对于线段树,特别的地方在于对区间的标记,搜索时后要先读取区间的标记,然后更新左右子树的标记//通过标记便可以不用再修改到要求区间的时候改变子树的区间状态,等到下次修改时有经过这个节点,再修改左右子树状态//只有这样才叫做实现O(logN)的修改和插入,否则会退化成O(原创 2010-07-22 00:36:00 · 951 阅读 · 0 评论 -
Sicilly 1194 Message Flood(字典树+搜索)
//搜索+字典树(Trie)//维基百科关于字典树的介绍//Trie,又称单词查找树,是一种树形结构,是一种哈希树的变种。//典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。//它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。#include#includeusing namespace std;in原创 2010-04-18 02:45:00 · 1806 阅读 · 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 · 3468 阅读 · 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 · 1195 阅读 · 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 · 1024 阅读 · 0 评论 -
Sicily 1799 Slides(离散化处理)
//离散化处理#include#include#include#includeusing 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 · 945 阅读 · 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 · 1822 阅读 · 2 评论 -
POJ 3264 Balanced Lineup(RMQ)
//RMQ,求给定区间的最大值和最小值之差#include#includeusing 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 · 686 阅读 · 0 评论 -
POJ 3468 A Simple Problem with Integers(线段树)
//线段树#includeusing 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 · 658 阅读 · 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 · 1041 阅读 · 0 评论 -
POJ 2528 Mayor's posters(离散化+线段树)
//线段树的染色类型题目//这题通过逆序修改线段树可以简单的实现,这是一种比较巧妙地做法//也可以通过记录左颜色和右颜色来维护线段树实现//下面的代码是通过逆序覆盖来实现的,逆序覆盖,即将最后一次贴上去的海报优先处理//这样的话可以省去很多按顺序插入处理步骤,但是无法实现动态询问//在离散化的时候我一开始使用MAP来实现,结果800MS,差点爆掉,实践证明MAP的查询速度是很慢的,还不如写个二分搞定//但下面的代码严格来说是错误的,离散化有问题,不过数据太弱,还是可以AC的#in原创 2010-07-17 23:09:00 · 691 阅读 · 0 评论 -
Sicily 1949 && 1876 Basic Graph Problem(RMQ+并查集)
//RMQ+并查集,RMQ套模板即可,此题关键是并查集的使用//sicily 1949 1876是同一道题,但是注意CASE的大小写,时间区别是5s和1s#include#include#includeusing 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 · 885 阅读 · 0 评论 -
POJ 2761 Feed the dogs(Treap求第K小数)
//TREAP求第K小数//感谢JSH大牛的指点//这道题之所以可以用TREAP做是因为题意中有个条件,询问区间不会出现包含的情况,因此通过对询问区间进行排序//然后通过插入和删除的方法,来维护区间的第K小//平衡树的话自然首选TREAP了,TREAP中比较难的就在于删除那里,删除的方式是通过将要删除的结点通过左右旋的方式,在维护LEV为堆的同时,将要删除结点旋到叶子结点处,然后删除#include#include#include#includeusing namespa原创 2011-01-29 00:34:00 · 3754 阅读 · 1 评论