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日
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日
相关文章推荐
- Cf 98 Div.2
- cf#179(div.2)
- cf_#230(Div.2)_pa
- cf 267 div.2 D Fedor and Essay
- CF_#324(Div.2)
- 【CF】196 Div.2 D. Book of Evil
- CF 335 div.1-B/div.2-D/605 B Lazy Student
- Cf 99 Div.2
- CF 192 DIV.2
- CF 334 div.2-C/div.1-A/603A Alternative Thinking
- cf 156 div.2 D. Mr. Bender and Square
- Cf 97 Div.2
- CF 192 DIV.2
- CF_318_Div.2 Bear and Elections(二分||暴力枚举)
- cf Round #202 (div.2) C ------------ Mafia
- [CF#250 Div.2 D]The Child and Zoo(并查集)
- Cf 103 div.2
- CF round#420 div.2 E Okabe and El Psy Kongroo【矩阵快速幂】
- CF round#439 div.2 C The Intriguing Obsession【DP】
- CF-448(Div.2)-A. Pizza Separation