【问题标题】:Fitting a segment in a two-dimensional plane在二维平面中拟合线段
【发布时间】:2023-03-08 13:50:01
【问题描述】:

我遇到了以下问题

给定N x S个网格和m个平行于横轴的线段(它们都是元组(x', x'', y)),回答 Q 形式的在线查询 (x', x'')。这种查询的答案是最小的y(如果有的话),这样我们就可以放置一个段(x',x'',y)。所有段都不重叠,但一个段的开始可以是另一个段的结束,即允许段 (x', x'', y) 和 (x'', x''', y)。能够放置分段意味着可能存在不违反规定规则的分段(x',x'',y),实际上并未放置分段(未修改具有初始分段的板)但我们仅声明可能有一个。

约束

1 ≤ Q, S, m ≤ 10^5
1 ≤ N ≤ 10^9

Time: 1s
Memory: 256 Mb

这是来自以下链接的示例。输入段为 (2, 5, 1), (1, 2, 2), (4, 5, 2), (2, 3, 3), (3, 4, 3)。
回答问题

1) (1, 2) → 1

2) (2, 3) → 2

3) (3, 4) → 2

4) (4, 5) → 3

5) (1, 3) → 不能放置段

第三个查询的可视化答案(蓝色部分):

我不太明白如何解决这个问题。应该是用持久段树来解决的,但是我还是想不出来。

请你帮帮我。

这不是我的作业。源问题可以在这里找到http://informatics.mccme.ru/mod/statements/view3.php?chapterid=111614。没有可用的英文版本的语句,并且测试用例以不同的方式呈现输入数据,所以不要介意源代码。

【问题讨论】:

  • 我不明白为什么查询 (2, 3) 的答案是 2?段(2、3、2)可以放在哪里?
  • @yacc 由于一个段的开头可以是另一个段的结尾,所以段 (2, 3, 2) 没有问题,它会“扩展”段 (1, 2, 2) ,使它们看起来像一个单独的段(1、3、2)(认为段只是假设的,因为初始板没有改变)
  • 也许你加个小图来说明一个例子?
  • 问题陈述说查询是在线的 - 查看公式 a  =  x_i  + p , b  =  y_i  +  p ,以及 p 如何更新。如果我们事先得到所有查询,问题就容易多了。

标签: algorithm data-structures segment-tree persistent-data


【解决方案1】:

这是一个 O(N log N) 时间的解。

预备(一个很好的教程可用here):段树,持久段树。

第 0 部分。原始问题陈述

我将简要描述最初的问题陈述,因为稍后我将用它的术语而不是抽象的片段来说话。

有一列有 S 个座位的火车 (S

在整个文本中,我用 N 表示座位数、乘客数和查询数,假设它们的数量级相同。如果需要,您可以进行更准确的分析。

第 1 部分。回答单个查询

让我们回答一个查询 [L, R],假设在时间 R 之后没有被占用的位置。对于每个座位,我们维护它最后被占用的时间。最后叫它(S)。现在查询的答案是最小 S 使得 last(S)

但是,仅仅获得接受可能还不够。我们需要 O(log N)。回想一下,段树的每个节点都在相应的范围内存储最小值。我们从根开始。如果最小值 >= L,则此类查询没有可用座位。否则,左孩子或右孩子的最小值 的最小座位

第 2 部分。解决问题

我们在席位上维护一个持久树,为每个席位存储最后一个(S)(与上一部分相同)。让我们按照他们的左端点以升序逐个处理初始乘客。对于乘客 (s_i, l_i, r_i),我们用值 r_i 更新位置 s_i 的分段树。树是持久的,因此我们将新副本存储在某个地方。

要回答查询 [L, R],请找到最新版本的段树,以使更新发生在 R 之前。如果对版本进行二进制搜索,则需要 O(log N) 时间。

在分段树的版本中,仅考虑左端点

【讨论】:

    【解决方案2】:

    声明:

    输入:list<x',x'',Y>

    查询输入:(X',X'')

    输出:Ymin

    约束:

    1 ≤ Q, S, m ≤ 10^5
    1 ≤ N ≤ 10^9
    
    Time: 1s
    Memory: 256 Mb
    

    答案:

    你可以使用的数据结构方法:

    1.蛮力:直接遍历列表并执行检查。


    2。排序 :按Y [从最低到最高] 对列表进行排序,然后对其进行迭代。

    注意:对大列表进行排序会很耗时。

    Sort on Y
    Ymin = -1                                            //Maintain Ymin
    for i[0 : len(input)] :                              //Iterate through tuples
        if Ymin != -1 && Y(i-1) != Yi : return Ymin      // end case
        else if x' > X'' : Ymin = Yi                     //its on right of query tuple
        else if x'<X' && (x' + length <= X') : Ymin = Yi //on left of query tuple
        else next
    

    3。 Hashmap :Map&lt;Y, list&lt; tuple&lt;x',length&gt; &gt; &gt; 存储每个Y 的行列表,并遍历它们以获得最少的Y

    注意:地图构建需要额外的时间。

    Iterate through list and build a Map 
    Iterate through Map keys :
        Iterate through list of tuples, for each tuple :
            if x' > X'': Continue                            //its on right of query tuple
            else if x'<X' && (x' + length <= X') :  return Y //on left of query tuple
                else next Y
    

    4.矩阵:你可以建立一个矩阵,1代表被占点,0代表空点。

    注意:构建矩阵需要额外的时间,并且通过矩阵进行迭代非常耗时,因此没有用处。

    例子:

        0 1 1 1 0 0 
        1 1 0 1 0 0
        0 1 1 1 1 0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-11
      • 2019-10-18
      • 1970-01-01
      • 2017-03-13
      相关资源
      最近更新 更多