C “提高效率”;灯塔“;
问题描述: 海里有许多灯塔。海洋的范围是C “提高效率”;灯塔“;,c,algorithm,data-structures,C,Algorithm,Data Structures,问题描述: 海里有许多灯塔。海洋的范围是[1,10^7]×[1,10^7] 每个灯塔都可以照亮西南和东北地区。光的能量足以覆盖任何距离 如果光源A和B在照明区域,表示它们可以相互照明 输入有n+1行: 第一行是灯塔的编号。 第二条线到第n条线是灯箱的水平和垂直坐标 输出有一行: 一对可以相互照明的灯罩 例如: 输入: 3 2 2 4 3 5 1 输出: 1 注: 灯箱的坐标为int。所有灯箱的水平和垂直坐标都不同 1 ≤ x, y ≤ 10^7 我的代码效率很低。请帮我修改代码。多谢各位
[1,10^7]×[1,10^7]
每个灯塔都可以照亮西南和东北地区。光的能量足以覆盖任何距离
如果光源A和B在照明区域,表示它们可以相互照明
输入有n+1行:
第一行是灯塔的编号。
第二条线到第n条线是灯箱的水平和垂直坐标
输出有一行:
一对可以相互照明的灯罩
例如:
输入:
3
2 2
4 3
5 1
输出:
1
注:
灯箱的坐标为int。所有灯箱的水平和垂直坐标都不同
1 ≤ x, y ≤ 10^7
我的代码效率很低。请帮我修改代码。多谢各位
这是我的密码
#include<stdlib.h>
int main()
{
int n,i,j,s;
int *x,*y;
scanf("%d",&n);
x=(int *)malloc(n*sizeof(int));
y=(int *)malloc(n*sizeof(int));
for(i=0;i<n;i++)
{
scanf("%d %d",&x[i],&y[i]);
}
s=0;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
{
if((x[i]>x[j]&&y[i]>y[j])||(x[i]<x[j]&&y[i]<y[j]))
s++;
}
printf("%d\n",s);
free(x);
free(y);
return 0;
}
#包括
int main()
{
int n,i,j,s;
int*x,*y;
scanf(“%d”和“&n”);
x=(int*)malloc(n*sizeof(int));
y=(int*)malloc(n*sizeof(int));
对于(i=0;i我没有足够的声誉来直接发表评论,所以我会详细说明并在这里留下答案
您的算法使用嵌套循环进行成对计算,并且时间复杂度为O(n2),这就是为什么您的算法对于大输入(这里的大不是指坐标值,而是指灯罩的数量)比较慢的原因。首先,让我们看看我们可以做些什么来优化,使用一个示例输入:
3
11(Pa)
22(Pb)
33(Pc)
使用您的算法,执行逻辑将是:
计数=0
Pa和Pb是一对吗?是的,伯爵++
Pa和Pc是一对吗?是的,伯爵++
Pb和Pc是一对吗?是的,计数++
输出计数
实际上,存在可以消除的冗余计算:
确定新添加的光源是否可以由现有光源照亮。
请注意,Pa的NE区域实际上包含Pb的NE区域,因此,如果一个新的灯塔落入Pb的NE区域,这意味着它由Pa和Pb照明。因此,如果我们在海里有Pa和Pb,并添加Pc,我们实际上不需要分别使用Pa和Pb计算两次
假设我们有以下记录,记录灯箱的照明交叉区域:
a.count=0;R={}
b.添加Pa,R={[(-∞,-∞),(1,1)]->[Pa],(1,1)(∞,∞)]->[Pa]}([(-∞,-∞),(1,1)]和[(1,1](∞,∞)] 用对角线点定义两个矩形区域)
c.添加Pb,Pb在[(1,1]中(∞,∞)] (这意味着[Pa]可以照亮Pb),找到[Pa]中所有可以被Pb照亮的灯箱,即Pa,计数+=1,R={[(-∞,-∞),(1,1)]->[Pa,Pb][(-∞,1) ,(1,2)]->[Pb],(1-∞),(2,1)]->[Pb],(1,1),(2,2)]->[Pa,Pb],(1,2),(2,∞)]->[Pb],(2,1)(∞,2) ]->[Pb],(2,2)(∞,∞)]->[Pa,Pb]}
d.添加Pc,Pc位于[(2,2)(∞,∞)], 在[Pa,Pb]中找到所有可以被[Pa,Pb]照亮的灯塔,即Pa,Pb,count+=2,更新R(太长了,所以我在这里省略它)
您可能希望表示R的一个数据结构是段树。这里适用的段树是二维的。我建议您看看现有的post like,并尝试实现您自己的
您是否遵循xuetangX上的数据结构?或者您在其他地方遇到了这个灯塔问题?如果是,标签上有一个特别的提示视频第零章是的,这是xuetangX上的问题。我无法解决它。只需查看视频,类似于你的O(nlogn)
的东西比你的O(n^2)
两个灯塔(x1,y1)和(x2,y2)可以互相照亮,如果并且只有一个灯塔,比如说(x2,y2),满足x1