ACM&&Algorithm
文章平均质量分 70
xiayang05
这个作者很懒,什么都没留下…
展开
-
poj Redundant Paths
1.理解题意后可以发现要求的图是任意两点间存在至少两条不相同的路径,这里自己犯了个错误,误以为只要简单的两两匹配度数为1的点既能得到答案,这种想法错误的原因在于:可能存在一点度数>1但与它对应的边存在桥边. 虽然想简单了,但是可以立即发现,问题的关键在于桥边(其实题意要求的就是双连通分量)2.用tarjan求桥边,桥边性质:存在(u,v)两点u->v,并且DFN(u)3.其它的就只原创 2011-06-26 11:11:00 · 710 阅读 · 0 评论 -
uva 103 - Stacking Boxes
//可以使用佳哥介绍的DAG动规,不过麻烦些//建议使用LIS ,那么排序函数Cmp()成了以问题关键, 可以把每个box的值从左到右作为比较的关键字, 这样人为的赋予一个优先级.由于这些集合相互之间无序,我们需要先找到一种排序方法使得这些集合的顺序满足无后效性。这牵涉到如何判断两个集合的大小。#include #include #include using namespace std;struct Box{ int len,a[12],num; bool operato原创 2011-04-04 23:17:00 · 859 阅读 · 0 评论 -
最大子序列和问题 二维最大子序列核问题及其优化
int maxSubSum(const int &n){//n is the length of the sequence int maxSum = a[0],thisSum = 0; for(int i=0;i maxSum) maxSum = thisSum; else if(thisSum 1.不难看出时间界是O(n)的.2.一个明显的结论是,如果a[i]是负的,那么他不可能代表最有序列的起点,因为任何包含以a[i]的子序列都可以通过a[原创 2011-04-04 15:21:00 · 718 阅读 · 0 评论 -
欧拉回路
<br /><br />1、弗罗莱(Fleury)算法思想-解决欧拉回路<br /> Fleury算法:<br /> 任取v0∈V(G),令P0=v0;<br />设Pi=v0e1v1e2…ei vi已经行遍,按下面方法从中选取ei+1:<br />(a)ei+1与vi相关联;<br />(b)除非无别的边可供行遍,否则ei+1不应该为Gi=G-{e1,e2, …, ei}中的桥(所谓桥是一条删除后使连通图不再连通的边);<br />(c)当(b)不能再进行时,算法停止。<br />可以证明,当算原创 2011-05-23 10:12:00 · 581 阅读 · 0 评论 -
ural 1648. Yachts 栈
<br />//其实想到用逆向+栈就很简单了,,比赛的时候想到逆,,但没深想,陷入了思维牛角尖里<br />//至于为什么逆向呢? 很显然,当从后向前遍历的时候,这一个月的游艇需求是否能够满足只与它前面的月份库存量有关,,我只需把不足游艇量存起来,然后继续向月份小的推进,以希望之前的月份可以能够弥补这次的不足.<br />//至于花费最少,i.e.弥补时候要弥补之后与弥补月最近的月,这样不会比弥补其他月份更劣,这便想到了栈实现...<br />/*ID:1192432PROG: castleLA原创 2011-05-23 09:04:00 · 733 阅读 · 0 评论 -
ural 1645. Ski Race
<br />//别鄙视我贴水题呀,,我是在比赛的时候让它坑爹咯,,老琢磨30s Delay了<br />//其实只要注意到,考虑每一个位置的时候,所有它左面的比它大的一定在最终成绩榜中比它靠前,其他的就是可能的了,它右面同理<br />/*ID:1192432PROG: castleLANG: C++*/#include <iostream>#include <queue>#include <stack>#include <string>#include <map>#原创 2011-05-22 22:03:00 · 1239 阅读 · 1 评论 -
约瑟夫环的数学方法
<br />无论是用链表实现还是用数组实现都有一个共同点:要模拟整个游戏过程,不仅程序写起来比较烦,而且时间复杂度高达O(nm),当n,m非常大(例如上百万,上千万)的时候,几乎是没有办法在短时间内出结果的。我们注意到原问题仅仅是要求出最后的胜利者的序号,而不是要读者模拟整个过程。因此如果要追求效率,就要打破常规,实施一点数学策略。 为了讨论方便,先把问题稍微改变一下,并不影响原意: 问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出 ,剩下的人继续从0开始报数。求原创 2011-04-01 10:03:00 · 920 阅读 · 0 评论 -
欧拉常数
nothing原创 2011-03-30 22:28:00 · 5871 阅读 · 0 评论 -
CodeForce Round Table Knights
<br />//"思从深而行从简",自己的code被系统judge掉了,,看了个老毛的码子,很优美<br />//虽然这个简单,可是时间限制下写这么简洁优美的代码还是很难的,功力不行呀<br />//关于<具体数学>上的约瑟夫环,晚上更新吧,先贴个mark,还有先人的一句话"建议还是看英文版吧.其实技术类的英文文章都是很好懂的,绝不会有什么复杂的单词和复杂的句式.从那蹩脚的中文翻译中解脱出来吧,看原汁原味的文章,真的是一种享受",估计他已经乘黄鹤去了<br />#include <iostream>#i原创 2011-03-30 11:51:00 · 14142 阅读 · 0 评论 -
网络流及无向图mcmf注意事项
<br />1.最小费用最大流基于最大流问题,那么我们就要注意流的三个重要的性质.其次呢要理解流量是一种速率,而不是总量.<br />2.最大流问题的一种解法就是增广路,为了理解什么是增广路我们最重要的就是要理解"退流"操作,它是为撤销先前选取的不合适的弧.<br /> 那么我们把弧定义两类:(1)前向弧--弧的方向和路的方向一致.<br /> (2)后向弧--弧的方向和路的方向相反.<br />3.为了简洁表示流量和容量的图关系,我们进原创 2011-03-29 00:25:00 · 2693 阅读 · 0 评论 -
Tarjan算法 + kosaraju小证明哟
看的别人写的 很好,摘要几点的啦~~~:一.概念:1.强连通:如果在一个有向图上两个结点u,v他们相互之间至少存在一条通路,则他们是强连通的.2.强连通图:如果有向图G任意两天都强连通,则G是强连通图.3.强连通分量:有向非强连通图的极大强连通子图.二.O(N+M)的Trajan, 特么的Trajan是个甜菜1.Tarjan算法是基于对图深度优先搜索的算法,每个强连通分量为搜索树中的一棵子树。搜索时,把当前搜索树中未处理的节点加入一个堆栈,回溯时可以判断栈顶到栈中的节点是否为一个强连通分量。定义:DFN(u原创 2011-03-28 18:00:00 · 1205 阅读 · 0 评论 -
Codeforces Beta Round #63 (Div. 2) E题
<br />//今天学会了一句"有木有" 和一句 "坑爹"<br />//第一次被hack掉,有木有!<br />//stl是锦上添花,不是雪中送炭,坑爹呀!<br /> <br /> <br />#include <iostream>#include <cstdio>#include <map>#include <set>using namespace std;const int MAX=100005;int a[MAX];map<int,int> myMap;set<in原创 2011-03-23 11:13:00 · 677 阅读 · 0 评论 -
知道悲剧是什么吗?就是你不懂规则,脑子还不活~~ 同余!
(a+b)mod n =((a mod n)+(b mod n)) mod n;(a-b)mod n =((a mod n)-(b mod n)+n) mod n;(a*b)mod n =((a mod n)*(b mod n)) mod n;原创 2011-03-27 09:47:00 · 549 阅读 · 0 评论 -
博弈论初涉
1.poj 2075 Nim//瞬秒只要发现要取得那个堆是取后数字是p-positon 当且仅当 异或值小于a[j]#include #include #include #include #include #include #include #include #include #include #include using namespace std;const int MAX=1005,INF=1>n,n){ c=0;原创 2011-04-05 13:48:00 · 612 阅读 · 0 评论 -
数组去重 usaco Prime Palindromes
<br />//一个有用的方法就是slt中的unique函数的实现,它基于三个指针,first, last , , result;<br />//其中first 指向第一个不和result 内的值相等的位置 ; last 作为哨兵位置 ;; 而result 作为已经判定不重复点的最后一个位置<br />template <class ForwardIterator> ForwardIterator unique ( ForwardIterator first, ForwardIterator last原创 2011-04-06 09:20:00 · 536 阅读 · 0 评论 -
poj 3470
//DLX //数组开小了TLE 1天 悲剧~~~#include #include #include #include #include #include #include #include #include #include using namespace std;const int MAXM=20,MAXN=305,INF=1<<30;原创 2011-06-20 10:16:00 · 1637 阅读 · 0 评论 -
zoj Treasure Map
//WA哭了 特么自己把n,m写反了!//简单dancing link优化!#include #include #include #include #include #include #include #include #include #include using namespace std;const int MAX=30*30*500+5+原创 2011-06-20 15:24:00 · 756 阅读 · 0 评论 -
Dichotomy poj River Hopscotch
//简单两次二分,但是自己在处理边界的时候还是调试了不少时间,,多加练习代码能力才是王道啊 =.=/*ID:1192432PROG: castleLANG: C++*/#include #include #include #include #include #include #include #include #include #incl原创 2011-06-17 10:44:00 · 670 阅读 · 0 评论 -
poj Space Elevator
//起初自己没发现需要对限制高度升序排列,,,举了几个例子重要发现要是不先使用限制高度低的补充背包,那么后面的背包可能取不到最优子状态//如果排好了序,就显然是多重背包了/*ID:1192432PROG: castleLANG: C++*/#include #include #include #include #include #include原创 2011-06-15 22:12:00 · 607 阅读 · 0 评论 -
Bellman_Ford uva 11280 - Flying to Fredericton
<br />//看一下bellman_ford:其实他就是通过不断的松弛构造一颗以源点为根的最短路径树,原算法中第i次松弛结束后一定能生成从树根到结点长度不超过i的最短距的点中的最短距离(说的好绕哟)<br />//注意,没优化的bellman并不保证松弛i次后每一个距离都是路径长度为i的最短的,因为它松弛边的时候无序,可能得到>i次的松弛结果<br />//所以使用spfa标记点的距离,,还有需要注意的是我们要开二维数组标记,,因为显然我们无法确定一个更短权 和 一个更短路 对它所邻接点更新时谁会使得最终原创 2011-04-21 11:18:00 · 1283 阅读 · 0 评论 -
TopCoder LuckyRemander
//虽然不难,但比赛的时候就是好多细节没想清楚//1.一个数%9等于它每一位%9再求和后%9,这是因为10的任意幂%上9都等于1//2.关于组合,任意数可以形成1~n位数字,, 那么对应每一个数字,选定一个后,还要选定位数减一个其他数字, i.e.一个数会出现c(0,n-1)+c(1,n-1)+……+c(n-1,n-1)==2^n-1;#include #include原创 2011-06-09 15:07:00 · 542 阅读 · 0 评论 -
计算图顶点之间的通路数 和 连通性
图 通路数 连通性原创 2011-04-19 09:01:00 · 4684 阅读 · 0 评论 -
uva 11377 - Airport Setup
<br />//注意了一种情况: 城市 x 没有airpot,但是有无聊人想从x到x 那么结果不是1,而是0<br />//排除了这种坑爹情况后就是简单的Dijkstra了<br />/*ID:1192432PROG: castleLANG: C++*/#include <iostream>#include <string>#include <map>#include <vector>#include <memory.h>#include <cstdio>#inc原创 2011-04-18 17:53:00 · 1462 阅读 · 0 评论 -
zoj 3497 Mistwald
//11年浙江省赛K题,,比赛时候没出,当时老想的是判环然后组合//watashi是这么说滴:"赛前,裁判们普遍认为这题属于中档题,或者说是银牌题。结果是,现场所有能过这道题的队伍都凭借7+AC拿到了金牌。很多队伍前期都用没什么前途的方法尝试C和E,直到过K的队伍多起来才注意到这道中档题。我觉得认清哪题该搞,哪题该先放着,是很重要的一种能力。当然,大多数队伍还是习惯跟风,而这次省赛,实力很强的队伍太少,造成了比赛中期无风可跟的悲剧。".//就题目而言涉及到 Strassen矩阵乘法 + 快速计算乘方的算法原创 2011-04-19 09:04:00 · 1307 阅读 · 0 评论 -
Strassen矩阵乘法 + 快速计算乘方的算法 + 矩阵的次幂
矩阵乘法是线性代数中最常见的运算之一,它在数值计算中有广泛的应用。若A和B是2个n×n的矩阵,则它们的乘积C=AB同样是一个n×n的矩阵。A和B的乘积矩阵C中的元素C[i,j]定义为: 若依此定义来计算A和B的乘积矩阵C,则每计算C的一个元素C[i,j],需要做n个乘法和n-1次加法。因此,求出矩阵C的n2个元素所需的计算时间为0(n3)。60年代末,Strassen采用了类似于在大整数乘法中用过的分治技术,将计算2个n阶矩阵乘积所需的计算时间改进到O(nlog7)=O(n2.18)。首先,我们还是需要假设原创 2011-04-18 11:34:00 · 23304 阅读 · 0 评论 -
uva 714 Copying Books
//真背背啊,,以前做过这个题,,当时不会,弄半天是个经典的"最大值最小化"问题,,主要出错在忘判左右界了,//比如1000000 1 1 1分3份得时候 要注意左界; 1 2 3 4 5 分成5分的时候时候要注意右界//得到的经验就是 如果当找不到code 的bug 时候,考虑边界情况,,数据的边界或者极限值可能是根救命稻草哟哟哟哟哟哟哟#include #include #include #include #include #include #include #include原创 2011-04-13 10:54:00 · 1452 阅读 · 0 评论 -
各种收尾
2011-04-071.剪枝题 ZOJ 1909//关键在于对数组的排序,,然后 确定一个 尽可能向前推进的 启始枚举位置,这样能减掉大约一半的结点 (相当于把每个pos 点左边的全部减掉)//做的时候都想到排序了就差一点点了,,无奈时间不够了 ,几次交完气势没了,555555,看来剪枝是个弱项#include #include #include #include #include #include #include #include #include #include原创 2011-04-07 15:44:00 · 563 阅读 · 0 评论 -
10608 - Friends
<br />//使用并查集,按照佳哥方法写的,具体的数据机构还没看<br />//真是特么的弱 今天准备看完msmf白书+并查集+tarjan+无向图msmf,明天km+匈牙利<br />#include <cstdio>#include <iostream>#include <memory.h>using namespace std;const int MAX=30050,SIZE=2*500050,INF=1<<30;int n,m,l,U[SIZE],V[SIZE],first原创 2011-03-28 16:27:00 · 583 阅读 · 0 评论 -
最大流的 3 + 1 个性质
<br />//前三个重要的基本性质是: (其中f是流,c是容量)<br /> <br /> <br /> <br />//然后一个容易被忽略的是:<br /> <br />//关于第4个的证明我们显然可以知道不属于E的边的容量是0,而又由性质2,3即可得.原创 2011-03-28 13:47:00 · 865 阅读 · 0 评论 -
uva 10746 - Crime Wave - The Sequel
<br />//坑爹的地方在于精度问题<br />//输出时要给结果加一个偏移量,否则,如 0.015 这样的数,会被输出成 0.01 是前人跟俺们的话!<br /> <br />#include <iostream>#include <cstdio>#include <queue>#include <memory.h>using namespace std;const int MAX=25*2;const int INF=1<<30;bool inq[MAX];int原创 2011-03-27 20:40:00 · 974 阅读 · 0 评论 -
10048 - Audiophobia
<br />//这个错在蛋疼的搜索的时候,i的范围误写成了i<=MAX,怪不得WA!<br />#include <iostream><br />#include <cstdio><br />#include <memory.h><br />using namespace std;<br />const int MAX=105,INF=1<<30;<br />int c,s,q,t1,t2,t3,num=1,start,end;<br />int map[MAX][MAX],ans[MAX][MAX],vi原创 2011-03-13 13:37:00 · 440 阅读 · 0 评论 -
10397 - Connect the Campus
<br />//这题之前想用prim()的变形,但错因是事先加边的时候,假如一条边的时候 必须要标记两个点vis[],这样有可能边还没匹配完,而结点就用完了<br />//所以换成了kruskal,使用并查集真的很方便哟 : )<br />#include <iostream><br />#include <cstdio><br />#include <cmath><br />#include <algorithm><br />#include <memory.h><br />using namespace原创 2011-03-13 13:35:00 · 555 阅读 · 0 评论 -
Euclidean minimum spanning tree + Relative neighborhood graph + Delaunay triangulation
1.Algorithms for computing EMSTs:<br />A better approach to finding the EMST in a plane is to note that it is a subgraph of every Delaunay triangulation of the n points, a much-reduced set of edges:Compute the Delaunay triangulation in O(n log n) time and原创 2011-03-12 19:44:00 · 1121 阅读 · 0 评论 -
704 - Colour Hash
<br />#include <iostream><br />#include <cstdio><br />#include <sstream><br />#include <memory.h><br />using namespace std;<br />const int MAX=100003;<br />typedef char State[24];<br />int head1[MAX],next1[MAX],<br /> head2[MAX],next2[MAX];<br />State q原创 2011-03-10 19:26:00 · 776 阅读 · 0 评论 -
408 - Uniform Generator 、完全剩余系 和 同余的一个性质
#include #include using namespace std;int gcd(int a,int b){ //cout>s>>m){ printf("%10d%10d",s,m); //cout原创 2011-03-06 16:12:00 · 1386 阅读 · 0 评论 -
c语言中int(2byte)的表示范围是为什么是-32768~32767!
这得从二进制的原码说起(数字逻辑--东野老师): 如果以最高位为符号位,二进制原码最大为0111111111111111=2的15次方减1=32767 最小为1111111111111111=-2的15次方减1=-32767 此时0有两种表示方法,即正0和负0:0000000000000000=1000000000000000=0 所以,二进制原码表示时,范围是-32767~-0和0~32767,因为有两个零的存在,所以不同的数值个数一共只有2的16次方减1个,比16位二进制能够提供的2的16次方个编码少1原创 2011-03-08 15:50:00 · 4972 阅读 · 1 评论 -
550 - Multiplying by Rotation
<br />#include <iostream>#include <cstdio>#include <vector>#include <stack>#include <cmath>#include <algorithm>using namespace std;int base,f,s,x,n;vector<int> v1,v2;void transform1(int t){ v1.clear(); while(t){ v1.pu原创 2011-03-04 21:33:00 · 682 阅读 · 0 评论 -
各种字符串Hash函数比较
<br />http://blog.csai.cn/user3/50125/archives/2009/35639.html 常用的字符串Hash函数还有ELFHash,APHash等等,都是十分简单有效的方法。这些函数使用位运算使得每一个字符都对最后的函数值产生影响。另外还有以MD5和SHA1为代表的杂凑函数,这些函数几乎不可能找到碰撞。常用字符串哈希函数有BKDRHash,APHash,DJBHash,JSHash,RSHash,SDBMHash,PJWHash,ELFHash等等。对于转载 2011-01-20 16:05:00 · 553 阅读 · 0 评论 -
经典hash函数测试
<br />作者阅读过大量经典软件原代码,下面分别介绍几个经典软件中出现的字符串Hash函数。 <br />2.1 PHP中出现的字符串Hash函数 <br />static unsigned long hashpjw(char *arKey, unsigned int nKeyLength) <br />{ <br />unsigned long h = 0, g; <br />char *arEnd=arKey+nKeyLength; <br /><br /> <br />while (arKey <转载 2011-01-20 15:56:00 · 556 阅读 · 0 评论 -
经典hash函数测试
<br />作者阅读过大量经典软件原代码,下面分别介绍几个经典软件中出现的字符串Hash函数。 <br />2.1 PHP中出现的字符串Hash函数 <br />static unsigned long hashpjw(char *arKey, unsigned int nKeyLength) <br />{ <br />unsigned long h = 0, g; <br />char *arEnd=arKey+nKeyLength; <br /><br /> <br />while (arKey <转载 2011-01-20 15:56:00 · 487 阅读 · 0 评论