在x轴上提供N个路由器,并且希望彼此通信。如果一个路由器之间的距离小于或等于K,则可以向另一个路由器发送消息。
给出P对路由器,它们想要发送消息。我们需要告诉" Y"或" N"这对之间的天气数据传输是否可能。
注意:X轴上的同一个点上可以有多个路由器。
约束:
1 ≤ N, P ≤ 10^5
0 ≤ Ai, K ≤ 10^9
1 ≤ A, B ≤ N
所以我想为每个查询提供一个非常有效的算法。
如果我们有5个路由器,K = 3和2个查询如下:
路由器的位置:= 0 3 8 5 12
查询1:1 2
这里的回答是" Y"因为两者都在彼此的范围内
查询2:1 3
这里的回答是" Y"因为两者都在彼此的范围内 对于对(1,3),路由器1可以向路由器2发送消息,路由器2可以将其发送到路由器4,并且可以将其发送到路由器3.
答案 0 :(得分:0)
首先映射路由器位置/距离:
List<int> Routers=new List<int>();
Routers.Add(0);
//....
Routers.Add(12);
创建配对:
class Pairs
{
int[2] Pair;
}
List<Pair> Pairings=new List<Pair>();
Pairings.Add({Routers.IndexOf(0),Routers.IndexOf(1)});
Pairings.Add({Routers.IndexOf(0),Routers.IndexOf(2)});
创建检查方法:
private bool CanCommunicate(intx i1,inti2)
{
if (Math.Abs(i1-i2)<=K
return true;
else
return false;
}
实施alg:
foreach (Pair p in Pairings)
{
if(CanCommunicate(p[0],p[1])
return "Y";;
else
return "N";
}
代码位于C#
答案 1 :(得分:0)
路由器在x轴上,因此如果它们之间的差异小于边界,则两个路由器可以直接通话;如果在x轴上它们之间的路径上的路由器之间没有间隙,则两个路由器可以间接通话很大,消息无法通过。
因此,按照x轴上升位置的顺序对路由器进行排序,然后按升序x的顺序对它们进行排序,并将它们分解为不包含太大间隙的路由器。对运行进行编号,然后两个路由器可以进行通信,当且仅当它们都在相同的数字运行中时才会进行通信。
答案 2 :(得分:0)
鉴于间接通信,我首先要找到间隙,沿着x轴的位置,两个相邻路由器之间的间隔太大,无法进行通信。
对于每个路由器,记录下一个间隙的位置。将线的末端视为间隙。
当且仅当两个路由器共享相同的下一个间隙时,它们才能进行通信。
=============================================== =============================
Sort the list of routers in ascending x co-ordinate order
Initialize integer groupIndex to 0.
For each router in x co-ordinate order:
Mark it with the current groupIndex
If there is a next router and it is more than distance K away, increment groupIndex
Two routers can communicate if, and only if, they are marked with the same groupIndex.