秦皇岛集训,ACM比赛第三场

前话

      lls:zxr你很过分,好几天都不更博客了,你又偷懒了。。。

      zxr:没有啊,这几天很忙,忙不过来就这样了。

      lls:那你打好知识框架,回去再慢慢填啊!

      zxr:好的好的。

      (自动忽略)

正题

      好不容易放假一天,所以把前面的东西补一补。

      第二天的知识是计算几何。

      关于计算几何我就听懂下面几个知识,懂的大神不要来D我。

      关于平面直角坐标中的两条线段,(1x1,1y1,1x2,1y2),(2x1,2y1,2x2,2y2).每条线段分别用2个点进行表示,意思是A和B都是这条线段的端点(我的数学水平也只能这样解释了)。然后当他们其中有一个点相同时,我们就可以判断两条线段之间的关系,比如线段1在线段2的顺时针方向还是逆时针方向。

      这时,我们就要知道一个东西,叫做叉积,叉积op(线段1,线段2)=1y1*2y2-1y2*2y1(顺序不能颠倒,而且要保证AB的x端点重合)。然后我们用这个东西可以做很多事情,像凸包,还有很多很多,但是我不会,以后要刷题积累学习。

      到了下午,又是激动人心的比赛了。

比赛

      到了这,给大家讲讲我赛场上A的和补过的题吧。

      第一题:给出n个点的数,要你求每个点所在的联通块的个数。

      这道题就是树上构造Dp。

      我们当然会求每个点在子树内的联通块的个数。(直接f [ i ] = pai(f[ j ] + 1) ( j is i's son))

      这时候如果要求整棵树,那么问题就出现在我们怎么统计将x提成根时,非子树边的乘积。

      我们构造一个d[i]表示非子树边的联通块个数,然后继承的时候,d[i]=(d[fa[i]]+1)*pai(f[j]+1)(j is fa[i]'son && j!=i)

      然后一个节点,知道了d[i]和f[i],我们就可以知道一个点的答案是d[i]*f[i].

      期望复杂度(n);

      第二题:n件商品,你有m个购物车。n个商品中有些是凳子。如果某个购物车有凳子,那么你就可以将该购物车最贵的商品半价购买。

       这题很简单,直接从大到小排一遍序,那能半价的就是min(tot凳子总个数,m);

      第三题:给出n个点的树,求把他分成m个联通块,可颠倒顺序,求方案总数。

      公式ans=C(n-1,m-1)*sum[m];(sum为前缀和)

      第四题:判定二分图,还是存在奇环。

       二分图dfs,奇环你就先把每个边双联通分量求出来,在一个一个找,每次标记一个depth,假如u是v的祖先(不是父亲),而且v到u有一条边,那么就说明成环了。再用dep[v]-dep[u]+1来判断是否为奇环即可。

       暂时只会那么多,之后会学更多算法来解决问题。

      lls:我很满意。。

猜你喜欢

转载自blog.csdn.net/Deep_Kevin/article/details/81459597