Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C “提高效率”;灯塔“;_C_Algorithm_Data Structures - Fatal编程技术网

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