ACM
文章平均质量分 73
令羽
哈尔滨工业大学计算机科学与技术专业,专注于acm算法的学习研究,linux系统的学习,以及编程语言的学习,致力于成为一名技术大牛。
展开
-
hoj1402整数划分问题
/*整数划分是一个经典的问题。希望这道题会对你的组合数学的解题能力有所帮助。Input 每组输入是两个整数n和k。(1 Output 对于每组输入,请输出六行。 第一行: 将n划分成若干正整数之和的划分数。 第二行: 将n划分成k个正整数之和的划分数。 第三行: 将n划分成最大数不超过k的划分数。 第四行: 将n划分成若干奇正整数之和的划分数。 第五行:原创 2013-06-20 21:19:58 · 925 阅读 · 0 评论 -
ACM训练表
ACM online Judge中国:浙江大学(ZJU):http://acm.zju.edu.cn/ 北京大学(PKU):http://acm.pku.edu.cn/JudgeOnline/ 杭州电子科技 大学(HDU):http://acm.hdu.edu.cn/中 国科技大学(USTC):http://acm.ustc.edu.cn/ 北京航天航空大学(BUAA)ht原创 2012-08-18 17:42:31 · 2743 阅读 · 0 评论 -
树的几种表示法
1、双亲表示法双亲表示法声明如下:typedef int TPosition; //结点的位置类型为整型struct NodeType ElemType data ; //该结点的数据 TPosition Parent; //该结点的父亲的数组下标,对于根结点该域为0 } struct TreeType int NodeCount;原创 2012-12-18 15:15:49 · 16648 阅读 · 0 评论 -
逆序数求法
求逆序数可以有三个方法,一个是模拟冒泡排序,效率低下;二是归并排序,求逆序数,一般够用;三是用树状数组,我还没研究过怎么用。冒泡排序的算法:for (int i = 0; i < t; i++) { for (int j = 0; j < t - i - 1; j++) if (a[j] > a[j + 1]) {原创 2012-08-26 18:58:42 · 1945 阅读 · 0 评论 -
hoj 1098 NetWork标准求割点的做法(tarjan算法)
hoj 1098 NetWork //poj 1144 NetWork 求割点标准求割点的做法(tarjan算法)定理: 设v是Gpi(是G的一棵深度优先搜索树)中的某一非根顶点,v是G的割点当且仅当 v有一个子顶点s,使得不存在从s或s的任何后裔顶点指向v的某个真祖先顶点的反向边。 如图: 1------2 \ /原创 2012-08-15 15:16:05 · 1665 阅读 · 0 评论 -
输出马鞍点
/*若矩阵Am×n中的某个元素aij是第i行的最小值,同时又是第j列中的最大值,则称此元素为该矩阵中的一个马鞍点。假设以二维数组存储矩阵Am×n,试编写求出矩阵中一个马鞍点的算法,并分析你的算法的最坏情况下的时间复杂度#includeint main(){ int n, m, i, j, k, l, minn, maxx, flag ; int a[256][2原创 2012-11-25 22:49:25 · 5353 阅读 · 3 评论 -
POJ 2505 乘法博弈
题意:Stan从1开始,可以乘上2~9中任何一个数,Ollie也如此操作,只到某个人本回合的操作超过N为之。。1找到Stan的必败状态,[10,18],[163,324]……[9^n*2^(n-1)+1,9^n*2^n]。。从1开始,无论stan怎么操作,ollie将格局变为平衡状态[9^1*2^0+1,9^1*2^1]([10,18])以后无论stan怎么走,原创 2012-11-24 21:56:57 · 1328 阅读 · 0 评论 -
hdu 2222-Keywords Search
#include#includeusing namespace std;const int kind=26;struct node{ node* fail;//失败指针 node* next[kind];//Tire每个节点的26个子节点(最多26个字母) int count;//是否为该单词的最后一个节点 node()//构造函数初始化 {原创 2012-11-24 16:45:55 · 620 阅读 · 0 评论 -
splay tree
计算机算法和数据结构中,有各种多样的树,比如AVL树,红黑树,B+树等等,这几种树主要的主要目的是尽量保持平衡,保证即使在最坏情况下,时间复杂度 是O(logN),也就是说,从根节点到最底层的叶子节点,路径不会相差太远。比如B+树,它通过节点的分裂来保持尽量平衡,而且这种树比较散,高度不 高,访问路径都比较短,比较适合在数据库中作索引。但是今天我要说一说splay树,我不知道中文叫什么原创 2012-12-03 00:37:41 · 894 阅读 · 0 评论 -
AVL图解
AVL平衡树的实现图解:http://hi.baidu.com/qcfhpywjzjbeloe/item/29357a5fb1b26b09e6c4a58d原创 2012-11-26 14:28:26 · 891 阅读 · 0 评论 -
HIT Training Camp III
A:http://poj.org/problem?id=1270POJ 1270Following OrdersAnalysis分析这是一道比较典型的全排列生成问题,只是生成的每一个排列都要满足给定的条件,且必须按顺序生成。我们当然可以简单的利用STL里的next_permutation函数来解决这个问题,事实上这是非常容易的。关于next_permutatio原创 2012-11-25 17:43:07 · 708 阅读 · 0 评论 -
各种排序算法总结
排序算法是一种基本并且常用的算法。由于实际工作中处理的数量巨大,所以排序算法对算法本身的速度要求很高。而一般我们所谓的算法的性能主要是指算法的复杂度,一般用O方法来表示。在后面我将给出详细的说明。 对于排序的算法我想先做一点简单的介绍,也是给这篇文章理一个提纲。 我将按照算法的复杂度,从简单到难来分析算法。 第一部分是简单排序算法,后面你将看到他们的共同点是算法复杂度为O(N*N)原创 2013-01-28 12:13:11 · 586 阅读 · 0 评论 -
ACM基本算法分类、推荐学习资料和配套pku习题
ACM基本算法分类、推荐学习资料和配套pku习题一.动态规划 参考资料: 刘汝佳《算法艺术与信息学竞赛》《算法导论》 推荐题目: http://acm.pku.edu.cn/JudgeOnline/problem?id=1141 简单 http://acm.pku.edu.cn/JudgeOnline/problem?id=22原创 2013-03-14 23:37:53 · 871 阅读 · 6 评论 -
usaco 总结
usaco 总结Personalized Curriculum for Leo Kan; Last visit: 12 hours agoCongratulations! You have finished all available material.Chapter 1 DONE 2008.03.16 Getting startedChapter 2转载 2013-03-14 23:44:00 · 1282 阅读 · 0 评论 -
HOJ2741The Busiest Man 强连通分量+缩点+传递闭包
强连通分量+缩点+传递闭包。有n种物品,现给出m种关系,每种关系a,b对应着物品b能够用物品a来换,然后有q个询问(a,b),问物品a能不能换到物品b。刚开始是判断两个点是否在一个连通分量里,后来想下题目有问单向可达即可,判连通分量范围太小,是错的。这题直接搜索也能过。但是如果求传递闭包的话,直接用floyed超时。可以先缩点,再对新图求传递闭包。这是一类关系问题中的单向连通。是一类有原创 2013-04-20 18:39:57 · 717 阅读 · 0 评论 -
HOJ1520&&POJ2553The Bottom of a Graph强连通分量缩点+判断度数
用的tarjan算法。找出所有强连通分量,缩点,入度为零的升序输出。注意输出格式。链式前向星存图。以后养成用这种方法存图。很不错的说。#include #include using namespace std;#define maxn 5010#define maxm 30000int top;//栈顶位置int Bcnt;//强连通分量编号int Index;/原创 2013-04-20 17:57:14 · 701 阅读 · 0 评论 -
hoj2360Redundant Paths双连通
大致题意: 为了保护放牧环境,避免牲畜过度啃咬同一个地方的草皮,牧场主决定利用不断迁移牲畜进行喂养的方法去保护牧草。然而牲畜在迁移过程中也会啃食路上的牧草,所以如果每次迁移都用同一条道路,那么该条道路同样会被啃咬过度而遭受破坏。 现在牧场主拥有F个农场,已知这些农场至少有一条路径连接起来(不一定是直接相连),但从某些农场去另外一些农场,至少有一条路可通行。为原创 2013-04-22 11:14:42 · 780 阅读 · 0 评论 -
POJ 1236 Network of Schools强连通分量缩点
/*相当经典的题目了. 题的描述有点儿长, 我就不想再描述了...题中的任务A, 其本质就是求这个有向图中所有强连通分量中, 入度为0的个数. 原理还是挺好理解的:入度不为0的强连通分量, 显然可以由其他强连通分量达到. 也就是说, 要想让所有学校都拿到软件,需要且只需要从入度为0的那些强连通分量出发即可.题中的任务B稍微复杂些., 意思是增加多少条边, 可以使整个图变成强连通的. 这时需原创 2013-04-21 17:02:33 · 773 阅读 · 1 评论 -
poj2942点双连通奇圈-二分图判断Knights of the Round Table
题意:在亚瑟王的圆桌骑士团中,某些骑士两两之间相互憎恨,这样一来他们开会的时候边不能相邻的坐着。即肯定存在某些人不能参加会议。假如一个骑士所有的会议都不能出席,那么他就会被驱逐。现在已知那些骑士之间相互憎恨,求最少要驱逐多少名骑士。(开会时人数必需>=3且为奇数)题解:建图时,对互相不憎恨的两人之间连一条边。对任意一名骑士来说,他要能出席某次会议则他左右的人都不能与他互相憎恨。将每次参加会议的原创 2013-04-23 20:54:49 · 1375 阅读 · 1 评论 -
关于差分约束系统
最近几天系统得学习了一些差分约束系统的原理,特此记录如下:所谓差分约束系统,是指一组不定方程(A,x,T,b),其中A的每行有一个1,一个-1,其余为0,x为解向量,T为=组成的向量,b为约束矢量。具体来说,就是每行都具有 xi-xj >=|这是典型的线性规划的个案,但是也可以转化为图论来做,利用最短路(或最长路)方法可以实现高效的解决方案。下面通过poj上的部分例题来详细解释转载 2013-04-15 11:30:05 · 673 阅读 · 0 评论 -
poj 3207 Ikki's Story IV - Panda's Trick 2-sat+建图
/*2-sat题意:一个环上有n个点,有m对点之间有连接,连接可以在环内,也可以在环外,问这些连接是否相交重点还是在建图,每个连接作为一个对象,他有两个状态,在环内,在环外若两连接相交,则必是一个在环内,一个在环外,如a、b相交,包含同在环内相交,同在环外相交,则同在内相交:a在内(a*2),那么b必在外(b*2+1)b在内(b*2),那么a必在外(a*2+1)原创 2012-08-17 14:31:05 · 2629 阅读 · 0 评论 -
hoj1098NetWork求割点数目
#include #include #include using namespace std;#define X 120int map[X][X],dfn[X],low[X],ans[X],n,m,depth;void init(){ memset(map,0,sizeof(map)); memset(dfn,0,sizeof(dfn)); memset(lo原创 2013-04-21 17:52:43 · 717 阅读 · 0 评论 -
tarjan求割点HOJ1007SPF
//求割点HOJ1007#include #define min(a,b) a>b?b:a;#define max(a,b) a>b?a:b;const int V=1001;struct Edge{ int next,to;} edge[V*V];int cnt,idx;int cut[V],n,head[V];int low[V],dfn[V];void in原创 2013-04-21 17:38:34 · 918 阅读 · 0 评论 -
pojDP列表
※最近更新:Poj斜率优化题目1180,2018,3709 列表一:经典题目题号:容易: 1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1191,1208, 1276, 1322, 1414, 1456, 1458, 1609, 1644, 1664, 1690, 1699, 1740,原创 2013-03-24 16:16:29 · 1859 阅读 · 0 评论 -
1819 郁闷的出纳员之树状数组解法
这个题目最近很火呵,FallingFlowers的空间有SBT的解法,我又从icecream那学来了线段树的解法。最近在网上发现树状数组有查询第k大的功能,想到用在这个题目上,于是有了树状数组解法,试了一下,速度很快,0.45s,树状数组的效率还真是BT啊。这个题目的要求就是插入元素,删除元素,查询第k大。插入就不用说了,删除的时候用一个堆保存插入过的元素,然后从前到后依次删除,直到堆顶元素不原创 2012-08-12 17:06:16 · 1040 阅读 · 0 评论 -
HOJ2838 Nim or not Nim?
博弈-(取走-分割游戏)题目大意:Alice和Bob轮流取N堆石子,每堆S[i]个,Alice先,每一次可以从任意一堆中拿走任意个石子,也可以将一堆石子分为两个小堆。先拿完者获胜。(1 ≤ N ≤ 10^6, 1 ≤ S[i] ≤ 2^31 - 1)算法分析:可以看到S[i]的值可能非常大,如果计算每一堆的sg值是不现实的,所以需要我们找规律来计算给定的石堆的sg值。找原创 2012-08-24 17:09:39 · 576 阅读 · 0 评论 -
HOJ-GSM-Graham's Scan法求解凸包问题
概念凸包(Convex Hull)是一个计算几何(图形学)中的概念。用不严谨的话来讲,给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边型,它能包含点集中所有点的。严谨的定义和相关概念参见维基百科:凸包。这个算法是由数学大师葛立恒(Graham)发明的,他曾经是美国数学学会(AMS)主席、AT&T首席科学家以及国际杂技师协会(IJA)主席。(太汗了,这位大牛还会玩杂技~原创 2012-08-13 10:04:48 · 1721 阅读 · 0 评论 -
康拓展开及应用
康拓展开及应用 题目:给出n个互不相同的字符, 并给定它们的相对大小顺序,这样n个字符的所有排列也会有一个顺序. 现在任给一个排列,求出在它后面的第i个排列.这是一个典型的康拓展开应用,首先我们先阐述一下什么是康拓展开。(1)康拓展开 所谓康拓展开是指把一个整数X展开成如下形式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+..原创 2012-08-22 20:49:16 · 3619 阅读 · 1 评论 -
线段树小结
这段时间是线段树专题。做了好些题目,发现线段树实在是太灵活了,可以根据题目所需添加一些信息或者调整一些构造或查询方法。 小结一下。 线段树用途:RMQ,线段求长,矩形交,矩形并等…… 线段树基本操作:建树,插入,删除,查询,更新,删树因为它是一棵二叉树,所以它的操作一般除了建树,删树是O(N),其余的都是O(LogN)的。这个复杂度基原创 2012-08-28 20:01:22 · 888 阅读 · 0 评论 -
1460 Heavy Cargo 最短路径 Dijkstra 变形
题意:有一个卡车公司能生产非常大的卡车,卡车打的足以装下任何大小和重量的货物;现在 要用这卡车 运送货物, 从城市A运送到城市B,城市与城市之间的道路构成一个 无向图, 道路有最大的承受重量,请选择 运送的路径 输出 能卡车 最多可以装载多少货物;思路:应该是网络流的题目,不过 用Dijkstra也可以解, 利用Dijkstra算法 求出每条路径的最小装载,然后在这些最小装载中 找到最大的原创 2012-08-15 15:02:00 · 535 阅读 · 0 评论 -
ACM进阶指南
ACM队不是为了一场比赛而存在的,为的是队员的整体提高。大学期间,ACM队队员必须要学好的课程有:l C/C++两种语言l 高等数学l 线性代数l 数据结构l 离散数学l 数据库原理l 操作系统原理l 计算机组成原理l 人工智能l 编译原理l 算法设计与分析除此之外,我希望你们能掌握一些其它的知识,因为知识都是相互联系,触类旁通的。以下学原创 2012-08-18 16:54:25 · 1719 阅读 · 0 评论 -
POJ Biorhythms 中国剩余定理概念理解入门
BiorhythmsTime Limit: 1000MS Memory Limit: 10000KTotal Submissions: 91042 Accepted: 27732DescriptionSome people believe that there are three cycles in a per原创 2012-08-22 09:33:38 · 1337 阅读 · 0 评论 -
Tarjan算法
求最近公共祖先(LCA)的Tarjan算法 首先,Tarjan算法是一种离线算法,也就是说,它要首先读入所有的询问(求一次LCA叫做一次询问),然后并不一定按照原来的顺序处理这些询问。而打乱这个顺序正是这个算法的巧妙之处。看完下文,你便会发现,如果偏要按原来的顺序处理询问,Tarjan算法将无法进行。 Tarjan算法是利用并查集来实现的。它按DFS的顺序遍历整棵树。对于每个原创 2012-08-23 08:41:56 · 4157 阅读 · 0 评论 -
全排列问题的STL用法(next_permutation类)
标准库全排列next_permutation()在标准库算法中,next_permutation应用在数列操作上比较广泛.这个函数可以计算一组数据的全排列.但是怎么用,原理如何,我做了简单的剖析.首先查看stl中相关信息.函数原型:template bool next_permutation( BidirectionalIterator原创 2012-08-24 18:42:50 · 1196 阅读 · 0 评论 -
快速幂,积取模总结
在Miller Rabbin测试素数,就用到了快速幂取模的思想。这里总结下。求a^b%c(这就是著名的RSA公钥的加密方法)当a,b很大时,直接求解这个问题不太可能 算法1:利用a*b%c=((a%c)*b)%c,这样每一步都进行这种处理,这就解决了a^b可能太大存不下的问题,但这个算法的时间复杂度依然没有得到优化算法2:另一种算法利用了二分的思想,可以达到原创 2012-08-26 11:40:29 · 776 阅读 · 0 评论 -
错排问题
某人写了n封信和n个信封,如果所有的信都装错了信封。求所有的信都装错信封,共有多少种不同情况。 题解:1、当N=1和2时,易得解~,假设F(N-1)和F(N-2)已经得到,重点分析下面的情况:当有N封信的时候,前面N-1封信可以有N-1或者 N-2封错装前者,对于每种错装,可从N-1封信中任意取一封和第N封错装,故=F(N-1)*(N-1)后者简单,只能是没装错的那封和第N封交换信封,没装原创 2012-08-30 14:57:12 · 600 阅读 · 0 评论 -
hdu4389-X mod f(x)-多校9-1010题解
Brief Description:题目要求统计出区间[a, b]中能够被自身的数位之和整除的数的个数。Analysis:摘自题解:分别计算出[1, b]中符合条件的个数和[1, a-1]中符合条件的个数。d[l][i][j][k]表示前l位和为i模j的结果为k的数的个数,那么就有方程d[l+1][i+x][j][(k*10+x)%j原创 2012-08-30 15:50:01 · 1235 阅读 · 0 评论 -
bitset 用法整理
在项目中需要使用到10进制48位的数字按二进制由高到低解释,然后按每一位是0还是1来判断报警或错误状态。所以,在Linux中的C++下需要用到二进制转换以及按位解析。收集到了一些资料,自己保存一下啊。 如下:bitset 用法整理构造函数bitset b;b有n位,每位都为0.参数n可以为一个表达式.如bitset b0;则"b0"为"00000";原创 2012-08-30 16:27:48 · 28894 阅读 · 1 评论 -
STL之set使用方法小结
/*set/multiset会根据待定的排序准则,自动将元素排序。两者不同在于前者不允许元素重复,而后者允许。1) 不能直接改变元素值,因为那样会打乱原本正确的顺序,要改变元素值必须先删除旧元素,则插入新元素2) 不提供直接存取元素的任何操作函数,只能通过迭代器进行间接存取,而且从迭代器角度来看,元素值是常数3) 元素比较动作只能用于型别相同的容器(即元素和排序准则必须相同)s原创 2012-08-28 16:21:51 · 784 阅读 · 0 评论 -
欧几里德及其扩展
欧几里德是用来求最大公约数的,可以把它看成是状态转移,对任意两个数a,b(a>b),d=gcd(a,b),如果b不为零,那么gcd(a,b)=gcd(b,a%b) 证明: 令 r=a%b,即存在k,使得 a=b*k+r,那么r=a-b*k;显然r>=0, r%d=((a%d)-(b*k)%d)%d,因为a%d=b%d=0,所以r%d=0;因此求gcd(a,b原创 2012-08-26 22:21:58 · 1315 阅读 · 0 评论