自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(41)
  • 资源 (3)
  • 收藏
  • 关注

原创 HDU 3622 Bomb Game【2-SAT 问题】

<br />       题目大意:有N对点,给定这N对点的坐标,现在要求找出一个最大的半径R,使得可以从每对点中选择一个点,并且这N个点以自己为圆心,半径为R的圆两两不相交。<br />       2-SAT问题解法:对于每一对点,我们且称之为“兄弟点”;对于这2*N个点,如果两个点之间“矛盾”,对于本题即两个圆相交,则连一条边。对这个图求强连通分量,然后看是否有某对点属于同一个强连通分量。如果N对点每一对都属于不同的强连通分量,满足。否则不满足。然后二分半径即可。<br />#include <cst

2010-09-15 19:00:00 1864

原创 HDU 3631 Shortest Path 最短路

<br />         从这个题我想说一下分析题目数据的技巧和重要性。题目大意是:给定一个有向图,点数  N <= 300, 边数 M <= 10^6,然后有Q次询问(Q <= 10^6 ); 每次询问有两种操作:1) 标记一个点 v,如果这个点已经被标记过,输出“ERROR” ; 2) 求两个点u和v的最短路,要求最短路上的点必须全部被标记过;<br />         网络赛我就悲剧了,没有好好分析数据,竟然真的对于每次询问求了一遍最短路,到最后也是TLE,真是傻X到家了,唉。。。<br /> 

2010-09-13 19:48:00 975

原创 【三分查找求单峰函数的最值】 ZOJ 3386 Trick or Treat

<br />         题目大意是:在一个平面上有N个点,每个点的坐标已经给出,现在要求在X轴上找一个点,使得这个点到所有点中最大的距离最小。<br />         分析:我们设这个点为X0,所求的距离为F(x),那么对于所有的 X < X0 和 X > X0 都有F(x) > ans,即实际上这个函数是已X0为最小值,两边<br />都是单调递增或者递减的,因此我们可以三分查找找出这个最值的坐标。总复杂度O(n*logn).<br />         PS:这是第一次写三分,之前竟然从没写过

2010-08-29 17:10:00 1645

原创 3281. CJ and WS

<br />       感觉这个题挺好的。给定N个数,这N个数是从1到N的互不相同的数。现在给一个数K,求在这个数列中包含K的连续数列中长度是奇数并且K是中间的数的个数。<br />        比如         7 4<br />         5 7 2 4 3 1 6,那么满足的数列有4个:4; 5,7,2,4,3; 2,4,3; 5,7,2,4,3,1,6<br />         思路:因为数列中所有数都在1到N之间,所以所有的数和K的关系无非是大于K或者小于K(除了K),而满

2010-08-07 22:16:00 615

原创 求N的N次幂的最高位

<br />给定一个正数N(N < 1000000)求N^N的最高位。<br />解法:令M = N^N,两边对10取对数,得log10(M) = N*log10(N).所以M = 10^(N*log10(N)).由于10的整数次幂最高位一定是1,所以答案取决于<br />N*log10(N)的小数部分x。pow(10,x)即为答案。

2010-08-07 19:58:00 1802

转载 利用斯特林(Stirling)公式求解n!的位数

<br />转自http://www.csufox.com/stirling.html<br />利用斯特林(Stirling)公式求解n!的位数:<br />易知整数n的位数为[lg10(n)]+1. <br />用Stirling公式计算n!结果的位数时,可以两边取对数,得: <br />log10(n!) = log10(2*PI*n)/2+n*log10(n/E); <br />故n!的位数为 <br />res=log10(2*PI*n)/2+n*log10(n/E)+

2010-08-07 16:43:00 2156

原创 【转】【数论】法雷数列

             实数包含有理数和无理数,任何有理数都可以表示为p/q(p,q是整数,q!=0)的形式,如果指定一个分数的分母不超过某个值,对于一般的有理数或者无理数,是不可以用一个分数来准确地表示的。我们这里主要讨论,如何找出一对分数p1/q1和p2/q2,使得q1 和q2 小于给定的值n,而p1/q1和p2/q2尽可能接近一个给定的实数.。        先给出一些定义和一个定理:定义一:最简分数(也称既约分数或不可约分数)。若p,q的最大公约数是1,我们称分数p/q          

2010-08-06 14:16:00 2615

原创 TOJ 3622. Perfect Matching

<br /> 问题描述:给定两个长度为N的序列A 和 B,要求每个A 中的数和B中的一个数做乘积(每个数只使用一次),找出一种搭配使得最大<br />                     的数最小。<br />解法:分类讨论,设a_pos , a_neg , a_zero , b_pos , b_neg , b_zero分别为A和B中正数,负数和0的个数,则<br />             1)如果( a_pos > b_neg + b_zero || a_neg > b_pos + b_zero

2010-08-06 01:04:00 737

原创 【数论】 求小于等于 N 的与N互质的所有数的乘积mod N

<br />           求小于等于N 的所有与N互质的数的乘积modN。这是今天训练赛的一道题。RP极高的我们愣是找出了结论。<br />           结论:对于 1,2,4,P^n, 2*P^n,答案为 N-1,其余情况都是1。也就是说,1,2,4,以及只有一个质因子(奇数)或者它的1/2只有一个<br />                       质因子(偶数),答案是N-1.其余情况答案均是 1。<br />           附程序:<br />#include <cstdi

2010-08-06 00:41:00 2438 1

原创 【数论】整数的划分问题

<br />          整数的划分问题是一个很经典的问题,它的变形也非常的多,总结了一下,大概有以下几种变形:<br /> <br />1) 将 N 划分为若干个正整数的和的划分数<br /> <br />2) 将 N 划分为若干个不同的正整数的和的划分数<br /> <br />3) 将 N 划分为不超过K 个正整数的和的划分数<br /> <br />4) 将 N 划分为不超过K 个不同正整数的和的划分数<br /> <br />5) 将 N 划分为最大数不超过K 的正整数的和的划分数<br /

2010-08-04 16:40:00 1663 1

原创 【转】求小于等于N的与N互质的数的和

问题描述:<br />给出一个N,求1..N中与N互质的数的和<br /><br />if gcd(n,i)=1 then gcd(n,n-i)=1 (1<=i<=n)<br /><br />反证法:<br />        如果存在K!=1使gcd(n,n-i)=k,那么(n-i)%k==0<br />        而n%k=0<br />         那么必须保证i%k=0<br />        k是n的因子,如果i%k=0那么gcd(n,i)=k,矛

2010-08-04 01:07:00 1576

原创 POJ 1639 Picnic Planning【度限制最小生成树】

<br />/*  第一道度限制生成树,写的比较崩溃@@<br /> *  度限制生成树是指对生成树中某些点限制度的生成树,如果是要求权值最小的话<br /> *  便是度限制最小生成树。一般题目也就是对某一个点进行度限制,因为所有点进行<br /> *  度限制是NP问题。<br /> *  解法:1)先去掉有度限制的点和与它相邻的边,对求剩下的点求最小生成树。由于剩下的点可能不连同,所以<br /> *                 要对每一个连通分量求最小生成树。<br />

2010-08-02 03:47:00 2542 6

原创 TOJ 3596. Watch The Movie【基础的二维费用背包问题】

<br />           昨天训练赛有一道二维费用背包的题,结果我守着背包九讲在手边就是没做出来。事后发现其实解法背包九讲都已经讲到了,只不过自己看的不仔细罢了。以后看解题报告也好,论文也好,一定要深入思考一下,真正将这个问题搞懂并且做到可以拓展,那才是真正的学懂了。<br />           先说一下二维费用背包吧,我们都知道背包问题,有01背包,完全背包,多重背包。。。其中01背包是指有N件物品,每种物品只有一件,可以选择拿或者不拿,每个物品有一个重量和一个价值,找出不超过背包容量可获得的

2010-07-30 15:41:00 2329

原创 TOJ 3584. Chocolate Eating 【二分+枚举】

<br />          这道题感觉很好。大意是一头母牛受到了N个公牛送的巧克力(@@),然后母牛决定安排一个合理的吃巧克力方案。母牛最开始的时候心情值为0,每个巧克力有一个快乐值,母牛吃了后心情就加上这个快乐值。但是每天早上母牛的心情值都会变为前一天晚上的一半。现在给出N和N块巧克力的快乐值,和母牛打算吃完这些巧克力的天数D,安排一个合理的方案,使母牛在这D天里心情值最小的值最大。(母牛按顺序吃)<br />          比如N = 5,D = 5 ,巧克力的快乐值分别为10,40,13,22

2010-07-28 22:33:00 737

原创 TOJ 1009. Sticks 【搜索+剪枝】

<br />        很难的搜索,对剪枝要求很高,不过在做这个题之前做过一个类似的,所以直接用以前那个DFS就过了。<br />        大意是给定N个木棍长度,(不大于50)要求找出最小的长度L使得可以将这些木棍拼成若干长度L的木棍。<br />        就是搜索,不过对剪枝要求很高,不然很容易TLE,黑书上有提到过这道题。变态的是TOJ有数据是木棍大于50,所以必须忽略掉这些不合理的数据。<br />        以前那个很像的题是说给一堆木棍长度,问能否将这些木棍拼成一个正方形,其

2010-07-28 21:07:00 1098

原创 【数论】线性筛素数,线性筛欧拉函数,求前N个数的约数个数

<br />先来最基本的线性筛素数,以后的算法其实都是基于这个最基本的算法:<br />#include<stdio.h>#include<string.h>#define M 10000000int prime[M/3];bool flag[M];void get_prime(){ int i,j,k; memset(flag,false,sizeof(flag)); k=0; for(i=2;i<M;i++){

2010-07-28 13:45:00 7084 3

原创 ural 1277. Cops and Thieves【最小割】

<br />              /*   小偷要从S城市到T城市偷东西,每个城市需要不同数量的警察来看守,现在给出警察数量,看能不能成功阻止小偷<br />               *   题意即是求最小割,但是由于给出的是每个点的容量,所以需要将每个点拆为两个点,之间连边,容量为点的容量,<br />               *   两个城市如果相连则容量置为无穷大。然后求最大流看是否大于已有警察数。拆点的时候可以将点i拆为2*i-1和2*i<br />           

2010-07-28 00:00:00 1214 2

原创 Codeforces Beta Round #24

    A:    Ring road【简单搜索】    题意大概是有N个城市,这些城市之间一共有N条单向的公路,每个城市恰好和其他两个城市相连接,每条公路改变方向需要一个花费,现在问如果要满足任何一个城市都能够到达其他任何一个城市最少需要多少花费。         其实可以看到,N个城市有N条公路,每个城市和其他两个城市相连并且路是单向的,所以如果要满足可以到达任何城市那么这N个城市一定是形成了一个环。所以我们直接从编号为1的城市沿着两个方向各走一圈,然后比较哪个花费小就可以了。         #inc

2010-07-27 01:37:00 750

原创 POJ 2455.Secret Milking Machine【最大流+二分】

<br />         这道题做了两个小时,做的我都快崩溃了。。。先是没有发现两个点之间可以有多条边,然后又忽略了是双向边,无比郁闷啊。看来读题也是一个能力啊,我太弱了。。。<br />         题目给出N个点和P条边,(两个点之间可能有多条边),然后问如果想要从1走到N走T次并且每条路只能走一次的话,求所走过的路中最长的边的最小值。<br />         我们可以用最大流来解决这个问题,首先考虑不重复的走T次,只需使每条路的容量为1就好,然后看容量能不能达到T。为了求最长边的最小值,我

2010-07-26 20:41:00 926

原创 POJ 1273.Drainage Ditches【最大流】

<br />            不用多说了,赤裸裸的最大流,典型的模板题。dinic算法实现。<br />         #include <cstdio>#include <cstring>#include <list>#include <queue>#define INF 0x1f1f1f1f#define MAXN 205using namespace std;int n,m,src,sink; //点数,边数,源点,汇点int restflow[MA

2010-07-26 01:32:00 509

原创 TOJ 1684. Power Network 【第一道网络流 】

<br />/*  第一道网络流。。。dinic做的,参考了别人程序。<br /> *  dinic之所以比较高效是因为它在BFS的时候给每个点赋了一个层次值,所以在每次寻找增广路进行增流的时候,<br /> *  可以顺着层次值递增进行,到达汇点以后可以回溯到某个可以继续增广的点继续增流直到找不到一条增广路,有效<br /> *  的利用了BFS所得到的信息。<br /> *  使用list的迭代器记录某次增流后残留量为0的点,便于进行回溯<br /> */<br />#include

2010-07-25 21:52:00 559

原创 TOJ 2217. Invitation Cards【最短路dijkstra+堆优化或者SPFA】

<br />                 就是一个很明显的最短路,大意是给出一个有向图,求从一个点到其他所有点的最短路的和以及其他所有点到该点的最短路的和。 <br />                 思路就是两遍最短路,第二遍对反图求即可。关键是点数最多为1000000,所以N^2的dijkstra是不行的,需要用SPFA或者堆优化的dijkstra。两种方法我都试过了,效率差不多,但是当图稠密起来后堆优化的dijkstra要比SPFA更快。<br />                 下面给出两种

2010-07-25 03:36:00 2435

原创 FOJ 1914. Funny Positive Sequence 【单调队列优化】

            先骂一句,福大的OJ真是。。。连%lld都不支持,因为一个%I64d和%lld的区别,本来正确的思路,正确的程序,愣是浪费了我好几个小时并且一度怀疑自己程序的正确性。唉,也怪自己,以后用不熟悉的OJ一定要先看FAQ。            题意是这样的,给定一个数列        a1,a2,…,an-1,an             如果 a1+a2+a3+...+an > 0,称该数列是一个positive的数列。现在给定一个数列,其中           A(0):

2010-07-25 02:01:00 669

原创 TOJ 2241. Ancestor 【判断一棵树上两个节点的关系】

<br />          很简单的题目,给出一棵树,最多有N(N<=10000)个节点,然后给出N-1个父子关系,然后是M次查询(M<=100000),问A是否是B的祖先。 <br />          很明显的搜索题,但是千万别傻乎乎的对每一次询问都搜一次。。。不TLE就怪了。我们可以对这棵树进行一遍DFS,在DFS的过程中记录下每个节点开始访问的深度first和结束访问的深度second。那么对于两个节点A和B,A是B的祖先当且仅当first[A] < first[B] < second[A];

2010-07-24 14:58:00 1178

原创 TOJ 2233.WTommy's Trouble【有向图的强联通分量】

<br />          题目大意是Wtommy是队长,需要通知所有的队员。通知不同队员花费是不一样的,队员之间也有关系。现在Wtommy想通过最小的花费保证所有的人都被通知到。即Wtommy只通知部分人,然后这些人可以互相通知使所有人都被通知到。注意如果A可以通知B,B不一定能够通知A。<br />          典型的有向图强联通分量。有向图的强连通分量(SCC)定义:<br />          有向图中, u可达v不一定意味着v可达u. 相互可达则属于同一个强连通分量(Strongly

2010-07-24 11:43:00 768

原创 TOJ 2189. The Key Stations 【求无向图的割点】

<br />           一道与1026差不多的题,纯求无向图的割点。<br />/* DFS求割点,在DFS时记录每个节点的深度dep和它的子孙所能达到的最浅位置low<br /> * 1)如果u根节点儿子大于1个,根节点为割点<br /> * 2)如果u不是根节点且对于u的子孙v有low[v]>=dep[u],u为一个割点<br /> * 注意输入和输出(输入用getchar() != '/n' 来控制一行 )<br /> */<br />#include <cstdio>#

2010-07-24 11:11:00 587

原创 TOJ.1026 Network【求无向图割点】

<br />        题目大意是一个公司有一个网络,连接着从编号1到N共N个地方,然后给出一些边,表示哪两个地方相连。有些点一旦断开所有和它关联的边,那么图不再联通,称这样的点为“critical  place”,求有多少个这样的点。<br /> <br />/* DFS求割点,在DFS时记录每个节点的深度dep和它的子孙所能达到的最浅位置low<br /> * 1)如果u根节点儿子大于1个,根节点为割点<br /> * 2)如果u不是根节点且对于u的子孙v有low[v]>=dep[u],u为

2010-07-24 11:06:00 636

原创 TOJ 2299. Electricity【求无向图割点】

/* 给出一个无向图,计算去掉一个点后所能得到的最大块数 * 1)由于图可能不连通,先DFS求出图的块数num * 2)然后进行DFS求出割点并且存下割点将连通分支分成的块数f[i] * 3)找到最大的f[i]和num相加-1即为所求 */Code:#include #include #include #define MAXN 10002using namespace std;int f[MAXN],low[MAXN],dep[MAXN];bool flag[MAXN];int

2010-07-24 02:55:00 570

原创 【树的直径】

树的直径是指树的最长简单路。求法: 两遍BFS :先任选一个起点BFS找到最长路的终点,再从终点进行BFS,则第二次BFS找到的最长路即为树的直径;              原理: 设起点为u,第一次BFS找到的终点v一定是树的直径的一个端点              证明: 1) 如果u 是直径上的点,则v显然是直径的终点(因为如果v不是的话,则必定存在另一个点w使得u到w的距离更长,则于BFS找到了v矛盾)                      2) 如果u不是直径上的点,则u到v必然于树的直径相

2010-07-24 02:41:00 1236

原创 多重背包问题

       今天看了下多重背包,理解的还不够深入,不过因为是01背包过来的,所以接受起来很容易。主要是运用了二进制的思想将一个数量为N很大的物品分为了logN个数量小的物品,而这logN个物品可以组成数量为0到N任意数量,所以这种策略是成立的。       多重背包问题有TOJ1034,TOJ1670.       TOJ1034 :大意是有6种规格的石头,编号从1到6,编号为 i 的石头的价值为 i .现在给出各种石头的数量,问有没有可能得到总价值的一半。做法:  DP, 每种石头价值为

2010-07-24 02:37:00 2213

原创 TOJ 3001 Score

<br />一个结论很简单的问题,对于任意两个数a,b(a,b>=2)<br />1)如果gcd (a,b)==1,则最大的不能由a,b线性表示的数为a*b-a-b;<br />2)否则这个数时无穷大<br />至于证明,期待大牛给出,我还是不懂,一开始往拓展欧几里得想的,但后来也没什么结论。<br />哪位神牛知道证明给点提示,不胜感谢~

2010-07-24 02:33:00 478

原创 TOJ 1011 Area【Pick定理】

<br />      题意是给出格子上的N个点的坐标,求出多边形的面积及格子内部的点和边上的点的个数。  <br />      这个题主要用到了一个定理,叫做Pick定理。意思是由格子上的点所围成的多边形,有这么一个性质:多边形边上的点的个数on和内部点的个数in的关系式Area = on / 2 + in - 1;<br />      求面积可以用叉乘。<br />      PS:Pick定理是Pick这个人在集中营提出的,据说那时候好多人在集中营百般聊赖,就拿石头在地上乱画,提出了不少理论。汗。

2010-07-24 02:32:00 535

原创 POJ 2762. Balanced Lineup (区间求最值sparsetable算法)

<br />       这个题是典型的RMQ(Range Minimum/Maximum Query)问题,给出一个区间,然后多次询问某个子区间最大值与最小值的差。<br />       解决RMQ有一个很经典的算法,也很容易实现,就是sparestalbe算法(ST算法),这个算法很巧妙,它将一个个区间分成一段段log级别的小区间,可以通过n*log的预处理,O(1)的回答每个询问,所以对于大量询问的题目来说是非常高效的。<br />       来看一下算法如何实现:<br />        首先

2010-07-24 02:24:00 542

原创 TOJ 3428. Fibonacci(Fibonacci数列的一个很好玩的规律)

<br />       题意大概是给一组数M,N,求出第M个末位有N个0的Fibonacci数列是第几项。<br />乍一看,吓我一跳,结果在2^31内,大的惊人。后来拿一个程序(正好是TOJ的一道题,求1000位内的Fibonacci数列)暴力了下,好家伙,有规律的。<br />第一个末位有1个0的是第15项,第二项第30…然后看末位有2个0的,第一个是150项,第二个第300项。然后很高兴了写了个程序,WA...<br />有点晕,又暴力了下,加大范围,发现第一个末位3个0的不是1500项,而是750

2010-07-24 02:08:00 638

原创 求N的阶乘约数的个数

<br />先说基本定理:<br />若正整数n可分解为p1^a1*p1^a2*...*pk^ak<br />其中pi为两两不同的素数,ai为对应指数,则n的约数个数为(1+a1)*(1+a2)*....*(1+ak)<br />        如180=2*2*3*3*5=2^2*3^2*5<br />        180的约数个数为(1+2)*(1+2)*(1+1)=18个。<br />        若求A/B的约数个数,A可分解为p1^a1*p2^a2*...*pk^ak,B可分解为q1^b1*q

2010-07-24 02:00:00 7063

原创 POJ 3067 Japan【树状数组】

<br />       这道题和那道Star如出一辙,有K条连接东西两个城市的路,东西方向每个城市都有一个编号M,N,从北到南,最后问共有多少个十字路都,即有多少个交点。<br />       先预处理,用结构体表示每条边,对结构体按N进行从小到大的排序,如果N相同,按M从小到大排序。接下来就和Star一样了,唯一不同的是Star那道题是每次求出当前星星前边的个数,而这个是求当前点后边的个数。用c[]表示树状数组,sum(n)求出的是N编号小于等于n的city的个数,只需每次拿出一个city,求出N编号

2010-07-24 01:46:00 635

原创 POJ 2352 Stars【树状数组】

      树状数组的超级超级基础题,大意是N个星星,规定每个星星的等级为在它左下方星星的数量(包括某个坐标相等),N范围是15000,输入按y坐标的升序给出,如果两个星星y坐标相等,按x坐标升序给出。用树状数组,不用管y坐标(因为已经是升序,后边的星星不影响前边星星的等级),用sum(n)来统计x坐标为n以前的星星个数,但是千万注意树状数组需要数组以1为首项,由于坐标有0,所以每次需要给x坐标+1。#include#include#define M 32006

2010-07-24 01:41:00 569

原创 POJ 2481 Cows【树状数组】

<br />        每个牛有一个区间[s,e],两个牛[s1,e1], [s2,e2],当s1<=s2并且e1>=e2并且e1-s1>e2-s2时,我们说牛1比牛2强,给N个牛的区间,对于每个牛,输出比这个牛强的牛的个数。<br />还是需要预处理,先对每个牛的e进行降序排序,e相同时对s进行升序排列,这样循环时可以保证后边的牛绝对不比前边的牛强。在循环时,只需找出比当前牛s小的牛的个数。如果遇到特殊情况,即两个牛区间完全一样,赋值就可以了。<br /> <br />#include <cstdio

2010-07-24 01:37:00 527

原创 POJ 1195 Mobile phones【二维树状数组】

<br />       简单的二维树状数组,求一个矩形区域内的和,因为要随时增减,而且可能减的数比原来都大,所以需要保留原来的数组。<br />在求矩形区域和的时候,只要用最大的矩形减去两个小的,再加上那个多减的最小的,就OK了.<br /> <br />#include<iostream>#define M 1300int c[M][M],a[M][M],n;int lowbit(int t){ return t&(t^(t-1));}int sum(int p,int q){

2010-07-24 01:30:00 465

原创 POJ 2299 Ultra-QuickSort【树状数组+离散化】

     (很久以前写的了,从cppBlog贴过来的)       求逆序对,N个数,N#include#define M 500001using namespace std;int c[M],aa[M],n;//aa数组为排序后重新编号用 struct digit{ int num,id; }a[M]; //num为数的大小bool cmp(digit a,digit b){ return a.

2010-07-24 01:19:00 786

数据库系统基础教程(中文高清PDF)

中文版数据库系统基础教程,高清的PDF,针对原版做了一定章节调整,不过非常不错。

2011-11-24

最短路课件 求单源最短路径

讲了常用的求单源最短路径的算法,非常好的资料。。

2010-04-11

北大ACM课件及解题报告

包含了多场比赛的解题报告,是不可多得的学习ACM的资源。 C/C++描述。

2010-03-22

空空如也

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

TA关注的人

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