未解决的题
并查集 + 树状数组。
如果不考虑抽出书本的操作,这是一道相对简单的并查集题目,只需给每本书再开一个域,记录其上有多少本书即可。我们发现,当书堆起来的时候,可以按照从上到下的顺序给每本书重新编号, 如果抽出一本书,则可以在这本书的新编号上标记-1,表示删除。如果要统计书本i(设书本i的新编号为y)上有多少本书,则可以把它最上面的那本书的新编号x找出来,数x到y之间有多少本书被删掉,然后就能得解。从这时候想到了什么? 树状数组!所以,我们先把所有操作存起来,然后进行一次堆书的操作,这时候不考虑抽出书,根据最后的书在各自书堆的顺序,给一个新编号。最后,重新进行一次堆书操作,这时候就能利用新编号对书本进行删除操作了,用树状数组快速统计。
时间复杂度:O(并查集) + O(mlongn)
计算几何(叉积的应用)
叉积相关知识:
叉积:P(x1,y1),Q(x2,y2) P*Q=x1y2-x2y1
若P×Q>0,则P在Q的顺时针方向;
若P×Q<0,则P在Q的逆时针方向;
若P×Q=0,则P和Q共线,但可能同向也可能反向;
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,
如果b在ac之间,输出 toward
如果是c在 ab之间或者a在cb之间,则为backward。
这部分需要判断一个点是否在线段上。