首页 > 代码库 > sgu100~199题解
sgu100~199题解
老东西了。。发上来吧。。
Sgu题解系列 南开中学邹事成
100:A+B略
101:Domino 给n块多米诺骨牌,每张骨牌两端各有从1到6的一个数字,现在要把这些骨牌排成一列,使相邻的两块骨牌相对的面所写的数字一样。
可以把每一块多米诺骨牌想象成一条边,把面上写的数字抽象成点,比如一块骨牌正面写的1反面写的2就想象成连了一条从1到2的边,那么这就是求一条有重边的欧拉回路了,dfs一下即可。
102:Coprimes给定n求从1到n中与n互质的数的个数。
可以把n质因数分解后直接代入欧拉函数。或者从1到n枚举求和n的最大公因数也行。
103:Traffic Lights 给定一个无向图,边权为时间,每个点可以为蓝色或紫色,周期性变化,只有一条边的两个端点颜色相同时才能上去,给定每个点的初始颜色,初始剩余时间,蓝色持续时间,紫色持续时间,求从一个点到另一个点的最短时间。
变形的最短路,依然用spfa求解,只不过现在两点间的时间差不只是加上边权了,还要算上等待颜色变化的时间。如果当前时刻两点见颜色相同,直接走,如果不同开始判断,算出两个点下一次变灯的时间,如果不同则去较小值就可以走了,如果相同则递归判断,如果到了第四次还不行,那就证明这条边永远走不了了,第一次判断第一个点的剩余时间,第二次第二个点的剩余时间,第三次第四次判断相对的点的颜色变化时间。Spfa解决。
104:Little Shop of Flowers 给定一些花和一些花瓶,编号小的花要放在编号大的花的左边的花瓶里面,由于花在不同的花瓶里有不同的观赏值,求出最大的观赏值并输出方案。
典型的动态规划问题,用F[i,j]表示现在到了第i盆花,第j个花瓶,很容易想到
f[i,j]=Max(f[i,j-1],f[i-1,j-1]+map[i,j])枚举j取f[n,j]的最大值即为答案,倒着搜回去就是方案。
105:Div 3给定n求这一列数中3的倍数的个数1,12,123,1234,12345...12345678910....直到从1写到n
有个性质就是一个数k mod 3等于把k的每一位数加起来mod 3这样的话就比较好做了,连续三个数肯定为mod 3=0 1 2 这样的话按照题目那样写出来就会有两个数为3的倍数,再对n按mod 3的余数分一下类直接输出就好。
106:The Equation 给定a,b,c,x1,x2,y1,y2求满足ax+by+c=0的满足x∈[x1,x2] y∈[y1,y2]的解的个数。
首先先特判一下a=0或b=0的情况,要不然后面比较麻烦。然后可以求一下a,b的最大公因数d,如果c不是d的倍数那么这个方程一定是无解的,判断好这些就可以用扩展欧几里得解出一组x0,y0再扩大c/d倍就可以使得ax0+by0=c了,然后我们知道x0+b,y0-a后还是满足此等式,所以可以这样调整解到要求的范围里面。x1<=x0+tb<=x2,y1<=y0-ta<=y2解出一个t的范围,此范围里面有几个整数即为有几组解,注意向上还是向下取整即可。
107:987654321 problem 给定n求平方以987654321结尾的n位数的个数。N<=1e6
N太大了必然是数学解法,注意到一个数可以表示从a*10^9+b,则这个数的平方的后九位只和b有关系了,所以可以枚举从1到1e9中有几个数的末尾为987654321,发现只有8个,所以当n<9时无解,n=9时有8个,n>9时有9*8*10^(n-10)个解。
108 Self-numbers II 定义一个函数f(n)等于n的各位数字之和再加上n,则称n是f(n)的生成器,如果一个数没有任何一个生成器,则称这个数位自我数,n<=1e7,并给定s1,s2...sk,求1到n中自我数的个数,并输出第s1,s2,...,sk个自我数是几。
题不难,可以直接筛出答案,但是无法开一个1e7的bool数组,所以需要优化一下,方法应该有很多种,我想的是把数组重复滚动利用,因为最多才有7位数,和最多为63,开一个长度为64的bool数组即可,对于不同的si我们可以先按si的大小排序si的编号,然后有序了之后每次从1到n按顺序筛出答案存进答案数组即可。
109 Magic of David Copperfield II 玩一个魔术,有一个N*N的格子,玩家手放在左上角
(1,1)处,每次变魔术的人让玩家把手移动KI步,然后魔术师把一些没有玩家手指的格子删掉,并且保持格子的连通性,最后使得玩家手指停在唯一的格子里,求删格子的方案。
对于这类格子的问题有一种想法就是黑白二染色,然后构造一种解,给横纵坐标的和为偶数的格染为黑色,否则染成白色,现在有一点可以明确,我要是让所有KI均为奇数那必然是从一个颜色的格走到另一种颜色的格子,现在我们把n奇偶分类,
n要是奇数我们这样染色: n要是偶数我们就这样染色
1 2 3 4 3 2 1 其实就是先删去四个角 1 2 1 2 1 2 把最外面一层的都删去
2 3 4 5 4 3 2 删成一个菱形,然后接 2 * * * * * 里面就和奇数的情况一
3 4 5 6 5 4 3 着删边界把最后一个点 1 * * * * * 样了。
4 5 6 7 6 5 4 缩到整个矩形的中心。 2 * * * * *
3 4 5 6 5 4 3 1 * * * * *
2 3 4 5 4 3 2 2 * * * * *
1 2 3 4 3 2 1
输出这个矩形即可。
110:Dungeon 题目给定若干个球的方程,还有一束光线的起点和方向,打到球面上会反射(相切也算),输出依次打到的球的编号。
比较烦人的计算几何,其实想明白也不是太恶心,把直线写成s=s0+k*v;s0为起点,v为速度向量,然后枚举每一个球算交点,然后就可以算反射后的速度向量了,可以求出当前球面的法向量n,然后求出v在n上的投影再乘个2减去v就是反射后的速度向量v‘了,然后继续重复上面的步骤即可。
111:Very simple problem 给一个范围1e1000的数n,求根号n的整数部分。
高精度开方,网上有一种笔算开方的方法不太熟,我用的高精度+二分,但是直接硬来还是会超时的,可以优化一下:一个k位数他的平方根的长度在k/2-3到k/2+3,这样缩小了范围二分再压一下位就可过了。
112:a^b-b^a
就是给了a和b让求a^b-b^a
直接上高精度,压不压位用不用倍增好像都可以过得....
113:Nearly prime numbers 定义一个数为“伪质数”当且仅当这个数可以被表示成两个质数的乘积,现在给n个数ai,判断ai是不是未知数。
直接筛出质数,然后直接枚举判断就行了....
114:Telecasting station x轴上面有n个城市,各有xi的人口,现在要建一个电视台在x轴上面,一座城市的不满意程度为该城市到电视台距离*该城市的人数,求使得总不满意度最小的电视台的位置。
把每个城市的xi个人直接想象成该点有xi个人口为1的城市,然后我们举一些例子来找规律,比如两个人时中间任何一个位置都可以,三个人时建在最中间的人的位置最好,我们发现答案就是把所有城市都拆成1个人口的城市后所有城市的坐标的中位数。下面给出证明:容易知道电视台肯定建在最靠左的城市和最靠右的城市的中间那段里面,假设现在电视台在某个位置上,他向左挪s的话本来在他右边的城市到他的距离都会增加s,本来在他左边的城市到他的距离都会减少s,所以我们可以知道如果一个电视台从最右边开始往左挪,总距离会先变小再变大,所以答案即为中位数。
115:Calendar 求2001年m月n日为星期几。
没什么好说的,1月1日星期一。
116:Index of super-prime 定义一个概念“超级质数”,令pi表示第i个质数,如果i也为一个质数,那pi就为一个“超级质数”,给出一个n,将n表示成一些超级质数的和(超级质数可以重复使用),求最少需要几个超级质数。
先筛出所有在范围内的超级质数pi,然后就比较好做了用一个完全背包,f[i]表示和为i的时候最少需要几个超级质数,那么转移就为f[i]=Min(f[i-p[j]]+1)。
117:Counting 给一个数k和一个数m,再给出n个数ai,求ai中有几个数的m次方为k的倍数。
先预处理出质数表,然后把k质因数分解,如果一个数的m次方为k的倍数,那么这个数的所有质因数的次数均比k的对应的质因数的次数大,所以可以直接把k分解后每个质因数的次数都除以m然后乘起来得出一个新数k’,判断ai中有几个为k’的倍数即可。
118:Digital Root 定义f(n)等于n的各位数字相加的和,如果一个数是一位数,那么他的数根就是f(n),否则他的数根就是f(n)的数根,给定数列a1,a2...,an,求a1+a1*a2+a1*a2*a3+...+a1*a2*...*an的数根。
容易知道一个数n他的数根等于他mod 9。证明不难,因为n和f(n)模9同余,所以n和f(f(n))模9同余,以此类推,这样下去就可以知道n的数根为n mod 9,这样就好办了,读ai的时候用秦九韶计算方式一步一步都算出来就行了(其实就是累计一起乘,不是每次单独去算。)然后注意一下mod 9=0输出9就可以了。
119:Magic Pairs 已知Ax+By=0(mod N)成立,输出所有C,D,(0<=C, D< N)使此时Cx+Dy=0(mod N)一定成立。
易知C必为A的倍数,D必为B的倍数,则把A和B同时扩大k倍后去重排序即可。
120:Archipelago 给定一个正N边形,N边形上面的点按顺时针顺序标号为1,2,3...,给出标号为N1,N2的点的坐标,要求按编号顺序输出多边形所有点的坐标。
既然是个正N边形那就可以根据给定的两点坐标求出这个N边形的外接圆的圆心与半径,怎么求呢?我想的是可以把向量N1N2旋转∠N1ON2得到的向量加上N2可以得到一个在N边形上的点N3,这样这三个点的外心就是圆心坐标,然后算出半径向量依次旋转就可以了,至于向量的旋转,向量(x0,y0)顺时针旋转theta角:x=cos(theta)*x0+sin(theta)*y0,y=cos(theta)*y0-sin(theta)*x0,然后问题就解决了。
121:Bridges painting 给一个N个点的无向图,对边黑白二染色,对于度数大于2的顶点需要所连的边中至少一条黑色和一条白色。
构造题目,其实也不是太难想,首先知道对于图中的每个联通块是互不影响的,然后就可以对每一块深搜黑白交替染色来解决掉了,里面如果有度数为奇数的点就必然要从这个点开始染色了,原因在于如果从某个偶点开始染色那么深搜下去会出现不满足的染色方法,为什么呢?看下面的例子:
比如这个图,有6个点,1连2 3, 3连4 5,6连4 5 ,如果从1开始染色会在5号点发生冲突,实际上这个图是有解的。
所以我们从奇点开始染色,然后发现有个很好的结论为奇数点现在全部满足了,为什么呢,现在想如果这个点在一个环里面,如果是偶环,则回来的边和出去的边颜色必然不同,此时就满足条件了,如果是奇环,那回来的边和出去的边颜色相同,可是此时他是个奇点,这样必然还有一个“游离点”在环外面,给它染成另一种颜色就好了。最后判断偶数点是否满足就好。
122:The book 求一个满足任意一个点的度数都大于等于(n+1)/2的图的哈密顿回路。
首先这个回路一定存在,难点就在于如何构造出这样一组解,其实可以任意选一个点当做起点,然后不断地向两边扩展点把他扩展成一条链,成为了链之后我们要做的就是把它搞成一个环,这里就可以在这个链的中间选一个点,这个点和他后边的点和链的两端分别有边相连,则这就可以把这个链变成环了,为什么呢?假设左边为l,中间选的为k和k+1,右边为r,则这个环为从r直接走到k,然后从k一步步向左走到l,然后从l走到k+1,从k+1一步步向右走到r,这就把一个链变成了一个环,如果环的长度为n则已经得解,否则找个还没用的点连进环里然后再弄成链接着做就好了。
123:The sum 求斐波那契的前n项和。
直接带公式,f[1]+f[2]+...+f[n]=f[n+2]-1。归纳法证明之。
124:Broken line 判断一个点在给出的多边形的内部外部还是边界上。
用黑书上所介绍的射线法判断,对于边界情况特判一下,其他的情况也就是过此点做一条射线判断与多边形有几个交点,如果为奇数则在内部,如果为偶数则在外部。有一个问题就是如果和两条线段交在同一个交点,那么算几个?仔细想想可以明白如果在射线的同侧算两个,如果在异侧就要算两个了,那么这样就麻烦了,所以可以给这个射线向上移动一个极小量eps再判断交点,很好地解决了上面的问题,异侧有一个,同侧没有或有两个,奇偶性不影响,判断交点个数奇偶性就好了。
125:Shtirlits 给定一个n和一个n*n的数组b,让构造一个n*n的a数组。其中b[i,j]表示的是a[i,j]周围的四个数中比它大的数的个数。
N≤3明显就是让暴搜嘛...那就直接深搜吧..然后每次枚举到一个数就去检查它上面的数是不是满足b数组了,我枚举的数是从一到九..然后剪枝一下就过了..
126: Boxes 有两个盒子里面分别有x和y个球,每次只能将一个盒子中等于另一个盒子中球的数目的球移动到另一个盒子里面,问最少需要几步才能把所有球移到一个盒子里面。
逆向思维反过来想这道题找规律:
令sum=x+y
A盒子 B盒子
第n步: SUM 0
N-1 SUM/2 SUM/2
N-2 SUM/4 3*SUM/4
N-3 SUM/8 7*SUM/8
3*SUM/8 5*SUM/8
.....
发现了一件事情,就是(A,B)如果有解它是可以表示成(A1*C,B1*C)的,其中c为A,B的最大公因数,A1,B1为奇数且相加的和为一个2的整数次幂,这才是有节的情况,输出那个2的整数次幂的次数就是答案了。
127:Telephone directory 就是给个电话本,前两页被占了,然后每一页只能容忍写同样数字开头的电话号码,每页可以写K个,求最少需要几页。
直接数出各个数字开头的号码有几个除一下k就好了。
128:snake 给定n个点坐标,要求组成一个回路,所有顶点不漏,边都平行于x轴和y轴,回路的边只能在顶点处转弯,在顶点处也必须转弯不能穿过去,回路闭合不自交,求这样的回路的长度。
这题是真的挺烦人的...既然他要平行于x轴和y轴,那我就先按x排序枚举出竖直的边,因为不能穿过去所以x相同的y最小和y第二小的两个点必然连边,以此类推弄出所有竖边,然后如果有奇数个点随时退出,再按y排序弄出所有横边,然后我就把所有边的端点存起来,然后做一遍深搜判断是不是闭合的,这样之后就该判断是否自交了,这时候怎么办呢?数据量大,但y的范围较小,想到经典的解决方法:线段树,这时候就每次判断竖直的线和水平线除了端点有无交点,这样的话给所有边按x排个序,然后每次把y加进去,然后是竖直线时候就判断在当前竖直线y范围内有无交点,所以现在要把每条横着的边拆成两条,一条为入一条为出,相同的x的情况下我们让出的优先级最高,进的其次,竖线最后,然后数有没有交点就是线段树的事情了,总体比较烦,但思路还是挺明确的。
129:Analysis 给出一个凸n边形,然后给出m条线段的起点坐标终点坐标,算出每条线段在凸n边形内的长度。
计算几何。先把给的n个顶点排序,保持逆时针顺序,然后每次读进来两个点分别和每条边判断位置关系,如果和某条边重合直接输出0就好了,否则用两个bool变量来记录两个端点和所有边的位置关系,每次判断出在凸n边形的里面还是外面,然后判断这条边和凸n边形的关系,如果现在的边和凸n边形有交点就记录下来。都枚举过后就处理记录下来的那个交点数组,按x排一下序,然后如果那两个bool变量都为真也就是两个端点都在n边形里面,直接两点间距离公式,否则哪个为真就算他和x最小的那个交点的距离,否则判断如果只有两个交点算两个交点间距离就好了。
130:Circle 一个圆周上有2k个点,以这些点连k条弦,求划分出的最小区域数以及取得最小的时候的划分法方案数。
递推。显然最少k+1块,然后用f[n]表示有2n个点的时候的方法数,则f[n]=sigema(f[j]*f[n-j-1])(0≤j<n),意思不难理解,即为选择一个点不断连边把图分成了两部分,一部分2j个点,一部分2n-2j-2个点即可。
131:Hardwood floor 题目是poj2411的一个难度加深,这次除了1*2的木块还多了一个2*2缺一角的木块,问填充一个棋盘有多少种方法,还是用一层一层推得方法,深搜时要记录上一层和当前层的状态,还要记录当前列是否与左边突出来的相连,那么可以分为下面几种情况
1 2 3 4 5 6 7
| +- | L or U L| or U| -+ or -+ L or U or L or U
| | +- -- -- -+ -+ W| L| W W L L
L U表示和左边或上边突出来的相连,-|+都是表示新放的形状,w表示先不放等着下次补充上来。
我们还是用0和1记录,如果下一行还可以接着上一行放那么为0,不可以则为1,如果和左边或下边突出来的则为1,否则为0,那么整个dfs过程就好表示了,一直搜下去搜到最后一行最后一种情况就是答案
132:Another Chocolate Maniac 一个棋盘有一些空缺的格子,现在问最少放多少块1*2的木块可以使没有任何两个格子是相连的我们用F[I,J,K]表示第i-1行状态为j,i行状态为j满足条件时最少的木块数,状态具体还是用一个二进制表示,如果已经填充或者是初始障碍那么记录为1否则记录为0,在每次搜索时搜索第i-1行和第i行的状态,必须满足第i-1行的状态和第i-2行的没有同一列为0,第i-1行没有相邻的0,然后每次枚举如果i-1行和第i行同为0的列改为1,或者第i行相邻为0的列改为1,不断搜索下去即可。
133:Border 给n个左右起点都不同的区间,求被其他区间包含了的区间的总个数。
挺好想的,按左端点为关键字排序,排序后从小往大扫,并记录当前所到的最远的距离,也就是右端点的最大值,如果现在这个最大值大于现在这段区间的右端点则答案加一否则更新右端点最大值就可以解决了。
134:Centroid 给一个有n个点的树,给每个端点定义一个权值,它的大小为从树中去掉这个顶点后的连通块中顶点最多的那块的顶点个数,求n个点中权值最小的有哪几个。
树形dp,直接从根做一遍深搜,记录下每个点的子树的顶点个数总数,并记录下每个顶点的儿子子树中顶点个数最大的值,那么一个点的权值即为这个最大值和n减去子树定点总个数这两个数中的较大值。
135:Drawing Lines 求n条直线最多把一个平面分成多少块。
很好想,假设新加入第k条线段,最多的情况即为他和前k-1条直线全相交,然后被分成了k段,然后每段把这段所在的块一分为二,然后多了k个块,则答案为n*(n+1)/2+1。
136:Erasing Edges给出n边形的n条边的中点坐标,求这个n边形的n个顶点坐标。
如果一条边的两个端点坐标为(x1,y1) (x2,y2)那么中点坐标为((x1+x2)/2,(y1+y2)/2),那就读进来所有中点坐标,可以知道求出第一个点的坐标就能确定这个多边形了,那么把每条边扫一遍,定义两个变量sumx,sumy,碰到第奇数条边则sumx,sumy加上这个坐标乘以二,碰到第偶数条边sumx,sumy就减去这个坐标乘以2,那么我们发现如果n为奇数,直接将sumx,sumy除以2就是第一个点的坐标,否则n为偶数的话现在如果sumx≠0或sumy≠0就有矛盾了,如果都得0了随便给第一个点个坐标,然后扫一遍得出其他点的坐标。
137:Funny Strings 让求一个长度为n的环,这个环上中所有数的和为m,问他可以不可以通过旋转使得原来的a0 a1 ...an-1变成a0+1,a1,a2...,an-1 -1,保证n和m互质。
构造题。可以假设旋转了k个单位,那么可得到下面的式子:
a0+1=ak=a2k=...=a(t*k mod n) ......(1)
a1=a1+k=...=a((1+t*k) mod n)
...
an-1 -1=a((n-1+k) mod n)=...=a((n-1+t*k) mod n)
(1)式直到等于an-1就要停了,这一堆数必然是相等的,其他的数又必然是相同的,所以这样说明a序列中只有两个数且相差为1,肯定为(m div n)和(m div n+1)
则之间按0,1分a0必为0,an-1必为1则ak=a2k=...=1所以要求的就是一个k使得这样算(m mod n)遍后正好到了an-1,又因为m,n互质,这样的k一定存在,暴力找出来然后把每个a算出来就好了。
138:Games of chess n个人一起下棋,赢的人继续下一场比赛,和别人继续比赛(可以是前面输过的),给出每个人比赛的场数,求出一种比赛的序列方式。
由每个人比赛的场数就可以得出一共比了多少场比赛,然后我们就可以这样安排比赛了:1 :A X 2 :A X 3 :A X .... T1:B A T1+1:B X ... 让一些人都是连赢了很多场后输掉一场,但是如果有人只比了一场那这就办不到了,所以可以直接拍下序从大到小安排就可以了,胜场安排完了输的人随便排就行了。
139:Help Needed!
至今不太明白。
140:Integer Sequences 给出n个整数a1,a2...an和整数p,b,求一个整数数列x1,x2...xn使得a1*x1+a2*x2+...+an*xn mod p =b.
用一种归纳法的思想来解决这个问题,首先知道两个数的时候肯定有解使得a1*s+a2*t=gcd(a1,a2)那么我们令k=Gcd(a1,a2,...,an) ,再令k‘=Gcd(a1,a2,...,an-1),这样假设当有a1,a2,...,an-1时能求出一个y数列使得a1*y1+a2*y2+...+an-1*yn-1=k‘,我们可以知道gcd(k‘,an)=k,所以可以解出一组解使得k‘*s+an*t=k,所以这时候把y数组都乘以s,得到x1,x2...xn-1,再令xn=t就得到了要求的x数列,然后把x数列的每一项都乘以b/k就得到解决了。
141:Jumping Joe 求满足这样的方程的P1 N1 P2 N2的解:
P1*X1-N1*X1+P2*X2-N2*X2=P
P1+N1+P2+N2=K
可以把P1-N1看成a,P2-N2看成b,然后exgcd求得一组解,然后扩大P/GCD(A,B)倍得到一组解,现在开始调整,目标是使得ABS(P1-N1)+ABS(P2-N2)更小,因为如果这两个的和小于K且相加的和与K奇偶性相同,则可以通过来回跳来解决这个问题,每次让ABS(P1-N1)减去x2,让ABS(P2-N2)加上X1,这样可知永远满足天津,这样调整下去并判断奇偶性并找出一组解就可以了。
142:Keyword 给一个长度为N的串S(N<=500000)这个串只含a,b两种字母,找一个长度为L的串T,也只由a,b组成,使该串不是S的字串且长度最小。
长度为k的串有2^k种,在串S中共有n-k+1种,若n-k+1<2^k则长度为k的必有一解,解得k≤19,这样的话我们把S中所有长度小于19的串记录进一个hash数组中然后扫一遍就可以,每个子串视为一个2进制数,a为1b为0就行了。
143:Long Live the Queen给出一棵树,求一个非空联通子集,使得权值最大。
树形DP,设F[I]表示选择i的子树的时候的最大值,则f[i]=w[i]+f[j](j为i的儿子,且f[j]>0),w为点的权值,找到最大的f即为答案。
144:Meeting 两支队伍约定在x点到y点见面,来的时间随机,求他们的到达时间之差不超过z分钟的概率。
就是把这个转化到图形上,即为四条直线夹得矩形的面积为总面积,|y-x|<=z与矩形的边所夹的面积为要求的面积,两个一除就是概率。
145:Strange People 求第k短路。
直接用个最短路求到终点的最短路,再二分第k短路的长度,然后用深搜求小于此路长度的有几条,用之前算出来的最短路剪枝即可。
146:The Runner 一个人在长度为L的环形跑道上跑步,他把跑步过程分为n个阶段,每段以vi的速度跑ti时间,问跑完这n个阶段后距离起点的距离为多少。
直接模拟,算出他跑了多长的路,对L取一下模,然后判断距离起点的左右两个距离里面的较小值输出就可以了,要注意一下精度,可以先把数扩大10000倍再做来控制精度。
147:Black-white king n*n的棋盘上有一个黑王,一个白王和一个黑白王,他们都按王那样走,黑王和白王要一定到相邻的格子里面,黑白王要在他们相遇之前吃掉一个王阻止他们,
黑王和白王要尽可能快的到相邻的格子,黑白王走路要满足走最短路,移动顺序为黑王,白王,黑白王,问黑白王有没有可能战胜黑王和白王。
首先分析黑白王,他既然要走最短路,那么他走了k步,他可能到的位置就是一个正方形框,再来想黑王和白王,考虑他们横坐标的差x和纵坐标的差y,假设y较大(如果x大就相当于把坐标轴转一下,是等效的),那他们两个的每一步都要向y方向移动一步,我们考虑黑王(白王是一样的)走了k步后他的x坐标是有范围,即[blackx-i,blackx+i],但是他乱走会和白王不能相遇的,再考虑白王走到当前列的范围,然后求交集,即为下图:
|
| 黑 |
|
|
|
|
|
白 | 黑白 | 黑白 | 黑白 | 白 | 白 | 白 | 白 |
黑白 | 黑白 | 黑白 | 黑白 | 黑白 | 白 | 白 | 白 |
黑白 | 黑白 | 黑白 | 黑白 | 黑白 | 黑白 | 白 | 白 |
黑 | 黑白 | 黑白 | 黑白 | 黑白 | 黑白 | 黑白 | 白 |
黑 | 黑 | 黑白 | 黑白 | 黑白 | 黑白 | 黑白 | 黑白 |
黑 | 黑 | 黑 | 黑 | 黑白 | 黑白 | 黑白 | 黑 |
黑 | 黑 | 黑 | 黑 | 黑 | 黑白 | 黑 | 黑 |
只有黑白才是可以走的格子,然后判断这些格子和黑白王的那个正方形范围是否相交即可。
148:B-station 给出一个n层的大坝,每层已经存有一些水量wi,每层还有一个能存水的最大值li,还有炸毁这一层所需的价格pi,求毁掉最后一层大坝且让总话费最小时炸了哪些层。
可以知道毁掉的层一定是最后连续的k层(被毁掉有可能是炸掉或者是水量超过此层承重),假设上面有不是连续的,则上面肯定有不需要被炸的。那现在就有一个N^2的算法,即坏掉的枚举最高的一层是哪一层,然后往下枚举,超过称重继续向下,没超过加上炸毁的价格,这样会超时的,考虑优化,假设我们处理到了第i层,如果sum[i] - sum[j] - (L[j] - w[j]) > 0 其中 sum[i]表示Σw[i...n],则毁了第i层第j层就会被毁了,注意到sum[j]+l[j]-w[j]是定值,这样可以用一个优先队列来存这个值,然后倒着搜一遍第i层的sum[i]如果大于j对应的队列里面的值,那第j层就可以不用那个费用p来炸毁了,减去j的费用加上i的费用就行了。用f[i]表示最高毁掉的是i时所需的最小费用,维护队列扫一遍就行了。
149:Computer Network 给定一棵边带权的树,求树上每个点到其他点的最远距离。
此题可以想一个顶点到其他点距离最大值,此点可能在他的子树里,也可能在他的子树外,在他的子树上就直接深搜得解即可,在他的子树外就可以算他的父节点到他的父节点的子树的最大值,但是有可能x在father[x]取子树的最大值的子树上,所以要想到一些改变,除了记录子树的最大值,还要记录子树的次大值,这样一个点到他的子树的最大值,次大值可以由深搜得到,到外面的最大值分三种情况:
(1)dist[x]=cost[x]+dist[father[x]];
(2)dist[x]=cost[x]+deep1[father[x]] x不在最大子树上
(3)dist[x]=cost[x]+deep2[father[x]] x在最大子树上 这样输出dist[x] 和deep1[x]的较大值即可。
150:Mr. Beetle II 求两格点的连线所穿过的第n个格子的左下角的点的坐标。
题不难,可以把连线先平移到原点,然后翻转到在第一象限,即从(0,0)到(|x2-x1|,|y2-y1|)的情况范围不大直接枚举,注意精度统计穿过了哪些格子,然后再复原到原来的地方就是答案。
151:Construct a triangle 给出一个三角形的AC边长b和AB边长c中线AM长m,构造一个三角形ABC
把A放在原点(0,0),B(0,c),然后解C点坐标(Xc,Yc)。有下面几个方程:
Xc^2+Yc^2=b^2
Xm^2+Ym^2=m^2
Xc=2Xm-c
Yc=2Ym
解得Xc = (4*m^2-b^2-c^2)/2c
Yc = sqrt(b*b-Xc^2)
判断下三角形是否合法即|b-c|<=2*m<=b+c就行了
152:Making round 给出n个数,求每个数占总和的百分之几。
直接加起来算,然后给每个百分比取整,最后剩下的零头给那些所占百分比不是整数的数,乱搞一下就行了。
153:Playing with matches 两个人轮流取S根火柴,分别可以取1,P1,P2,...,PN(2≤Pi≤9,0≤N≤8)取走最后一根的输,问谁必胜。
典型的博弈论问题,如果不考虑S的范围,则可以直接递推,用f[i]表示还剩i根火柴时先取的人必胜或必败,必胜为1必败为0,则f[i]=max(f[i-pj] xor 1)即可。
但是此时S的范围巨大,然后就开始打表分析,发现了这居然是个循环,然后就暴力求出S≤10000时的解然后求出循环节(暴力就行)然后把S对循环节取一下余输出即可。
154:Factorial 给出一个Q,求最小的N,使得N!的末尾恰好有Q个0,。
不难知道要在末尾出现0需要2和5,但是2要比5多得多,所以只考虑5的个数即可,有Q个0就意味着有在n以内有Q个因数5 。N以内因数5的个数为[n/5]+[n/5^2]+[n/5^3]+... ([n/5]表示不超过n/5的最大整数,以此类推),然后解出个N的大致范围再枚举就好办了,可以把取整号先去掉等比数列求和搞一下得到Q = N(5^k - 1) / [4*(5^k)],N = 4Q * [(5^k)/(5^k-1)]所以N就在4Q附近枚举吧。
155:Cartesian Tree 给出n个点,每个点有两个权值a和b,让构造一棵树,满足下面两个条件:(1)a权值符合二叉搜索树,每个点的左子树的a值都比它小,右子树a都比它大。
(2)b值类似一个堆,每个节点的b值都比他的孩子节点b值小。
过程不算很复杂,既然a值满足二叉搜索树,就先按a值给所有节点排序,然后每次加入一个新节点必然是往右子树上插,但是要注意的是满足a的堆性质,所以新的节点要插入到右子树的某个T节点的位置,然后让原来T位置的节点变成新节点的左子树,此点变成右子树的最后一个节点,所以就把最右边一直向右走的那条路用一个栈记录下来,然后倒着往回搜看哪里是第一个不满足b性质的,这时候就像平衡树那样旋转一下就行了。
156:Strange Graph 给出一个图,判断是否存在哈密顿回路,这个图有以下几个性质:
1.图联通,无重边无自环 2.每个点的度数至少为2 3.对于每个度数为2的点,与他相邻的两个点之间没有边 4.对于每个度数大于2的点,与他相邻的点中有一个度数为2的点,且除去这个点之外的所有点之间两两连边。
为了方便把度数为2的点称为“二点”,把一个点连出的边叫做触手。考虑一个度数大于2的点A,他连着一个二点B,剩下相连的点X1,X2...XM一定不是二点,Xi的触手会连着Xj和A,还会连着一个二点Yi,且每个Xi一一对应一个Yi,所以一个大小为N的联通块会连出N个二点,由于哈密顿回路的定义二点的两个触手必然都走,然后联通块中的点随便走,所以只要每个二点都能到那每个联通块都能走,也就有哈密顿回路,遍历所有二点等于遍历所有边,转化为欧拉回路,问题得到解决。
157:Patience 一种纸牌游戏,就是把一段纸牌通过移动变为按顺序的,移动的顺序为将牌移到空格地方,但是移动的这张牌必然要比前面的牌大,问给定段的长度,有多少种状态可以在移动后达到目标状态。
一看长度≤13就直接暴力搜索吧,判重时候两个数组来回倒一下就行了。N>10时候还是交了表。其他太好的方法没想到...
158:Commuter Train 给出n个人的位置,有一列火车有M个门,每个人会选择离他最近的门上车,问这列火车停在哪个位置能够使所有人走的距离之和最大。
上来枚举出每个人当车停在0位置时要走哪个门,然后枚举车的位置,不难知道要停在的位置不是整数就是x.5,由此可以直接枚举停在哪里,然后随时更新人走门的情况即可。
159:Self-Replicating Numbers 求n位的b进制数A,使得A的平方的后若干位为A,则称A为自我数。求这样的A的个数。
不难发现一个很好的性质,如果A是一个自我数,把他表示成anan-1an-2...a2a1那么an-1an-2....a2a1依然是一个自我数,所以说有了这个性质我们就可以开始从低数位向高数位直接搜索判断即可。
160:Magic Multiplying Machine 给出n个数,让求从中选出一些,他们的积mod m最大。
直接递推就可以做,pre[i]表示结果为i的时候上一步的结果为多少,lev[i]表示结果为i的时候用的最靠后的一个数是第几个数,然后从1到n扫一遍,最后从m倒着往回搜索,如果pre[i]不为0那这个i就是答案,然后用pre[i]倒着找回去就可以了。
161:Intuitionistic Logic 题意太复杂,没写。
162:Pyramids 给出一个四面体的给定顺序的六条边的长度,求这个四面体的体积。
这个东西有公式,直接把数带进去就行了。
163:Wise King 给一个正整数a≤3,一个正整数n≤100,在给定的n个数中选出若干个,使选出的这些数的a次方的和最大。
A=2就全选,否则选正的。
164:Airlines 一个无向完全图,每条边有一种颜色,共m种颜色。要选出不超过(n+1)div 2种颜色,使得如果只走这些颜色的边,任意两点之间的距离不超过3。求一种方案。
有一个很好的性质就是将颜色等分为两部分,至少有一部分可行。证明比较复杂。(我是看的周源的证明)。大致就是这意思,将颜色分为A类和B类,若A不行我们来证明B是一定可以的。考虑任意两点x和y,设与x相连的边颜色为A的点的集合为AA(x),边颜色为B的点的集合为BB(x),同理有AA(y)和BB(y)。先考虑两种简单的情况:
(1)x和y之间的边本身颜色就为B,那么x和y的距离为1 。
(2)BB(x)和BB(y)有交集,那x和y的距离就为2 。
好了,简单的情况考虑完了就要想一些复杂的情况了,现在BB(X)∩BB(Y)为空了。
这时候考虑极端情况,如果任意点p∈BB(X)∪{X} ,q属于BB(Y)∪{Y} 都有边(p,q)的颜色为A,这时候X到Y的所有B路径都被封锁了。这时候想另一方面,如果是这样的话,考虑任意两个点c和d,如果c∉BB(X)∪{X} 那可以走一步A走到BB(X)∪{X}里面,d同理,这样的话c再走一条A就能到d了,这样的话A就是满足条件的了,这样的话前面的假设就不对了,所以肯定存在p∈BB(X)∪{X} ,q属于BB(Y)∪{Y} (p,q)为B色的,这样B颜色肯定就满足条件了,所以问题得到解决了。
165:Basketball 有n个人,每个人的身高都在1.95M到2.05M之间,且平均身高为2M,求一种人员的排列方式,使得任意字段身高之和与段长*2的差值小于0.1,输出一种方案。
就是把所有人的身高都减去2之后,每个子区间的和的绝对值小于等于0.1,因为身高减去2之后处于[-0.05,0.05]所以记录一个前缀和s[i],当前s[i]如果大于0就在i+1放一个小于0的最小的,小于0就放一个大于0的最大的,这样就构造出答案了。
166:Editor 要求写一个文本编辑器,支持插入文本,光标移动,,删除等操作,要求输出按照给定顺序的一系列操作后的文本。
简单暴力的做法就能够对,记录下来每行的长度啊行尾啊上下行指针的就可以了,最重要的是记录下来光标所在的位置,然后暴力操作即可。
167:I-country 在一个N*M的矩阵中,每个格子有一个权值,要求寻找一个包含K个格子的联通块,要求这个联通块内的格子连接的路径中最多只能用上下左右四种方向的两种,使得这个联通块内的所有格子的权值加起来的和最大。
图案型DP,仔细分析一下只拐一次弯的意思就是从上到下的左右边界一定是先增后减的,所以设计一个状态DP[I,J,L,R,X,Y]表示到了第i行,取了j个格子,第i行取了l到r列,x和y为0或1,表示的含义为现在左右边界的状态,如果为0则表示处于往回收的状态,1则表示向外扩的状态,所以每次转移的时候根据x,y枚举取得是哪一段,然后对于x和y的转移(1,1)可以从(1,1)转移来,(1,0)可以从(1,1),(1,0)转移来(0,1)可以从(0,1)(1,1)转移来,(0,0)四种状态都可以。
输出方案可以再开个数组记录下来x和y的走势以及每一行的l和r即可。
168:Matrix 给一个N行M列的矩阵A,输出矩阵B使得B[I,J]=Min(A[X,Y]|Y>=J X>=I+J-Y)
不难发现B中的每个点对应的是A中的一个梯形,先预处理出来B的第一行,然后把每列在每行的最小值求出来,然后每次比较A[I,J]和A[I-1,J+1]谁更小就是B[I,J]的值了。
169:Numbers 定义P(N)为N的各位数字的乘积,如果P(N)≠0且N mod P(N)=0 则n是好数字,如果n和n+1都是好数字那n是完美数字,求位数为k的完美数字。
设n的各个位的数字为akak-1...a2a1,显然a1≠9。
设n=s*a1*a2...*ak
N+1=t*(a1+1)*a2*...*ak
所以1=(t*a1+t-s*a1)*a2*...*ak
所以a2=a3=...=ak=1
然后讨论a1的取值:
1明显可以,2要判断n+1是不是3的倍数很好办,3和4的时候14不是4的倍数舍去 ,5的时候判断n+1是不是6的倍数也不难做,6的时候处理一下7的情况看一看(k-1)是不是6的倍数,7,8的时候118不是8的倍数舍去。
170:Particles 给出两个穿,都有+-号组成,询问能否通过交换相邻的两个+-使得第一个串变成第二个,给出最短的变换步数。
直接贪心即可,两个串的最小步数一定等于相对应序号(也就是第几个)的加号的位置的坐标的差的和。证明应该不困难,反证法即可。
171:Sarov zones 有K个区域要在一个学校选拔学生去参加奥赛,每个区域的比赛有两个参数,一个是需要几个人参赛,一个是参加比赛需要的最低分数,然后给出N个人每个人的体重和成绩,现在要给每个人安排一个区域考试,每个区域要求去考试的分数高于标准线的人的体重和尽量大,求一种分配方式。
看着就是贪心的题目,把每个人按体重从大到小排个序,然后让一个人去他能够去的最高级的比赛,不能去任何比赛的人没有任何实际的意义,随便放进不满的区域即可。
172:eXam 有M种考试,N个人参加考试,每个人选择了两个考试,需要在两天内考完,一天考一科,问是否有一种方法分配两天的考试,使得每个学生都可以在这两天考到他选择的两门课。
把M个考试抽象为M个点,如果有人选择了X,Y两门课,那么在图中X点和Y点连一条无相边,这样的话现在做一次DFS,把还没有搜到过的点设为第一天考,然后看与他相连的点有没有和他天数是一样的,如果有的话就矛盾了,否则得出一组解。
173:Coins 给定一个操作A,A是个K-1位的数组,数组值为0或1,对于一个K个硬币的序列C,正面朝上为0,背面朝上为1,X操作分为两步,第一步将C向左挪一步,第一个放到最后一个,移动后如果第i个硬币背面朝上且a[i]=1那么将第K个硬币翻面。给定L组,K个硬币的序列初始以及X操作后的样子,另外再给出一个长为N的硬币序列,在其上面做M次X操作,每次对SI到SI+X做DI次X操作,给定终态求初态。
此题明显分为两步,第一步求出A数组,第二步求出初态。
X操作说简单就是左移后如果C[I]*A[I]=1那么C[K]翻面,那么根据这L组就可以列出L个mod2的方程,这样可以用高斯消元解出A数组。
然后求解初态的方法就是做X的逆运算,现在发现还是一样的,如果C[I]*A[I]=1那么将C[K]翻面,然后右移一位,直接模拟的话就呵呵了,需要想更快的方法,我们发现没做一次X的逆操作就是给C数组乘上这样一个矩阵:
A[1] 1 0 0 0 ... 0
A[2] 0 1 0 0 ... 0
A[3] 0 0 1 0 ... 0
... 0 0 0 1 ... 0
A[k-1] 0 0 0 0 ... 1
1 0 0 0 0 ... 0
算一下发现非常正确(不要问我怎么来的,我看网上题解写的)。然后快速幂就能过了
174:Walls 给出n条线段的起点和终点,保证没有任何两天线段相交,求最早在第几条线段围城了一个封闭图形。
直接读入N条线段,然后把平面上的点离散了,用并查集维护,一旦有两个点出现在了一个集合里面那么现在已经是封闭图形了,我直接调用map写的,其实可以HASH的。
175:Encoding 按照题目的三句话做就行了:
(1)如果现在字符串长度为1了那答案就是当前字符串
(2)S为S1S2...SN 令K=N DIV 2
(3)S=WORK(SNSN-1...SK+1)+WORK(SKSK-1...S1)
现在问长度为N的字符串第Y个字符这样做完之后他处于哪个位置。
题解没啥可说的按照这三句话递归就行了,记录一下答案即可,如果现在的数在前半部分那答案加上n-k即可,每次操作后更新K和Y
176:Flow construction 给一个有源汇的网络图,图中有的边必须满流,求一个最小可行流。
就是个裸的上下界网络流,二分下从汇点到源点的流量上限,建图按照常规做法建立超级源超级汇那样做就可以了,最后答案就是二分出来的值,然后再跑一遍最大流用边的上界减去现在每条边还可以流的流量就是这条边流了多少流量。
177:Square 给一个N*N的正方形方格,初始每个格都是白色的,现在有M个操作,每次给一个矩形区域染成黑色或白色,求最后有多少黑色格子白色格子。
经典的矩形切割,把所有操作读入转化成离线问题,然后倒着修改,每次把现在这次操作和上次操作比较,就相当于原来的一块把现在的这一块打碎成好几个部分,只有一些部分起到作用,而这些部分会继续和更靠后的操作
比较,写个递归搜索即可。
178:Golden chain 有个人有一条长度为N的金链子,每次可以拆下来一个支付1费用,而之后他可以给店主一个长度大于1的金链子,这时候店主会用之前他给店主的金链子找钱给他,问他最少要把金链子拆几次。
假设拆了X次,那么会得到X段长度为1的,其他的段如果都可以找钱肯定是(x+1),(x+1)*2,(x+1)*4,(x+1)*8,... 那么就是解x+(x+1)+(x+1)*2+...+(x+1)*2^x>=N的最小整数解,直接暴力枚举吧。
179:Brackets light 给一个长度为n的合法括号序列,定义‘(‘<‘)‘求字典序大于给定括号序列的合法括号序列。
倒着往回搜记录到了现在位置右括号和左括号各有多少个,找到第一个右括号个数大于左括号的且当前位置为‘(‘的位置,这时候就可以把一个右括号提到现在的位置,然后后边输出现在有几个左括号补全就可以了。
180:Inversions 给一个数列求逆序对个数。
先把数列离散化了,然后树状数组求逆序对即可。
181: X-Sequence 给定X0=A,XI=(αXI-1^2+βXI-1+γ) MOD M,给定K,求Xk
一个数列mod一个数是有周期的,暴力枚举出周期然后搞一搞就可以了。
182:Open the brackets 给一个表达式,最多十个变量,均为布尔型,有以下几种运算符:!取反,||或,&与,<=>相等,=>包含,#异或,还有括号,求这个表达式的等价表达式。
因为变量不超过十个我们就可以枚举这是个变量的T或F,然后计算出来每种情况的时候是T还是F,如果是T则将这种情况下变量为F的前面加上!,如果是T则什么也不加,然后把这些变量中间加上&连起来,对于每种为T的情况用||连起来就可以了,如果每种都是F那我们直接输出一个a&!a即可了。
183:Painting the balls 有一列球,一共N个,初始全部为白色的球,然后现在要把一些球染成黑色,然后每个球被染色有一个要求保证任意连续的M个球里面都至少有两个黑球,求最小要花费的费用。
不难想到一个O(N^2M)的DP用F[I,J]表示染得最后两个球为I和J的时候的最小费用。
但是N<=10000 M<=100就跪掉了,我们需要优化,注意到F[I,J]=COST[J]+MIN(F[K,I])
J-m<k<i所以我们发现这是有单调性的,就是这样,现在的f[i,j]要检查的位置比F[I,J+1]多一位,所以现在J从大到小枚举,这样的话每次转移就是O(1)的了,时间复杂度就降为O(NM)了,可以完美解决此题。
184:Patties 给定a,b,c,aa,bb,cc求Max(a Div aa,b Div bb,c Div cc)。
送分题不解释。
185:Two shortest 求一个有向图中从1到N的最短路,询问是非存在两条没有公共边的最短路。
可以先做一遍最短路求出从1到N的最短路,同时得到每个点的dist值,然后如果一条边连得两个点u,v满足dist[u]+cost=dist[v](cost为此边权值),则在图中建一条从u到v的容量为1的边,构建出了一张新的图,求从1到n的最大流,如果最大流大于2则说明原图中存在两条从1到n的无公共边的最短路。
186:The Chain 一个人有N条圆环串成的链子,在一个时间里面他可以干这件事情:从一个链子里面拆下一个圆环然后把两条链子连在一起,问最少几个时间能把所有链子连起来。
每一个长度为l的链子在l个时间可以减小l个链子数,但是同时他自己也没了,所以可以再减小一个链子数,所以越短的链子越好,所以排序后从小到大扫一遍就好了。
187:Twist and whirl -- want to cheat 给出n个数的序列,初始为1到n,进行m次将区间[P,Q]翻转的操作,求最后的序列。
就是个数据结构题,Splay或者链表搞一搞就好了。
188:Factory guard 有N个人在一个1000m的环形跑道上跑步,给出每个人的初始位置和他们跑步的速度与方向(顺时针或逆时针),问每个人在t时间内迎面与多少人碰到几次。
就是小学数学相遇问题,对于每个人计算它们之间的距离,然后求t时间内俩人一共跑了多远再减去他们之间的初始距离算一下圈数即可。
189:Perl-like Substr 题太长没看懂,好像是个纯模拟。
190:Dominoes 给一个N*N的棋盘,开始已经有M个格子被占住了,现在要用1*2的多米诺骨牌把棋盘填满,问是否有解,如果有解输出一种方案。
我们把棋盘按照横纵坐标的和的奇偶黑白二染色,然后我们把每个格子当做一个点,如果一个多米诺骨牌放在棋盘上肯定是覆盖了一个黑点一个白点,我们就把黑点相邻的白点相连,这样我们就得到了一个二分图,求他的最大匹配,然后如果每个黑点和白点都有与之匹配的则有解,输出方案就按照和他匹配的那个点与他的横纵坐标哪个相等比较就可以了。
191:Exhibition 刚开始给定一个字母a或者b,表示有一个A公司或B公司的空位置,如果这个位置装了A公司的商品那就把他表示成A同理定义B。现在有两个操作:a-->B 或a-->Aba 同理定义b的操作,问是否可以通过一些操作得到一个指定序列。
我们发现序列全部是往右增长的,所以我们现在从左向右枚举每个位置是填充还是扩展知道长度与终态相同了,再去判断是否完全相同。
192:RGB 给一些线段,没条线段有RGB三种颜色中的一个,现在求三种颜色投影到X轴的总共长度。如果有多条映射到X轴重叠了,取最靠下的一条。
对于每一条线段暴力求与其他线段所遮盖他的长度,考虑一下相交的情况就可以过了。
193:Chinese Girls‘ Amusement 给定一个N,求一个K,使得(N,K)=1,1≤K<n/2
分情况讨论,如果N为奇数,那么(n,n-1)=1==>(n,(n-1)/2)=1 所以k=(n-1)/2
如果n是偶数,若n/2-1为奇数那(n,n/2-1)=(n/2+1,n/2-1)=(n/2-1,2)=1则k=n/2-1
若n/2-1为偶数那(n,n/2-2)=(n/2+2,n/2-2)=(n/2-2,4)=1则k=n/2-2
194:Reactor Cooling 给定一个无源汇的每条边的流量有上下界的网络图,求他是否存在一个可行流。
直接是周源论文里面说的方法做一遍就可以了。
195:New Year Bonus Grant 给一棵有N个节点的树,问最多可以选出多少个点选出满足下面两个条件:(1)不包含根节点(2)每个点和他的所有儿子中只能选一个。并输出方案。
树形DP,F[I,0]表示子树I选择节点I能够选择的最多点数,F[I,1]表示子树I不选节点I能够选择的最多点数,F[I,0]=1+ΣF[J,1] J为I的孩子,F[I,1]=ΣF[J,1]+Max(F[J,0]-F[J,1]),J为I的孩子。最后根据转移输出方案即可。
196:Matrix Multiplication 给定一张图,用一个临界矩阵来描述这个图,1表示有边,0表示无边,现在求把这个矩阵旋转后与原矩阵相乘后所得矩阵中所有元素的和。
结果好像是个结论,等于所有点的度数的平方的和,至于为什么,我也不知道。
197:Nice Patterns Strike Back 给定一个N*M的矩形棋盘,对每个格子用黑色或白色染色,要求不出现2*2的同色正方形,求方案数模P的结果。N<=10^100,M<=5
观察到M非常小,考虑状态压缩DP,F[I,J]表示前I行第I行状态为J的时候的方案数。
可以知道F[I,J]=ΣF[I-1,K](J和K相容),用位运算判断J和K是否相容。
但是N太大了,我们考虑用矩阵倍增加速,构造一个2^m*2^m的矩阵,预先处理出来状态相容的状态在矩阵中,然后倍增即可。
198:Get Out!一个船长被困在了一堆岛屿中,每个岛屿都是圆形的,给出每个岛屿中心的坐标和他的半径,船长是一个园,给出位置和半径,求他能不能从岛屿中逃出去,船队可以与岛屿相切,但是不能相交。
把船长缩成一个点,所有岛的半径加上船长的半径,用圆心距和半径判断两岛间关系,如果相交了则连一条边,如果船长在一个环里面救被困住了,现在找出每个环然后判断这个点是否在某个环里面即可。
199:Beautiful People 给出N个人,每个人有力量值和美丽值,如果A和B两个人比较A两方面全胜或全输那A和B不会发生矛盾,否则俩人会有矛盾,求最多可以邀请几个人。
可以先按照力量值排个序,力量相等的话美丽值降序排列(否则会出现力量相等美丽值后面的人比前面的人大的时候答案会加1,但本来不应该加的),然后求美丽值里面的最长不下降子序列即可,用O(NLOGN)的方法,否则会T。输出答案就用转移路径搞一搞就好了。
sgu100~199题解