• 一场训练赛


    未解决的题

      

    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

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

  • 相关阅读:
    javascript内存泄漏
    闭包
    JavaScript 数组(Array)对象
    什么是跨域?跨域请求资源的方法有哪些?
    理解闭包
    比较typeof与instanceof
    js 字符串操作函数
    js去除字符串空格
    Thematic002.字符串专题
    Thematic001.数论专题
  • 原文地址:https://www.cnblogs.com/yefeng1627/p/3001654.html
Copyright © 2020-2023  润新知