07 2012 档案
摘要:这个题可以用二位数状数组也可以用二维线段树做:法一:View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>#include<string>#define LL long longusi
阅读全文
摘要:水题,直接暴力:View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>#include<string>#define LL long longusing namespace std;c
阅读全文
摘要:离散化处理:View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>#include<string>#define LL long longusing namespace std;cla
阅读全文
摘要:用离散化处理就可以了:View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>#include<string>#define LL long longusing namespace st
阅读全文
摘要:纯容斥定理:View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>#include<string>#define LL long longusing namespace std;con
阅读全文
摘要:题目求1-n中与n互质的数的4次方之和,即S=a1^4+a2^4+……; a1,a2……均小于等于n且与n互质。先求出1^4+2^4+……n^4然后减去与n不互质的数的4次方。必然要先要用到4次方的求和公式。接下来简单的证明一下,这里前提是你知道3次方的公式,如果不会照下面的模式可以利用2次公式推出3次公式(x+1)^5=x^5+5*x^4+10*x^3+10*x^2+5*x+1;则 1=1;2^5=(1+1)^5=1^5+5*1^4+10*1^3+10*1^2+5*1^1+1;3^5=(2+1)^5=2^5+5*2^4+10*2^3+10*2^2+5*2^1+1;…………(n+1)^5=(n
阅读全文
摘要:简单的容斥定理的运用:View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>#include<string>#define LL long longusing namespace st
阅读全文
摘要:容斥定理:View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>#include<string>#define LL long longusing namespace std;LL n
阅读全文
摘要:这个题要用容斥定理,求出x与y互质的对数,然后x与y同时乘以k,如果x与y都在范围之内,则这一对符合条件;这里的处理方法就是对b与d缩小k倍,寻找里面的互质的数的对数,我们在扩大k倍,就可以解决,上面存在的问题;View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include&l
阅读全文
摘要:这个题跟http://poj.org/problem?id=2356;是一样,这里就不解释了http://www.cnblogs.com/bo-tao/archive/2012/07/27/2611306.htmlView Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include&
阅读全文
摘要:这是一道简单的对鸽笼原理的运用;题意:给出N个数,从中选出若干个数使得它们的和为N的倍数。有一种简单的方法如下:虽然题目没限制怎样选,但是我们可以证明:存在若干个这样的连续数,它们的和是N的倍数。为此,我们可以考察和Sk =a1+a2+...+ak.如果存在一个Sk是N的倍数,那么把前K个数选出来就可以了。否则所有N歌Sk除以N的余数只有1,2,3,4...N-1;这n-1种可能(n-1个盒子),由基本原理 知,必然有两个不同的和Si和Sj(i<j)除以N的余数相同,所以Sj -Si = ai+1 + .... aj 是N的倍数;View Code #include<iostrea
阅读全文
摘要:转载:http://www.cppblog.com/y346491470/articles/157284.html【题意】:有n只猫咪,开始时每只猫咪有花生0颗,现有一组操作,由下面三个中的k个操作组成:1. g i 给i只猫咪一颗花生米2. e i 让第i只猫咪吃掉它拥有的所有花生米3. s i j 将猫咪i与猫咪j的拥有的花生米交换现将上述一组操作做m次后,问每只猫咪有多少颗花生?【题解】:m达到10^9,显然不能直接算。因为k个操作给出之后就是固定的,所以想到用矩阵,矩阵快速幂可以把时间复杂度降到O(logm)。问题转化为如何构造转置矩阵?说下我的思路,观察以上三种操作,发现第二,三种操
阅读全文
摘要:这是一道经典的矩阵题:这个题就是要构造一个矩阵;A 1 * A 1 ---> A*A A + 1 ..... A^k S(k-1) + 1;0 1 0 1 0 1 0 1;View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<cstring>#include<vector>#
阅读全文
摘要:这个题用矩阵相乘法:f[n-2] 0 1 ----> f[n-1]f[n-1] 1 1 f[n];我们只要对矩阵进行相乘就可以了;View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<cstring>#include<vector>#include<string>
阅读全文
摘要:这个题一道区间覆盖题:这里要用到线性规划:max(x , xi),max(y,yi)寻找顶点坐标;min(c , ci) 寻找最下的区域;因此:r = c - x - y;View Code View Code #include<cstdio>#include<cstdlib>#include<cmath>#include<algorithm>#define LL long longusing namespace std;LL sum;int X[15],Y[15],R[15],C[15],n;void Solve( int x , int y
阅读全文
摘要:题意:模拟约瑟夫环。有N(1<=N<=500000)个孩子,从第K(1<=K<=N)个开始。接下来N行中,每行有这个孩子的名字和数字pos(绝对值小于10^8,表示接下来第N个孩子出局),第P个出局的孩子会得到F(P)的糖果的数目。F(P)定义为:P的因子的数目。这题我们用线段树来模拟约瑟夫循环:这题的关键是两个公式,如果从当前的k位置和pos推出下一个孩子的k(其中k表示在当前状态下第几个,pos表示在数组中的下标。)如果num>0。k=(k-1+node[pos].num)%n+1。。但是之前这个位置的那个人已经被删除,现在的k-1表示是的原来的那个孩子的下一
阅读全文
摘要:这个题是一个约瑟夫问题,然而是要找规律的:设剩下人数为n,若n是偶数,则一轮过后只剩下奇数位的人,有n = n / 2,原本在奇数位的数字变成(k+1) / 2;若n是奇数,则一轮过后只剩下奇数位的人,特别的原本为第一位的也应被删除,原本第3位的变成第一位,于是有n = (n-1) / 2,原本在奇数位的数字变成(k-1) / 2;经过有限次数后,n一定变成1,这就是最后的save。因此逆推上去就知道save开始所处位置了。View Code #include<iostream>#include<cstdio>#include<cstdlib>#includ
阅读全文
摘要:直接打表:View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>#include<string>#define LL long longusing namespace std;void
阅读全文
摘要:直接打表:View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>#include<string>#define LL long longusing namespace std;/*cl
阅读全文
摘要:约瑟夫循环问题:Josephus假设n个竞赛者排成一个环形,依次顺序编号1,2,…,n。从某个指定的第1号开始,沿环计数,每数到第m个人就让其出列,且从下一个人开始重新计数,继续进行下去。这个过程一直进行到所有的人都出列为止。最后出列者为优胜者。无论是用链表实现还是用数组实现来解约瑟夫问题都有一个共同点:要模拟整个游戏过程,不仅程序写起来比较麻烦,而且时间复杂度高达O(nm),当n,m非常大(例如上百万,上千万)的时候,几乎是没有办法在短时间内出结果的。注意到原问题仅仅是要求出最后的胜利者的序号,而不是要模拟整个过程。因此如果要追求效率,就要打破常规,实施一点数学策略。为了讨论方便,先把问题稍
阅读全文
摘要:扩展欧几里得的运用:View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>#define LL long longusing namespace std;LL Ex_Gcd( LL a , LL
阅读全文
摘要:由于bi,bj不保证互素,不能用直接套中国剩余定理,做法是利用欧几里德扩展定理,将两个等式合并,然后再与其他的等式一一合并对于x=b1 mod a1,x= b2 mod a2,设x=b1+m1*a1 , x = b2 + m2*a2;所以 b1 +m1*a1 = b2 + m2*a2;所以a1*m1=b1-b2 mod a2,利用欧几里德扩展定理求出最小的非负m1,那么x=b1+m*a1就已知,且x最小,如果无解,整个同余式组无解;同时,x+k*a1是所有满足x≡b1 mod a1的解,而x+k'*a2又是所有满足x≡b2 mod a2的解那么,将x+k*b1与x+k'*b2合
阅读全文
摘要:1.5 中国剩余定理出自Bupt_wiki跳转到: 导航, 搜索这篇文章写的很清晰,所有就COPY过来了,与大家分享;●知识精讲 这个问题源自于我国数学古书《孙子算经》中的一道问题:“今有物,不知其数,三三数之,剩二;五五数之,剩三;七七数之,剩二。问物几何?”意思是一个整数除以三余二,除以五余三,除以七余二,求这个整数(满足条件且最小)。做法是: n%3=2,n%5=3,n%7=2且3,5,7互质 找到使(5×7)的倍数模3得1的数,答案是70 找到使(3×7)的倍数模5得1的数,答案是21 找到使(3×5)的倍数模7得1的数,答案是15 那么(70×
阅读全文
摘要:这题是给定你一个区间,求里面的第K大的数;这里用到划分树:View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>using namespace std;class Node{public: int
阅读全文
摘要:这个也是一道对划分树的简单的运用:View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>using namespace std;class Node{public: int num[100024]
阅读全文
摘要:这里要用到划分树求第K大数:View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>using namespace std;class Node{public: int num[100024],va
阅读全文
摘要:这道题,是求n*m的矩形内,有多少对互质的数(x,y)即Gcd( x ,y ) ==1;这个题首先用到欧拉的质因子分解,再利用容斥定理;View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>usi
阅读全文
摘要:先画一条(0, 0)到(n, n)的线,把图分成两部分,两部分是对称的,只需算一部分就好。取右下半,这一半里的点(x, y)满足x >= y可以通过欧拉函数计算第k列有多少点能够连到(0, 0)若x与k的最大公约数d > 1,则(0, 0)与(x, k)点的连线必定会通过(x/d, k/d),就被挡住了所以能连的线的数目就是比k小的、和k互质的数的个数,然后就是欧拉函数。方法一:View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>
阅读全文
摘要:这个题就是一个扩展欧几里得的运用;B≡(A+K*C)%L 即 B = A + K*C + H*L ;B - A = KC + HL ;即线性方程为 a*x + b*y = c;View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#incl
阅读全文
摘要:一只青蛙1一开始在x位置,另一只青蛙2在y位置。青蛙1每次跳m米,青蛙2每次跳n米,并且都是向右跳的。地球经线长度是L,然后地球是圆的,也就是说,对L取模;问多少次后它们能跳到一起。如果它们永远不能相遇,就输出Impossible求一个k,使x + k*m ≡ y + k*n (mod L) ,就变成(n-m) * k ≡ x-y (mod L)咯。然后这个方程其实就等价于(n-m)*k + L*H = x-y咯。这就是ax + by = c求整数x的模型。要求ax + by = c的整数x解;就可以利用扩展欧几里得出答案;View Code #include<iostream>#
阅读全文
摘要:这个是求互质的数的个数:我们知道Eular n = a1^p1*a2^p2*...an^pn;那么它的质因子个数为 num = (p1 + 1)*(p2 + 1) *...*( pn +1 );那么它互质的数的个数为 num= ( 1 - 1/a1 )*(1 - 1/a2)*...*( 1 - 1/an )*n;View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue&
阅读全文
摘要:这个题是对欧拉函数的运用题意:就是给出一个奇素数,求出他的原根的个数。定义:n的原根x满足条件0<x<n,并且有集合{ (xi mod n) | 1 <= i <=n-1 } 和集合{ 1, ..., n-1 }相等定理:如果p有原根,则它恰有φ(φ(p))个不同的原根,p为素数,当然φ(p)=p-1,因此就有φ(p-1)个原根;View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath&
阅读全文
摘要:一个对Miller_rabin与pallord的一个运用;View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>#define LL unsigned long longusing namespa
阅读全文
摘要:首先利用miller_rabin测试是否为素数;再利用pallord进行质因子分解;View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<cmath>#include<algorithm>#define LL unsigned long longusing namespace std;LL p[10] = { 2,3,5,7,11,13,17,19,23,29 };int cnt = 0; LL num[100];LL Multi( LL a , L
阅读全文
摘要:这个题用到Miller_rabin与pallord算法:View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<ctime>#include<vector>#define LL long long u
阅读全文
摘要:这个题要用到欧拉函数;a1^p1*a2^p2*a3^p3……an^pn,那么他的因子就有(p1 +1)*(p2+1)*……*(pn+1);View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>us
阅读全文
摘要:这是一个找规律的题;例如: 12互质的数有 1 5 7 11 (12)13 17 19 22 (24) 25我们可以看到一个循环节;View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>using
阅读全文
摘要:Perfect Pth PowersTime Limit: 1000MSMemory Limit: 10000KTotal Submissions: 14097Accepted: 3192DescriptionWe say that x is a perfect square if, for some integer b, x = b2. Similarly, x is a perfect cube if, for some integer b, x = b3. More generally, x is a perfect pth power if, for some integer b, x
阅读全文
摘要:这个其实比较水,只是用到了一个同余定理,还有一个素数二重筛选;View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>using namespace std;int prime[10000],cnt
阅读全文
摘要:素数水题:View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>using namespace std;int prime[10000],cnt=0;bool hash[100024];void
阅读全文
摘要:题意:给定你一个数n,让你求出1-n内有多少个素数,再给你一个数d,如果2*d大于素数的个数则全部输出;否则,如果个数为单数,输出2*d - 1个并且以中间那个素数为中心分别向两边输出d-1个;如果偶数个,输出2*d个,也是以中间那个素数为中心向两边扩展;View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#includ
阅读全文
摘要:一道素数与BFS结合的题;View Code View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>using namespace std;class que{public: int num; i
阅读全文
摘要:素数水题:View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>using namespace std;int prime[100000],cnt=0;bool hash[700024];void
阅读全文
摘要:一道简单的素数题:View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>using namespace std;int prime[100000],cnt=0;bool hash[1000024]
阅读全文
摘要:求一个数能够被连续的素数的和组成有几种方法:直接用暴力;View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<cstring>using namespace std;int prime[2024],cnt,sum;void Prime( ){ bool hash[5024] = { 0 }; int t = ( int )sqrt( 10000.0 ) + 1; for(
阅读全文
摘要:题意:给定你一个以质数为底表示的数;问你这个数减1,之后用质数为底的表示法。例如:17 1 = 17^1 =17 - 1;5 1 2 1 = 5^1*2^1=10 - 1;2 4= 2^4 = 163 2 = 3^2= 9;View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<cstring>using namespace std;int prime[4024],cnt;
阅读全文
摘要:题意:输入m, n, d。求出m,m+1,m+2,````m+n的一个排列。使得任意的连续k个数之和都为合数,2<=k<=d。注意如果开始时连续数小于d时也要是合数;用DFS暴力搜索;View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<cstring>using namespace std;int num[1024],S,E,d;;bool visit[10
阅读全文
摘要:这个题是求外心的问题;我们可以用直线相交做,也可以用向量做;直线相交:View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>using namespace std;class Point{publ
阅读全文
摘要:求多边形的面积;View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>using namespace std;class Point{public: int x,y; }point[1000024
阅读全文
摘要:这个题要考虑直线在正方形的内部;顶点给你的顺序不一定就是左上角到右下角;View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>using namespace std;class Point{pub
阅读全文
摘要:这个题用到了pick定理:多边形的面积 = 内部的数的和 + 边上的点的和/2 -1;View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>using namespace std;class Po
阅读全文
摘要:这题只要判断边上的中点与线段相交的交点就可以了,求出最小的交点数;我们知道区域A的任何一点到线段a上的任何一点,要通过上面的3条线段,那么我直接连接区域A的点与线段a的点,经过的一定是3条直线,并且也是3个焦点;因此,该题我们就只要判断交点的个数就可以了;View Code View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set&
阅读全文
摘要:这个题就是纯暴力枚举:枚举所有顶点的连线的直线与所有线段是否有交点;View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>using namespace std;class Line{public
阅读全文
摘要:这个题就是求凸包;极角排序:View Code View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>using namespace std;class Point{public: double
阅读全文
摘要:这个题就是求无论你站在家的那个地方都能看到财产的最大值;这个题可以从正面做,直接用叉积求出最大值;View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<cstring>using namespace std;class Line{public: double x1,x2,y; }line[10000];Line house,pro;int dcmp( double x )
阅读全文
摘要:这个题首先判断是否是凸多边形,再判断圆心是否在凸多边形内,再判断凸多边形是否在圆内;做法用Graham判断是否是多边形;再把圆心加入到多边形的点之中,再用Graham看圆心是否在凸多边形上,如果在就代表圆心在凸多边形外;再用点到直线的距离,fabs(A*x + B*y + c)/sqrt(A*A + B*B);极角排序法:View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<q
阅读全文
摘要:输入输出超恶心的,这个题要注意的是线段不是规范相交,也算相交,没有图形包含的情况;思路:计算几何。思路并不复杂,枚举当前几何体的所有边和其他几何体的所有边比较。另外,已知正方形的一对不相邻的顶点(x0,y0),(x2,y2),可以由方程组:x1 + x3 = x0 + x2;x1 - x3 =y0- y2 ;y1 + y3 = y0 + y2;y3 - y1 =x0 - x2 ;求得另一对不相邻的顶点(x1,y1),(x3,y3)。矩形另外一个点为 x3 = x0 + x2 - x1 ,y3 = y0 + y2 - y1;View Code #include<iostream>#i
阅读全文
摘要:管道问题:题意:有一宽度为1的折线管道,上面各顶点为(x0,y0),(x1,y1)...(xn,yn),下面各顶点为(x0,y0-1),(x1,y1-1),....(xn,yn-1),假设管道不透明,不反射,光线从左边入口(x0,y0),(x0,y0-1)之间射入,向四面八方传播,问光线最远能射到的X的坐标或者射穿整个管道。这题用的是枚举法,枚举所有的上下点,要是最优,一定是一个上点与一个下点,这样才能使X最大;每次枚举一个上下点,就判断是否与线段相交,我用的方法是与它左边由对应的上下点作线段相交(即与(xm,ym),(xm,ym-1)的连线),如果他们的叉乘大于0,则没有相交;反则,相交,枚
阅读全文
摘要:这个题是要求钉两块木板接水,问你能接到多少水;这里有几种情况不能接到水:1 :两直线没焦点;2:一条直线是水平的,3 :上方没口子,4:上面的线段挡住了下面的线段使水不能落到里面去;这里要用到定比分点。View Code View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<cmath>#include<algorithm>#include<cstring>using namespace std;class Point{public: d
阅读全文
摘要:这个题要用到扩大数据运算,和投影;目的意思比较奇葩,给出N个正方形, 每个正方形是都45度放置,并且每个正方形都与X轴接触。因此产生一个序列, b1 – bn 。首先是插入操作,每次输入边长的时候将正方形插入到能插入的最左边, 什么意思了,结合图看一下, 就是s3本来可以插入到s1的前面,s1和s2的中间, 但最左边是s2,故插入到了s2的左边。在插入的的时候可以求得正方形的左区间和右区间,比如说s2.left = s1.right – fabs(s1.len – s2.len)/sqrt(2)s2.right = s2.len + sqrt(2)*s1.left两个计算中都有一个操作根号2的
阅读全文
摘要:题意:国王想建一个周长最短的城墙,使墙的任意一点到城墙的距离都 > L。求这面墙的周长。我们知道在每个顶点的时候要计算弧度,其实我们知道每个都变形最后所有的弧形加起来会组成一个以L为半径的圆;这样周长就转换为凸包的周长+圆的周长;这里我自己写了两种关于Graham-scan不同的排序法;极角排序:View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#i
阅读全文
摘要:大致题意:一只蚂蚁,只会向左转,现在给出平面上很多个点,求解一种走法,能使得蚂蚁能经过的点最多,每个顶点该蚂蚁只能经过一次,且所行走的路线不能发生交叉.卷包裹法:形象思维假想一根无限长的绳子,一开始,左端粘在点集的最低点上。若有多个最低点,则去最做的最低点。然后拉动绳子的另一端逆时针绕行,每次紧贴一条边(这就是凸包上的一条边),这样绕行一周,绳子的形状就是凸包,这就是所谓的卷包裹法;该算法的效率比较低是O(n^2)的时间效率;View Code #include<iostream>#include<cstdio>#include<cstdlib>#inclu
阅读全文
摘要:这是一道简单而有趣的几何题。如果将每扇门的上下起点,加上起点与终点作为无向图的顶点,两个相互之间可以直达(即连线不经过任何障碍)的顶点之间连一条边,长度作为两点之间的距离,这样就可以转化为图论的最短路问题;View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<cstring>#include&
阅读全文
摘要:跟http://poj.org/problem?id=2318是一样的;这里就不解释了;View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>using namespace std;class N
阅读全文
摘要:这是一道计算几何题,这里用的是向量的叉积,由于隔板已经排好序了那么我们只要从左至右暴力过去可以了,条件是叉积大于0;View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>using namespa
阅读全文
摘要:这个题用到了黑白染色法:黑白染色法101111001又是一个图,要求是把方格里的所有的1改为零,一次最多只能修改相邻的两个,为最少需要修改几次?有是一个求最值得问题,但是似乎用于求最值的算法(贪心,动态规划……)都派不上用场,既然在这里提出,那么他肯定能用二分图最大匹配解决,关键是如何建图?既然是每次只能拿相邻的两个,是两个,正好我们匹配的时候也是找两个进行匹配,这是否就是这个题和最大二分图匹配相联系的地方呢?对就是这里。但是每个点能和他四周的四个点匹配,那么我们怎么把所有的点分成来那个部分呢?对就是要把第i个点放到第一部分,第I个点周围的四个点放到第二部分,再把这四个点周围的16点放到第1部
阅读全文
摘要:这是一道求最大独立集的问题;View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>using namespace std;bool G[524][524],visit[524];int match
阅读全文
摘要:二分匹配问题 :最小覆盖=最大匹配这道题要用匈牙利算法求最大匹配,机器A的所有模式为左部顶点,机器B的所有模式为右部顶点,然后A与B之间的每条连线代表一个任务或工作,问题是为什么最大匹配数就是机器要重启的次数。我们可以这么想,因为要通过安排机器的顺序来使重启次数最少;所以跟机器的顺序就没什么关系了;所以A机器一定能被B机器替代;那么我们就只要找B的最小覆盖点就可以;此题还要注意的一点是机器A、B启动时的模式都是0模式,所以若有在0模式可完成的任务就不能考虑在内,我们就可以从1开始遍历就好了。View Code #include<iostream>#include<cstdio
阅读全文
摘要:最大独立集: 在N个点的图G中选出m个点,使这m个点两两之间没有边,求m最大值。如果图G满足二分图条件,则可以用二分图匹配来做。最大独立集点数 = N - 最大匹配数。这里我们将孩子看成A,B集;如果A喜欢的动物与B不喜欢的动物相同那么我们就连线;我们就认为第i号人与第j号人相冲突,要么选i号,要么选j号;因此就成了选取最小点覆盖问题,也就是去除最少的人的冲突;这里要注意就是要建双向边,因为第i号人与第j号人相冲突必然第j号人与第i号人相冲突;最大独立集点数 = N - 最大匹配数/2。View Code #include<iostream>#include<cstdio&g
阅读全文
摘要:题意:出租车公司有n个预约, 每个预约有时间和地点, 地点分布在二维整数坐标系上, 地点之间的行驶时间为两点间的曼哈顿距离(|x1 - x2| + |y1 - y2|)。一辆车可以在运完一个乘客后运另一个乘客, 条件是此车要在预约开始前一分钟之前到达出发地, 问最少需要几辆车搞定所有预约。这里用到的知识是 最小路径覆盖 = 总节点数 – 最大独立集数(最大匹配数);这里建图要注意的是如果这个地方没预约,我们可以从这个地方开到有预约的地方去;所以这个地方要发费时间;View Code #include<iostream>#include<cstdio>#include&l
阅读全文
摘要:最小路径覆盖数=顶点数n-最大匹配数;定义 一个PXP的有向图中,路径覆盖就是在图中找一些路径,使之覆盖了图中的所有顶点,且任何一个顶点有且只有一条路径与之关联;(如果把这些路径中的每条路径从它的起始点走到它的终点,那么恰好可以经过图中的每个顶点一次且仅一次);如果不考虑图中存在回路,那么每条路径就是一个弱连通子集. 由上面可以得出: 1.一个单独的顶点是一条路径; 2.如果存在一路径p1,p2,......pk,其中p1 为起点,pk为终点,那么在覆盖图中,顶点p1,p2,......pk不再与其它的顶点之间存在有向边. 最小路径覆盖就是找出最小的路径条数,使之成为P的一个路径覆盖. 路..
阅读全文
摘要:这是一道二分匹配题,根据Konig定理:最大匹配数=最小覆盖数;这里我们以行为左边,以列为右边建图,这样建好后,就是一个裸的二分匹配;View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>usin
阅读全文
摘要:这是一道裸的二分匹配题:View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>using namespace std;int visit[524],partner[524],K,N,M,G[524
阅读全文
摘要:这是一道拓扑排序题;View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>using namespace std;class AOV{public: int num; AOV *next;};cl
阅读全文
摘要:道题比较坑,就是输入N,M之后可能有多个空格这里要注意;方法:1:建图,把A进行编号在存储到图中;2:利用BFS找出任意两点的最短距离;3:利用kruscal生成最小生成树;View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<cstring>#include<vector>using namespace std;in
阅读全文
摘要:一道简单的最小生成树问题:View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<map>#include<cstring>#include<vector>using namespace std;class Kru{public: int x,y,dis;}kru[10024];int set[124];bo
阅读全文
摘要:一道简单的最小生成树问题;View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<map>#include<cstring>#include<vector>using namespace std;class Kru{public: int x,y,dis;}kru[250024];int set[524];b
阅读全文
摘要:题意:用一个7位的string代表一个车的编号,两个编号之间的distance代表这两个编号之间相同位置不同字母的个数。如果一个编号要“衍生”另一个编号,代价是这两个编号之间相应的distance也就是改变字母数,现在要求总的改变数最小,也就是distance之和最小。4aaaaaaabaaaaaaabaaaaaaabaaaa编号2,3,4分别从第一编号衍生出来的代价最小,因为2,3,4分别与第一编号只有一个字母是不同的,相应的distance都是1,加起来是3。也就是总的改变数最小为3。View Code #include<iostream>#include<cstdio&
阅读全文
摘要:这个题求是否经过兑换后钱能不能增加。这题可以用bellman比较容易解决;View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<cstring>#include<string>#include<vector>using namespace std;class Edge{
阅读全文
摘要:题意:以任意顶点为起点,能够连通所有的节点,问你以哪个节点为起点时到所有的节点的最短路的最长路最短;View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<cstring>#include<vector>using namespace std;const int inf = 0x7f
阅读全文
摘要:题意:一只青蛙在湖中1号石头上, 它想去2石头号上去找另外一只青蛙,但是 湖里的水很脏,它不愿意游泳,所以它要跳过去;给出 两只青蛙所在石头的坐标, 及湖里其他石头的坐标;任一两个坐标点间都是双向连通的。显然从A到B存在至少一条的通路,每一条通路的元素都是这条通路中前后两个点的距离,这些距离中又有一个最大距离。现在要求求出所有通路的最大距离,并把这些最大距离作比较,把最小的一个最大距离作为青蛙的最小跳远距离。解法一:用克鲁斯卡尔:View Code #include<iostream>#include<cstdio>#include<cstdlib>#inc
阅读全文
摘要:这个一道最短路题;这里难处理的就是等级只差的问题;这里我们就用枚举法;假设等级只差为L=3;酋长的等级为5,这里就只存在这几种情况2-5,3-6,4-7,5-8;我们只要处理这几种情况就可以了;至于建图就直接用钱数就可以了;View Code #include<cstdio>#include<iostream>using namespace std;const int inf = 0x7fffffff;int level[124],map[124][124],L,N,dis[124],hash[124];void Empty( ){ for( int i = 0 ; i
阅读全文

浙公网安备 33010602011771号