找到矩形的丢失坐标

问题描述

Chef在2D直角坐标系中具有N个轴平行的矩形。这些矩形可以相交,但是可以保证它们的所有4N个顶点都是成对的。

不幸的是,Chef丢失了一个顶点,到现在为止,他的修复方法都没有起作用(尽管在牛奶纸箱上放置一个点的图像可能并不是最好的主意……)。因此,他给了您找到它的任务!给您剩余的4N-1点,您应该找到缺失的点。

输入 输入的第一行包含一个整数T,表示测试用例的数量。 T测试用例的描述如下。 每个测试用例的第一行包含一个整数N。 然后,跟随4N-1线。这些线中的每条线都包含两个以空格分隔的整数x和y,它们表示某个矩形的顶点(x,y)。 输出量 对于每个测试用例,打印一行包含两个以空格分隔的整数X和Y的行-缺失点的坐标。可以证明缺失点可以唯一确定。

约束 T≤100 1≤N≤2⋅105 | x |,| y |≤109 所有测试用例的N之和不超过2⋅105 输入示例 1个 2 1 1 1 2 4 6 2 1 9 6 9 3 4 3 示例输出 2 2

问题链接https://www.codechef.com/problems/PTMSSNG

我的方法:我为x和y坐标创建了一个频率数组,然后计算了即将出现奇数的点。的时间。

    #include <iostream>
using namespace std;

int main() {
    // your code goes here
    int t;
    cin>>t;
    while(t--)
    {
        long int n;
        cin>>n;
        long long int a[4*n-1][2];
        long long int xm,ym,x,y;
        for(int i=0;i<4*n-1;i++)
        {
            cin>>a[i][0]>>a[i][1];
            if(i==0)
            {
                xm=abs(a[i][0]);
                ym=abs(a[i][1]);
            }
            if(i>0)
            {
                if(abs(a[i][0])>xm)
                {
                    xm=abs(a[i][0]);
                }
                if(abs(a[i][1])>ym)
                {
                    ym=abs(a[i][1]);
                }
            }
        }
        long long int frqx[xm+1],frqy[ym+1];
        for(long long int i=0;i<xm+1;i++)
        {
            frqx[i]=0;
        }
        for(long long int j=0;j<ym+1;j++)
        {
            frqy[j]=0;
        }
        for(long long int i=0;i<4*n-1;i++)
        {
            frqx[a[i][0]]+=1;
            frqy[a[i][1]]+=1;
        }
        for(long long int i=0;i<xm+1;i++)
        {
            if(frqx[i]>0 && frqx[i]%2>0)
            {
                x=i;
                break;
            }
        }
        for(long long int j=0;j<ym+1;j++)
        {
            if(frqy[j]>0 && frqy[j]%2>0)
            {
                y=j;
                break;
            }
        }
        cout<<x<<" "<<y<<"\n";
    }
    return 0;
}

我的代码显示输入的TLE

解决方法

首先,您的解决方案无法正确处理负x / y。 long long int frqx[xm+1],frqy[ym+1]分配的内存几乎不足以容纳正值,但不足以容纳负值。

尽管如此,这并不重要,因为只要保证abs(x) <= 109,您就可以静态分配219元素的向量,并在其中映射正坐标和负坐标。


第二,您不应将输入缓冲在a中。这不仅会 溢出堆栈 ,而且完全没有必要。立即写入频率段,请勿缓冲。

大多数挑战都是一样的。不要缓冲,请始终尝试直接处理输入。


关于水桶,您不需要long long int。每个存储桶bool就足够了。您甚至不关心将多少个坐标排序到存储桶中,仅关心到目前为止的数目是否为偶数。您可以通过在处理输入时简单地切换标志来替换您实现为单独循环的内容。

,

对于错误,我发现@ Ext3h的答案足够

解决方案,使您得出问题的奇偶质量, 可以更直接地完成。

您需要找到出现奇数次的x和y。

在Java中

int[] missingPoint(int[][] a) {
    //int n = (a.length + 1) / 4;

    int[] pt = new int[2]; // In C initialize with 0.
    for (int i = 0; i < a.length; ++i) {
        for (int j = 0; j < 2; ++j) {
            pt[j] ^= a[i][j];
        }
    }
    return pt; 
}

这使用了互斥或自反的^,它们相互关联且自反0 ^ x = x,x ^ x = 0。 (5 ^ 7 ^ 4 ^ 7 ^ 5 = 4。) 对于这些“搜索奇数”,可以使用此异或。

实际上,您不需要将输入保留在数组中。