A题
for循环判断从第2个字符开始是否全部是大写字母即可,注意如果字符串只有1个字符的情况;
B题
-10到10,只需要每个数都加上10,那么开一个20大小的数组,记录每个数的出现次数 f [ ],然后 sum= sigma ( f [ i ] * f [ 20-i ] ) | i<10 ,
另外 f [ 10 ] 表示0的个数,即C( f[10], 2 );
C题
注意不能多算,我是枚举男孩的数目 , i=4开始枚举,那么女孩数目就是 t-i,然后用预处理的组合数直接带入计算;注意很多边界情况,比如枚举的i要 i<=n, t-i>=1 && t-i<=m; 这些我都在预处理组合数的时候处理出来了; 开始我错了一次,是由于组合数的预处理没有处理好;
D题
我用了图论里面的 双连通分量 来缩点;
缩点后开始我一直错误,原来是没有考虑全部的图形,属于环的每个点都可能引出非本身分量的边,点;
我觉得一个合理方便的写法是:
for(i=1;i<=n;++I){
if( node i belong the cycle ){
dis [ i ] = 0;
dfs( i );
}
}
dfs()中,注意如果邻接点是属于cycle的,则不可访问;
E题
我的做法我觉得还是很巧的,先给出一个表;
(1,1) (1,2) (1,3) (1,4) (1,5) (1,6)
(2,1) (2,2) (2,3) (2,4) (2,5) (2,6)
(3,1) (3,2) (3,3) (3,4) (3,5) (3,6)
...
一个结构体保存点坐标及输入标号; 对该结构体排序,以x为第一关键字,以y为第二关键字;这样我就可以扫描,得到水平方向的情况;
再以y为第一关键字,以x为第二关键字,扫描可以得到竖直方向的情况;
斜向右上方方向,观察坐标数值,我以 (x+y)为第一关键字,以x为第二关键字,这样可以得到该方向的情况;
斜向右下方,我当时的做法是 进行 坐标变换 方便以 (x+y)为第一关键字, y为第二关键字,这样可以得到该方向的情况;
(6,1) (6,2) (6,3) (6,4) (6,5) (6,6)
(5,1) (5,2) (5,3) (5,4) (5,5) (5,6)
(4,1) (4,2) (4,3) (4,4) (4,5) (4,6)
....
后来学弟发现不需要变换,直接按 x-y作为第一关键字即可,确实啊;
自己突然领悟到不管你如何按你的方式改变坐标,只要维持点本身的相对位置不变就可以;
后来我看解题报告的时候发现居然有O(m)的做法,确实很神!
Problem E can be done in O(n+m) -- i.e. O(m) when m is at least on the order of n.
F题
这题我想了很久很久,最后还是看题解的。
我没想到 会是 枚举两两行O(n*n),然后是统计确定的两行之间的情况数,而且预处理 + 统计方式我觉得很神奇,自己缺乏这点思维,这题思路值得借鉴!
加油!!!
明天是3月12日