数据结构
文章平均质量分 65
Linnnnnger
哈哈哈哈,你看那个人好像一只狗啊。
展开
-
牛客网——丑数
题目描述很简单,给一个函数,返回第n个丑数。丑数:质因数只包含2,3,5的数字,第一个丑数是1。例如2,4,6,10就是丑数,7,14就不是丑数。一开始以为是直接暴力判断就可以过,但是后来发现,越到数字越大的数就会越容易产生非丑数,因此到后面的时候丑数与丑数之间可能存在很大的间隔,因此暴力数个数方法不可取。第二反应是搜索,从第一个数1开始每次放入2,3,5的倍数慢慢扩充,但是发现扩充过程数字大小并...原创 2018-03-04 19:59:47 · 462 阅读 · 0 评论 -
两个序列中公共子序列的个数
原题HDU5791代码如下#includeusing namespace std;#define inf 0x3f3f3f3f3f#define mod 1000000007int n,m,x;int a1[1005],a2[1005];long long dp[1005][1005];int main(){ while(cin>>n>>m) {原创 2016-09-14 18:39:51 · 1196 阅读 · 0 评论 -
Function(HDU5875)
大连网络赛。当时挺混乱的,其实根本都没看这道题。后来看了题解觉得用的方法很巧妙。值得学习。同时回忆起一道以前的题目。用的都是类似的思想。#includeusing namespace std;#define inf 0x3f3f3f3fint t,n,q,l,r,ans,modpos;int a[100005];int rightpos[100005];int main原创 2016-09-11 18:49:21 · 405 阅读 · 0 评论 -
列车调度(PAT)
当时想了很久,总是超时。最后参考了别人的代码才完全A了。PAT题目总是这样,用一些很巧妙的容器跟函数。然后大大简化代码量。#includeusing namespace std;sets;int n,x;int main(){ cin>>n; s.insert(0); for(int i=0;i<n;i++){ cin>>x;原创 2016-09-10 19:15:50 · 1422 阅读 · 1 评论 -
红色警报(PAT)
一个并查集的问题。先把边全部存起来,然后记录节点是否被攻占。然后用这些边,去掉被攻占的节点。重复建图。不断比较。#includeusing namespace std;struct node{ int w,v;};node link[5005];int n,m,k,last,now;int pa[505],live[505];int findpa(int x){原创 2016-09-10 19:11:51 · 674 阅读 · 0 评论 -
树状数组模板学习
树状数组的代码模板int a[maxn];int lowbit(int x){ return x&(-x);}void add(int x,int y){ while(x<=n) { a[x]+=y; x+=lowbit(x); }}int sum(int x){ int s=0; while(原创 2016-08-28 00:58:02 · 237 阅读 · 0 评论 -
数据结构复习——堆
说真的浙大的老师讲的挺好的。其中建堆的时候引用了哨兵概念少了很多判断,然后用堆的插入删除操作做起来简直飞快。void createH(){ Hsize=0; H[0]=-99999;}void heap_insert(int x){ int i; for(i=++Hsize; H[i/2]>x; i/=2) H[i]=H[i/2];原创 2016-08-28 00:54:12 · 338 阅读 · 0 评论 -
UVALive 7427 Elementary Math
题目大意:给定一些数对,用+-*三个运算符号去操作数对,使得每个数对操作之后的结果都不相同。如果存在满足情况的解,则按照原顺序输出,否则输出impossible一个设计的非常巧妙地二分图!!数对是一边,匹配的是所有的运算结果,如果存在这样的结果,就把点对和结果连边,得出最大匹配。特别需要注意的是,结果存储的时候需要三倍空间。小错误真的可以让人WA到怀疑人生#includeus原创 2016-08-05 16:41:57 · 709 阅读 · 0 评论 -
最小生成树的两种方法
最小生成树问题的讲道理都是很直观的,让人一眼看得穿,然后再在模版上稍加改动就完成了。一般来说Prim跟Kruskal方法都是能解题的。但是复杂度不一样。Prim的时间复杂度是O(n^2),而Kruskal方法与给出的边的数量有关,复杂度为O(eloge)其实时间都是花在排序上了 。1.Prim算法简单来说,就是从一个点开始不断寻找,链接着其他相关点,每次加入一个距离最小的点。其中low数组就是保存...原创 2016-02-19 22:46:29 · 1285 阅读 · 0 评论 -
数据结构复习——二叉树的几个基本操作
包括了几个很基本的操作,树的创建删除遍历等等#includeusing namespace std;typedef struct node* tree_pointer;struct node{ char ch; tree_pointer left_child,right_child;};tree_pointer create(tree_pointer T){原创 2016-07-03 10:03:20 · 436 阅读 · 0 评论 -
中缀表达式转成后缀表达式
正常表达式是中缀表达式,转化成后缀表达式之后方便计算值。需要注意的几点是。1.栈空直接将运算符号入栈。2.有元素,且栈顶元素优先级小于现有元素优先级,则放入,因为后边可能比改元素优先级还要高。3.栈顶元素优先级大于或等于当前元素,那么,必然是前面的先算,因此可以循环控制,将前面的优先级大于或等于当前元素优先级的符号都输出。4.控制左括号时,左括号进栈优先级降为最低。右括号进栈时原创 2016-07-02 15:24:07 · 400 阅读 · 0 评论 -
螺旋矩阵
螺旋矩阵解释起来有点烦,但是看上去之后让人一目了然。其实一开始对这个还是很反感的,因为特别难控制。但是参考了http://www.cnblogs.com/eshizhan/archive/2010/06/01/1749013.html之后,其实发现也就这么回事儿。#includeusing namespace std;int ar[105][105];int n;void Sp原创 2016-07-02 09:52:14 · 476 阅读 · 0 评论 -
中序后序,中序先序求二叉树
用中序,后序求二叉树int build(int la,int ra,int lb,int rb){ if(la>ra) return 0; int root=a[ra]; int i; for(i=lb;i<=rb&&b[i]!=root;i++){} if(i<=rb){ L[root]=build(la,ra-rb+i原创 2016-08-26 03:22:07 · 551 阅读 · 0 评论 -
Trie树模板
最近在扩充知识量,疯狂学习模板贴一个trie树模板,里边26可改动,这里仅针对小写字母#include using namespace std;typedef struct Trie{ int v; Trie *next[26];} Trie;Trie root;void createTrie(char *str){ int len = strlen(原创 2016-10-03 14:32:30 · 271 阅读 · 0 评论 -
KMP模板学习
KMP真是个神奇的东西#include using namespace std;char mo[10005],str[1000005];int nextpos[10005];int t;int main(){ //freopen("1.txt", "r", stdin); scanf("%d",&t); while(t--){ scanf("原创 2016-10-03 19:34:00 · 295 阅读 · 0 评论 -
Kattis-spiral
题目大意:给定蛇形矩阵,然后矩阵中的素数是不能到达的.现在给定两个数,求从一个数为起点到另一个数的最短距离是多少.(上下左右移动)其实就是简单的素数筛,加简单bfs,只需要一开始吧矩阵构建出来就行.自己荒废了一个寒假,手生了很多.徒手撸的时候耽误了很多时间直接导致崩盘.引以为戒,而且自己以前也学习过一篇专门描写螺旋矩阵的题目的文章.写完就去回顾http://blog.csdn.net/tinygu...原创 2017-03-01 18:43:50 · 374 阅读 · 0 评论 -
数据结构复习——二叉排序树
最近复习到二叉排序树,让自己对树的概念理解的更加清晰了。贴上自己的代码供大家参考学习用。最关键的是二叉排序树的删除操作。#includeusing namespace std;typedef struct node * tree_point;struct node{ int data; tree_point lchild, rchild;};int n, a[105]原创 2017-07-18 18:28:47 · 404 阅读 · 0 评论 -
关于组合数与Lucas定理
这是属于数论的一部分,找了代码及题目。刷了几道题目之后发现其实大部分也都是在模版上做修改。Lucas定理是用来求 c(n,m) mod p,p为素数的值。正常用组合数做必然爆炸。因此先给出两种组合数的写法。第一种中规中矩的算,变算变除。减少了溢出的可能性,但数据一大还是要溢出的。long long Combination(int n,int m)//组合数{long原创 2016-02-19 22:59:24 · 585 阅读 · 0 评论 -
关于几种排序的个人整理及分析
个人总结,帮助自身理解。如有错误,望指正。原创 2015-12-10 18:44:49 · 525 阅读 · 0 评论 -
最短路问题(各种方法整理)附上一个完美模板
最短路问题(short-path problem),从某点出发到达另一点所经过的路径权值相加最小的一条路径,就是最短路径。经典的也是最容易掌握的方法Floyd,Dijkstra两种算法。1.Floyd算法Floyd算法可以求解的是任意两点的最短路径,功能强大,因此复杂度也很高,但是非常的好懂。思想很简单,两点的最短路径无非就是直接从一点到另一点,要么就是中间还存在着其他的点。因此只原创 2016-04-27 20:41:38 · 5941 阅读 · 0 评论 -
页面置OPT算法
已经第二次出现这种OPT模拟的题目了,时间被卡到怀疑人生第一次出现时统计置换次数第二次出现是添加部分条件:同时存在最大值时按页面大的删除,最后输出操作结束后的结果,按照最原始的顺序输出。贴上代码。#includeusing namespace std;#define inf 0x3f3f3fstruct node{ int pos, x; node(){};原创 2017-03-22 10:08:40 · 1115 阅读 · 0 评论 -
Kattis-torn to pieces
题目大意:第一行给出n代表有n张地图碎片,接下来n行给出碎片上的信息,第一个单词代表这个碎片上的节点,后边所有的节点都与第一个节点相连接.最后一行给出查询,问从A到B是否存在一条路径可以通过给定的拼图的一部分拼凑而成,可行的话输出路径,否则输出no route find可能是比赛当时受了先前题目的影响,看到这题之后第一时间想到的就是最短路,题目保证了最多只有一条路.因此,只需要把每个节点名原创 2017-01-14 08:52:21 · 784 阅读 · 0 评论 -
hdu3172Virtual Friends涨姿势并查集
题目描述大致如下:给定n个关系,每次给出关系的时候,求出这个集合的中人的总数,每次合并这两个人所在的集合因为每次给出关系的时候都需要求出总数,所以每次去合并的时候去重新更新根节点,再去统计是不现实的.一开始因为这个TLE好几次.之后发现其实每个子节点的个数也是可以合并到根节点去的,就类似p数组,可以定义sum数组,每次合并的时候,把子节点中的个数加入到父节点中,每次输出父节点的sum即原创 2017-01-13 10:59:38 · 330 阅读 · 0 评论 -
hihocoder1138涨姿势的最短路
题目的大致意思是说,给定n个点的坐标,让我们求起点到终点的最短距离.点点之间的距离是min(abs(x1-x2),abs(y1-y2))一开始根本不会写.直到看到了博主:http://blog.csdn.net/octopusflying/article/details/51125562的代码思路大体是,从点1到点n的最短路必然经过这个点的前驱和后继.相对的,有x方向的前驱后继,y方向原创 2017-01-13 10:44:12 · 605 阅读 · 0 评论 -
Kattis - oceancurrents优先队列+bfs
题目大意是,给定整个图中各个点的流向,在这个点上顺着流向前进是不需要消耗体力的,但是往其他方向走是需要消耗体力的.给定终点起点,求从起点到终点,最小消耗的体力是多少当时看到这个问题之后第一反应是搜索,但是1000*1000个各自显然是要爆炸的.赛后发现其实可以用优先队列搜索,或者是A*搜索原创 2017-01-14 08:45:00 · 359 阅读 · 0 评论 -
manachar模板
需要注意的点是开数组的时候需要开出2倍。否则会访问越界。因为一开始涉及到字符的扩充#includeusing namespace std;const int MAX=1100000+10;char s[2*MAX];int p[2*MAX];int t;int main(){ scanf("%d",&t); while(t--){ scanf("%s原创 2016-10-05 12:29:40 · 483 阅读 · 0 评论 -
数据结构复习——线性表的链式存储实现(双向链表)
其实与单向链表大同小异,只是多了一个前驱指针。操作起来多了几个小步骤而已。#includeusing namespace std;typedef struct Node * Nodeptr;typedef struct Node{ int data; //数据 struct Node *pre,*next; //指针} NODE;原创 2016-06-30 15:27:29 · 510 阅读 · 0 评论 -
数据结构复习——线性表的链式存储实现(单向链表)
上一篇讲了顺序存储,现在是实现另一种形式:链式存储。顺便还多做了除了做了单向链表,还实现了双向链表,十字链表。原创 2016-06-30 10:25:07 · 455 阅读 · 0 评论 -
数据结构复习——线性表的顺序存储实现
线性表有两种方法实现,一种是顺序存储实现,另一种是链表存储实现。顺序存储说白了就是用数组去存储。简单的实现了增,删,查。#includeusing namespace std;#define MAXSIZE 105typedef struct{ int data[MAXSIZE]; int Len;} List;void printList(List *pt原创 2016-06-29 14:26:39 · 561 阅读 · 0 评论 -
Process the Tasks(ZOJ3331)
题目链接:http://icpc.moe/onlinejudge/showProblem.do?problemCode=3331题意:给两个机器,然后很多个操作,分别给出对应操作在AB两个机器上运作的时间,限定该操作能执行的条件是,前一个操作已完成或正在执行.http://blog.csdn.net/loy_184548/article/details/50733395第一次接原创 2016-04-05 18:42:26 · 473 阅读 · 0 评论 -
One Person Game(ZOJ3329)
题目链接:http://icpc.moe/onlinejudge/showProblem.do?problemCode=3329题目意思是,给三个骰子,骰子分别有K1,K2,K3个面,另外设定a,b,c。如果摇到的点数正好是a,b,c那么现有的分数清零。如果不是那么计入当前的分数,分数到达n了之后游戏结束,问结束的次数期望说真的按照先前的思路。必然定义出dp[i],表示摇到这个点结束的原创 2016-04-05 18:35:31 · 630 阅读 · 0 评论 -
LOOPS(HDU3853)
说真的,一开始碰到dp就头疼,一个是自己容易被绕进去,另一个是自己总是不能正确的找到状态转移。再一个就是自己的代码量还不够,总是不能很完整的考虑边界情况,很完整的把问题写对。dp题就是这样,一点点写错就会发生莫名其妙的错误,然后debug花上好久。下定决心啃dp这块硬骨头。这是一道概率dp入门题。(似乎算期望的都是比较简单的dp题)dp[i][j]表示在i,j这个点到达终点的能量消耗期原创 2016-04-05 16:40:12 · 627 阅读 · 0 评论 -
Chessboard(HDU1838)
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1838题目是说给出一个矩阵,然后求下图类似的棋盘,边长最大的有几个。输入01代表黑白。然后这个问题是两个问题1.求出满足图形条件的最大边长,2.求出个数。代码如下:#includeusing namespace std;#define inf 0x3f3f3f3fchar原创 2016-04-04 17:11:21 · 392 阅读 · 0 评论 -
Fibonacci(POJ3070)
题目链接http://poj.org/problem?id=3070涨姿势了原来斐波那契还可以用矩阵去算。也当是知识积累,同时更新自己的模板库#include #include #include using namespace std;typedef vector vec;typedef vector mat;typedef long long LL;const int N原创 2016-04-04 16:08:47 · 288 阅读 · 0 评论 -
Consecutive Blocks (ZOJ3970)
给出n个带着颜色的方块,然后最多去掉k块,求最长的连续颜色段。如1122322,去掉3则最长是4,另外113311去掉33最长则是4。思路是先把所有的颜色排到一起,再去一次遍历得到符合条件的(去掉小于等于k块)最大连续段。难点:1.关于把所有的颜色放到一起,可以开许多个vector把相同的颜色放到同一个vector,也可以自己写cmp排在一起,操作起来大同小异。2.关于怎么原创 2016-03-22 19:53:22 · 847 阅读 · 0 评论 -
关于动态规划的一个精彩的入门文章(背包)
原文地址如下,已经不再更新http://www.cnblogs.com/SDJL/archive/2008/08/22/1274312.html ---------以下是原文---------对于动态规划,每个刚接触的人都需要一段时间来理解,特别是第一次接触的时候总是想不通为什么这种方法可行,这篇文章就是为了帮助大家理解动态规划,并通过讲解基本的01背包问题来引导读者如何去思转载 2016-03-22 17:55:40 · 540 阅读 · 0 评论 -
进制转化(尤其是负进制)
现在在noip的系列题上做到过进制转化的问题,一直没时间去搞明白,今天总算弄清楚了。http://www.cnblogs.com/yylogo/archive/2011/08/04/NOIP-2000-2.html123可表示为 1*102+2*101+3*100 这样的形式。分四种情况1。十进制数是正数,基数是正数(这种情况最容易)2。十进制数是正数,基数是负数3原创 2016-03-11 12:41:15 · 621 阅读 · 0 评论 -
拓扑排序
简单的讲就是,每次去掉一个入读为0的点,然后清除掉相关边(也就是在相关点的度数操作)#include#include#include#define mod 1e9+7#define ll long long#define inf 0x3f3f3f3fusing namespace std;int G[505][505];int indegree[505];int main原创 2016-02-19 23:18:22 · 383 阅读 · 0 评论 -
gcd以及多数gcd
以前曾经因为多数gcd被坑了好几次。终于冷静下来找时间把这个坑给填了。然而只是一些思维上简单的思考而已。没什么多说的。直接上代码1.给出一个最简单的gcd写法。2.多个数的gcd其实也很简单,最重要的是后续求值的时候是否除掉了先前的gcd,下边的写法乘,除,再乘是为了防止溢出。#include#include#include#includeusing namespa原创 2016-02-19 23:08:53 · 922 阅读 · 0 评论 -
图的深搜与广搜
关于图的dfs与bfs原创 2015-12-09 16:31:50 · 565 阅读 · 0 评论