一场训练赛

 

未解决的题

  

F.Arrange Books

并查集 + 树状数组。

如果不考虑抽出书本的操作,这是一道相对简单的并查集题目,只需给每本书再开一个域,记录其上有多少本书即可。我们发现,当书堆起来的时候,可以按照从上到下的顺序给每本书重新编号, 如果抽出一本书,则可以在这本书的新编号上标记-1,表示删除。如果要统计书本i(设书本i的新编号为y)上有多少本书,则可以把它最上面的那本书的新编号x找出来,数xy之间有多少本书被删掉,然后就能得解。从这时候想到了什么? 树状数组!所以,我们先把所有操作存起来,然后进行一次堆书的操作,这时候不考虑抽出书,根据最后的书在各自书堆的顺序,给一个新编号。最后,重新进行一次堆书操作,这时候就能利用新编号对书本进行删除操作了,用树状数组快速统计。

时间复杂度:O(并查集) + O(mlongn)

 

H.Finding the Way

计算几何(叉积的应用)

 叉积相关知识:

叉积:P(x1,y1),Q(x2,y2) P*Q=x1y2-x2y1

P×Q>0,则PQ的顺时针方向;

P×Q<0,则PQ的逆时针方向;

P×Q=0,则PQ共线,但可能同向也可能反向;

 int cross(Point p0,Point p1,Point p2){

    return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);

}

 本题的思路:

1.如果p[i]p[i-1]是一个点,输出stand

2。如果cross(p[i],p[i-1],p[i-2])>0,则是right

3.如果cross(p[i],p[i-1],p[i-2])<0,则是left

4.如果cross(p[i],p[i-1],p[i-2])==0则共线,然后需要再判断一下是向前还是向后。

对于按顺序访问的点 a->b->c

如果bac之间,输出 toward

如果是c ab之间或者acb之间,则为backward

这部分需要判断一个点是否在线段上。

posted @ 2013-04-05 22:11  yefeng1627  阅读(182)  评论(0编辑  收藏  举报

Launch CodeCogs Equation Editor