Cf 95 Div.2

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日

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值