自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(64)
  • 收藏
  • 关注

原创 图的割点tarjan---zoj_1119

       http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1119       如果将连通图G中的某个点及和这个点相关的边删除后,将使原图不再连通,那么这个点就称为图G的割点或是接合点。如果一个无向图没有割点,则这样的图被称为双连通图。      算法用到了一下两个数组。      dfn:这个点在dfs序列...

2011-10-24 23:00:45 150

原创 大数计算模板---zoj_3447

        http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4190          很多DP,贪心会涉及高精度,苦于不会JAVA和PY等,只能找了个大数计算的模板,先膜拜在学习。这个代码请参考:       http://www.cppblog.com/patriking/archive/2011...

2011-10-24 16:47:22 132

原创 DP还是搜索?DP的最高境界---zoj_3469

       http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3469              终于然我摸到了一点点DP的最高境界。。。       题目大意:餐馆送外卖,分布在一条直线上,给出N,V,X表示订单数,速度的倒数,餐馆的位置,然后给出叫外卖的位置Xi和Bi,Bi表示等待外卖的人的不满意指数的增长率(每...

2011-10-13 23:11:03 146

原创 BFS与双向BFS---zoj_1505

           http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=505       题目大意,跳棋,8*8的棋盘,上有4个棋子,给你一个初始状态给你一个结束状态,问能不能在8步之内从初始状态走到结束状态。       一般的想法,直接暴力DFS,使用状态压缩,状态表偷懒使用set,用时2S       如果使用...

2011-10-09 17:14:01 186

基本树形DP---zoj_3201

       http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3201                树形DP,理解了其实很简单,一气呵成!!对于某个节点u,这个节点对于每个子节点都要更新一次,而且在更新时,子节点的信息已经递归的更新完成了。在更新完某一个子节点之后,此时的dp[u]就包含了之前更新的子节点的信息了。(如...

2011-09-30 22:03:22 103

原创 静态treap+线段树---zoj_2112

       http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2112       终于A了这惊天地泣鬼神的一题,练习了线段树和treap。。。此题要求对于N个正整数,给定M个操作,操作有两种1)输入 i j k,要求输出a[i]到a[j]中第k大的数.2)i q,将a[i]修改为q.       这题的特点是数...

2011-09-29 23:06:57 148

原创 NIM博弈游戏,SG函数---zoj_3084,zoj_2083

        Nim游戏是两个人进行的游戏有如下规则:       1)桌子上有 N 堆石子,游戏者轮流取石子。        2)每次只能从一堆中取出任意数目的石子,但不能不取。        3)取走最后一个石子者胜。        为了求解这一类问题,我们通常要引出SG函数和游戏和的概念       SG函数:对于单一游戏的某一个状态u,sg(u)=mex(sg(v)|...

2011-09-23 23:00:10 133

原创 struct数据对齐与#pragma pack(n)

        对struct数据对齐与#pragma pack(n)的理解一直存在误区,这里做一个总结,便于以后记忆。       规则主要有两条:       1.结构,联合或者类的数据成员,第一个放在偏移为0的地方,以后每一个数据成员的对齐,按照#pragma pack指定的数值和这个数据成员的自身长度来定,取较小的那个。       2.对于整体结构的对齐,则按照结构体中最大数...

2011-09-14 16:38:06 173

原创 多重背包--zoj_2156

         首先介绍经典的三种背包问题,0-1背包,完全背包,多重背包。0-1背包是背包问题的最简形式,其他的很多背包问题都可以转化为0-1背包来解决,而0-1背包问题也有非常简单的解法,时间效率为O(V*N),空间消耗为O(V),这里不要小看空间消耗,在数据量很大时,大量的取地址操作也会占用不少的时间消耗。        0-1背包问题可以这样描述:给出N个背包,每个背包的重量为c[i...

2011-09-14 11:10:27 98

原创 经典双塔dp---zoj_2059

题目地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2059          题目大意是:给定n个立方体,去组成2个塔高度相同的塔,求能组成的双塔的最大高度是多少,立方体不必用完。      状态dp[i][j]为读取第i个立方体,双塔高度差为j时的,较高塔的高度的最大值。     显然dp[i][j]读...

2011-08-31 22:48:58 170

原创 模式串匹配---KMP

        朴素的的模式串匹配算法通常要在向前移动文本指针之后,回溯模式串指针,其效率为O(m*n),而KMP算法则挖掘了一些模式串中的一些信息,来加快匹配的效率。        KMP算法的紧随便是覆盖函数next。当模式串p[j]和文本串s[i]失配时,j指针不是简单的回溯,而是指向next[j]。        覆盖函数next如何定义呢,它本质上是找到即是模式串p的前缀,又是它...

2011-08-31 20:49:54 67

原创 八数码问题(A*&&双向BFS)---zoj_1217

题目地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=217      首先说一下八数码问题的可解性。       1.互换2个非零位置,状态的逆序奇偶性将保持不变。       2.互换0和另一个非零位置,状态的逆序奇偶性将发生颠倒。       3.因此,如果目标状态和起始状态的逆序奇偶性相同,问题可解,...

2011-08-30 22:13:56 210

原创 ac自动机以及它上面的DFA

         AC自动机(Aho-Corasick)主要用于多模式串的匹配问题,是前缀匹配搜索的一种方法,和KMP算法的思想类似。        总所周至,KMP算法中的关键next指针利用了模式串本身的性质,在失配时给出了重新匹配的位置。AC自动机中的fail指针也是一样,fail指针的构造关键是找到即是当点匹配串的后缀,又是trie中一个模式串的前缀的最长的字符串。        ...

2011-08-08 23:04:17 1008

状态压缩dp---zoj_3502

      http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3502      题目大意就是要做n道题目,顺序不定,每一题的AC概率和之前做过的题目有关,给出一张概率表。最后要求给出一个字典排序最小的题目序列使得AC题目的数量的期望最大。      n道题一共有2^n种状态,dp[i]表示第i中状态下的最大期望。...

2011-08-02 18:09:54 99

树形DP--zoj_3506

        http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3506        题目大意为给定一颗节点带权值的树,和整数k,要求给出一个策略,对这棵树切k刀(对边切,切完保留一部分,丢弃一部分),最后得到的部分的权值和为最大/最小。        f[i][j]为以第i个节点为根,切k刀所得到的最小值。普通d...

2011-08-01 16:12:28 119

原创 二分图最大匹配(匈牙利算法)--zoj1516,1525,2223

        二分图G(E,V)将点集合V分成两个部分L,R,使得,图G中所有属于E的边相关联的两个点分别在L和R中。        二分图的一个匹配,即是图G中的边集合,其中,任意两条边都不共用一个顶点,或者说,每个顶点都之多只有一条边和它相关联。        二分图中的最大匹配M,就是求边数最大的边集合。        求二分图匹配有很多算法,这里介绍两种,效率都是O(EV)。...

2011-07-20 22:36:35 210

网络最大流(EK)---zoj_1734

        网络最大流是图论中的一个典型问题,为了精确的定义最大流问题,先给出下面几个定义。       一、流网络:G(E,V)是一个有向图,对于G中的每一对顶点(u,v)均有一非负的容量c(u,v),如果(u,v)属于E,那么c(u,v)>0,否则c(u,v)=0.       二、流:设G(E,V)是一个流网络,那么G的流是定义在V*V上的一个实值函数f,并且满足一下三个性...

2011-07-19 16:34:34 199

原创 trie和前缀检查---zoj_2876

         trie树是一种多叉树,广泛用于字典检索。如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树。额,有点晚了,具体不写了。看代码吧。。zoj_2876#include<iostream>#include<cstdio>#include<string>using namespace std;bool res=fal...

2011-07-13 23:03:27 168

原创 位图bitmap

        bitmap是一种广泛使用的数据结构,主要用在数据压缩,索引等方面,它最小单位为位,即01结构。通常情况下逻辑状态为是非二值状态时,bitmap比较常用。        如:腾讯面试题:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?        显然可以发现,需要判断给出的整数是否存在,是一个二值逻...

2011-07-13 21:08:02 103

LAC和RMQ的转化---zoj_3195

        我擦。。纠结了好久啊,从SF到TLE,先总结2个错误1:(int)(log(1.0*(b-a+1))/log(2.0));注意括号。2:i+(1<<(j-1))位移操作符加上括号,以后一定要记住,不然就是(1+i)<<j-1,这我去。解决掉越界,然后使用c输入输出,使用++i,最后终于AC了        这题其实LCA的tarjan也可以搞,但是tar...

2011-07-12 22:35:50 147

LAC的tarjan(离线)算法---zoj_1141

          LCA就不解释了,这里主要再次复习一下LCA的tarjan的离线算法,所谓离线算法,就是把Q个查询先预存储起来,然后等预处理完成后,一次性处理Q个查询。相反所谓在线算法,即使输入一个查询就处理一个查询。今后会补上LCA的ST在线算法。      tarjan我非常崇拜,他解决了图论中很多问题,基本上都是基于DFS的,比如SCC,LCA等,那么tarjan离线如何运行呢,其中...

2011-07-08 17:52:40 146

笛卡尔树以及treap---zoj_2243

        zoj_2243笛卡尔树的构造,开始被topcoder上的教程吸引去看这题。题目中说这种数据结构叫treap然后就按照treap的insert加上左旋右旋去做了,结果果断TLE。然后网上找了一下关于笛卡尔树的资料,发现了一些问题的端倪。       首先,treap和笛卡尔树从形式上来说是完全一样的,即是一颗二叉搜索树和二叉堆的结合(不是严格意义上的二叉堆,因为二叉堆是一颗完全...

2011-07-07 15:52:40 256

中缀表达式的转化---zoj_2483,zoj_3025

     在我们的日常生活中,中缀表达式是最常用的计算表达方式3*(-2+4),这种表达方式的优点就是表达的意义容易理解,一目了然。然而,这种表达方式在计算机识别方面缺十分不方便,其原因主要是,括号对于优先级的限制给编写识别程序造成了不便。     然而后缀表达式对于计算机的解析有这很大的遍历,它不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑...

2011-07-04 18:54:17 510

STL---priority_queue zoj_2212,zoj_2724,zoj_3230

          priority_queue顾名思意是优先队列的意思,在STL内部的实现形式是堆。使用priority_queue的关键就是重载比较函数,去实现不同要求的堆。另外,值得注意的是,二叉堆实现的优先队列是不稳定的,这点要特别注意         在重载优先队列比较函数的时候注意是重载一个类,在类中重写一个()操作符。 class problem{public: ...

2011-06-28 17:50:58 128

原创 STL---sort

引用:http://blog.csdn.net/rattles/archive/2010/04/21/5510919.aspxSTL 中 sort 函数用法简介    做 ACM 题的时候,排序是一种经常要用到的操作。如果每次都自己写个冒泡之类的 O(n^2) 排序,不但程序容易超时,而且浪费宝贵的比赛时间,还很有可能写错。 STL 里面有个 sort 函数,可以直接对数组排序...

2011-06-25 16:39:31 66

原创 线段染色,矩形切割,离散化---zoj_2301,zoj_1128

         染色问题:在一维坐标轴上(最右端为M),有N个(a,b,c)的染色操作,即把在坐标(a,b)之间的线段染成颜色c.最后来求解一系列问题。如:最长的颜色为C的区间,每种颜色的总长度,每种颜色的区间段数等等。         矩形切割问题:在二维坐标轴上,给出N个矩形,这N个矩形可能相互包含,交叉,分离。最后求解一系列问题。如N个矩形所覆盖的面积,相交的面积等。       ...

2011-06-24 22:32:21 126

原创 float,double范围和精度

         今天遇到一题zoj_1128,数据范围是(0<=x1<x2<=100000;0<=y1<y2<=100000),所有的数不一定是整数,并且最后输出的结果保留2位小数。用float死活wa,最后double过了,痛过之后来总结一下float和double的范围精度。下面引用:http://www.cnblogs.com/BradMiller/...

2011-06-23 15:55:46 219

线段树---zoj_1610

         线段树是一种二叉树的拓展,在线段树每个节点中,存储的是一个区间范围。对于每个节点,它的数据结构一般有,left,right,*lch,*rch,分别描述的是区间的左端点,区间的右端点,指向左子树的指针,指向右子树的指针。对于一个节点的左子树,它的区间范围是[left,(left+right)/2],对于一个节点的右子树,它的区间范围是[(left+right)/2,right]。...

2011-06-22 21:06:04 157

快速排序(qsort)

         快速排序是一种高效的非稳定排序,它的基本思路是分支法,在一个序列a[]中找到一个数a[mid],然后将序列a[]分为3部分a[start]---a[i-1],a[i],a[i+1]---a[end],第一部分的序列中,所有的数都小于a[i],第二部分的序列中,所有的数都大于a[i]。然后递归的对前后两部分进行处理,直到序列完成排序。        那么快速排序的关键步骤就是对...

2011-06-16 17:03:32 88

斐波那契散列

      斐波那契散列法其实是一种特殊的乘法散列,先来看乘法散列.根据算法导论第2版中的定义,构造乘法散列函数包含两个步骤。第一步,用关键字k乘上常数A(0<A<1),并抽取出kA的小数部分。然后,用m乘以这个值,再结果的低。总之,散列函数为h(k)=[m(kA mod 1)]      一般来说,m取值为2^p,而A的取值为形如s/2^w的分数(w为计算机的字长,int32,l...

2011-06-16 16:38:39 3564

原创 强连通分支(scc)---tarjan

         本文大量参考:http://www.nocow.cn/index.php/%E5%BC%BA%E8%BF%9E%E9%80%9A%E5%88%86%E9%87%8F          感谢:byvoid         首先,强连通分支是定义在一个有向图G上的。一个有向图的强连通分支就是一个最大的顶点集合,在这个集合中,所有的点都是互为可达的,即对于每一个点对(u,v)都...

2011-06-15 16:17:41 418

STL map的使用---zoj_2832,zoj_1899,zoj_3023

        map是一类关联式容器。它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。对于迭代器来说,可以修改实值,而不能修改key。        在zoj_2832中,map主要用来建立文件名(即字符串)和一个整数的关联,其中字符串为key,整数为value.值得注意的一点是,代码34行注释中使用的map插入方法,出现BUG。当使用p[s]时...

2011-06-10 15:40:32 198

C++字符串输入操作

         问题1:输入为一行字符串被中间被一些空格隔开,要求提取这些被空格隔开的字符串.         方法:直接使用cin,因为cin遇到空格附,换行附,\0,EOF等会停止输入       string s; while(cin>>s) { cout<<s<<endl;}          问题2:输入...

2011-06-10 15:34:24 133

原创 单源最短路径SPFA---zoj3146

          针对Bellman-Ford算法效率比较低的问题,SPFA是用一个队列来进行维护。初始时将源加入队列。每次从队列中取出一个元素,并对所有与他相邻的点进行松弛,若某个相邻的点松弛成功,则将其入队。直到队列为空时算法结束。它可以在O(kE)的时间复杂度内求出源点到其他所有点的最短路径,有办法证明对于通常的情况,k在2左右。          值得注意的一点是,如果某个点进入队列...

2011-06-09 15:25:13 68

原创 单源最短路径Bellman-Ford---zoj3033

         Bellman-Ford算法的特点是能够解决带负权值的最短路径问题,并且实现起来比较简单。整个循环体循环V-1次,每次循环遍历图中的每一条边(u,v),并对点V做松弛操作。可以证明,通过V*E次的操作,最后得到的dist[i]值就是从原点到点i的最短路径。具体的Bellman-Ford的正确性证明见《算法导论》         但是,Bellman-Ford算法有一种情况不能...

2011-06-09 15:20:10 94

原创 最小生成树之kruskal(并查集)---zoj_1586

        今天细读了算法导论的21章不相交集合,也就是传说中的并查集,有点小收获。原来网上搜的并查集只介绍了路径压缩,今天第一次听说还有按秩合并这回事儿。算法导论上说,同时利用按秩合并和路径压缩技术处理,并查集的操作速度可以大大提升。设有一连串的make-set,find-set,union操作共m个,其中make-set有n个,在渐进意义上,这一连串的操作的时间复杂度为O(m*a(n)),...

2011-06-07 22:33:40 201

原创 关于最小生成树

安全边:在无向图G=(V,E)中,A是图G的某棵最小生成树T的子集,当把图G中的某条(u, v)边加入到A中后,如果AU(u, v)仍然是某棵最小生成树T’的的子集,边(u, v)被成为A的一条安全边割:在无向图G=(V,E)中,割(S, V-S)是对顶点集V的一种划分,当一条边(u, v)的一个端点属于S,另一个端点属于V-S时,称边(u, v)通过割(S, V-S)。如果集合A中没...

2011-06-07 17:13:22 106

原创 模线性方程----zoj_2305

    推论1:方程ax=b(mod n)对于未知量x有解,当且仅当gcd(a,n) | b。    推论2:方程ax=b(mod n)或者对模n有d个不同的解,其中d=gcd(a,n),或者无解。    定理1:设d=gcd(a,n),假定对整数x和y满足d=ax+by(比如用扩展Euclid算法求出的一组解)。如果d | b,则方程ax=b(modn)有一个解x0满足x0=x*(b/d) mo...

2011-06-04 21:32:39 118

筛法打素数表---zoj_1951

          筛法打素数表是一种高效的打表方法,体做法是:先把N个自然数按次序排列起来。1不是质数,也不是合数,要划去。第二个数2是质数留下来,而把2后面所有能被2整除的数都划去。2后面第一个没划去的数是3,把3留下,再把3后面所有能被3整除的数都划去。3后面第一个没划去的数是5,把5留下,再把5后面所有能被5整除的数都划去。c这样一直做下去,就会把不超过N的全部合数都筛掉,留下的就是不超过...

2011-06-04 21:18:58 120

原创 分解质因数----zoj_1133

        循环从2开始,到sqrt(a),每次判断a是否能被i整除,如果可以,则将i存如vector中,a/=i,然后--i,目的是继续判断i,因为a可能可以被i整除多次.到循环结束的时候,再将a存入vector中。#include<iostream>#include<vector>#include<cmath>using namespac...

2011-06-03 14:30:42 229

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除