您的位置:首页 > 其它

Cf 95 Div.2

2012-03-11 22:13 169 查看
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.

For the horizontal case, we determine the leftmost and rightmost queen on each row in O(n+m). The vertical and diagonal cases are similar. Then, we can compute the number of attacked queens for each queen in O(m) by simply checking whether it is the leftmost,
rightmost, etc. in it's row/column/diagonals.

F题

这题我想了很久很久,最后还是看题解的。

我没想到 会是 枚举两两行O(n*n),然后是统计确定的两行之间的情况数,而且预处理 + 统计方式我觉得很神奇,自己缺乏这点思维,这题思路值得借鉴!

加油!!!

明天是3月12日
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: