sanskar srivastava Ответов: 1

Проблема решена, но шеф-повар код нужно оптимизировать благодаря БА .


Шеф-повар имеет N параллельных осям прямоугольников в 2D декартовой системе координат. Эти прямоугольники могут пересекаться, но гарантируется, что все их 4N вершин попарно различны.

К сожалению, шеф-повар потерял одну вершину, и до сих пор ни одно из его исправлений не сработало (хотя поместить изображение точки на пакет молока, возможно, было не самой лучшей идеей в конце концов...). Поэтому он дал вам задание найти его! Вам дается оставшееся 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 (20 баллов):

T=5
N≤20
Подзадача №2 (30 баллов): |x|,|y|≤105
Подзадача № 3 (50 баллов): исходные ограничения

Пример Ввода
1
2
1 1
1 2
4 6
2 1
9 6
9 3
4 3
Пример Вывода
2 2
Объяснение
Исходный набор точек таков:
рис. 1

При добавлении недостающей точки (2,2) можно сформировать N=2 прямоугольника:
рис. 1

Что я уже пробовал:

#include <iostream>
using namespace std;
void quicksort(long int number[],long int n)
{
    int i,j,a;
       for (i = 0; i < n; ++i) 
        {
 
            for (j = i + 1; j < n; ++j)
            {
 
                if (number[i] > number[j]) 
                {
 
                    a =  number[i];
                    number[i] = number[j];
                    number[j] = a;
 
                }
 
            }
    }
}
int main(void) {
	// your code goes here
	long int n,i,j,k,rx,ry;
	cin>>n;
	for(i=0;i<n;i++)
	{
	    cin>>k;
	    long int x[4*k-1],y[4*k-1];
	    for(j=0;j<4*k-1;j++)
	    {
	        cin>>x[j]>>y[j];
	    }
	    quicksort(x,4*k-1);
	    quicksort(y,4*k-1);
	    int flagx=0,flagy=0;
	    for(j=0;j<4*k-1;j=j+2)
	    {
	        if(!flagx||!flagy)
	        {
	            if(!flagx)
	            {
            if(x[j]!=x[j+1])
            {
                rx=x[j];
                flagx=1;
            }}
             if(!flagy)
            {
            if(y[j]!=y[j+1])
            {
                ry=y[j];
                flagy=1;
            }}
            }
             else
            {break;}
	        }
	    	cout<<rx<<" "<<ry<<endl;
	}
	return 0;
}

Richard MacCutchan

В чем же вопрос?

OriginalGriff

- Ты можешь написать ее для меня?"
Просто предположение ...

Richard MacCutchan

Вероятнее всего.

sanskar srivastava

добавлена ссылка на вопрос идите и проверьте пожалуйста

Richard MacCutchan

Это не вопрос.

sanskar srivastava

вы можете посетить и проверить ссылку, пожалуйста, она находится внизу.

Richard MacCutchan

У меня нет намерения посещать какие-либо ссылки. Если вы хотите помочь с вашей проблемой, то, пожалуйста, используйте Улучшить вопрос ссылка выше, и добавить полную информацию.

sanskar srivastava

хорошо, весь вопрос здесь с образцом ввода-вывода

Patrice T

Ваш код был поврежден при копировании.

sanskar srivastava

спасибо за помощь.

Rick York

Одна рекомендация : научитесь считывать данные из файла, чтобы вам не приходилось каждый раз вводить их вручную. Это даст вам гораздо больше времени для отладки кода и обеспечения его правильной работы.

1 Ответов

Рейтинг:
0

Patrice T

Цитата:
Проблема решена, но шеф-повар код нужно оптимизировать благодаря БА .

Как обычно, проблемы CodeChef-это проблемы, это означает, что простые программы никогда не являются решением.
Если N-это 200000 прямоугольников, то получается 799999 точек.
Ваш код соответствует точкам, как 79.9999*79.9999=639.998.400.001 проверок для x и столько же для y.
Ваш код находится в O(n2).
Ключ находится внутри данные структуры и Алгоритмы Некоторые структуры данных и алгоритмы позволяют получить быстрее, но изучение их-это изучение жизни, всегда есть что-то интересное, чтобы узнать.

Пример простой оптимизации, но боюсь, что этого недостаточно :
Разделив поиск на 4: для любого x[j], совпадающего с x[i], поменяйте местами (x[j+1], x[i]) и не ищите x[j+1]. Своп делает так, что любой предыдущий x[j] сопоставляется с x[j+1], поэтому нет необходимости искать x[j+1], делить на 2. Это означает, что для любого x[j] нет никакого поиска для любого x[i] для 0 <= i <= j, снова разделите на 2.
-----
Совет: Научитесь правильно делать отступы в вашем коде, это покажет его структуру и поможет чтению и пониманию. Это также помогает выявлять структурные ошибки.
#include <iostream>
using namespace std;
void quicksort(long int number[],long int n)
{
    int i,j,a;
    for (i = 0; i < n; ++i)
    {

        for (j = i + 1; j < n; ++j)
        {

            if (number[i] > number[j])
            {

                a =  number[i];
                number[i] = number[j];
                number[j] = a;

            }

        }
    }
}
int main(void) {
    // your code goes here
    long int n,i,j,k,rx,ry;
    cin>>n;
    for(i=0;i<n;i++)
    {
        cin>>k;
        long int x[4*k-1],y[4*k-1];
        for(j=0;j<4*k-1;j++)
        {
            cin>>x[j]>>y[j];
        }
        quicksort(x,4*k-1);
        quicksort(y,4*k-1);
        int flagx=0,flagy=0;
        for(j=0;j<4*k-1;j=j+2)
        {
            if(!flagx||!flagy)
            {
                if(!flagx)
                {
                    if(x[j]!=x[j+1])
                    {
                        rx=x[j];
                        flagx=1;
                    }
                }
                if(!flagy)
                {
                    if(y[j]!=y[j+1])
                    {
                        ry=y[j];
                        flagy=1;
                    }
                }
            }
            else
            {
                break;
            }
        }
        cout<<rx<<" "<<ry<<endl;
    }
    return 0;
}

Стиль отступа - Википедия[^]

Профессиональные редакторы программистов имеют эту функцию и другие, такие как сопоставление скобок и подсветка синтаксиса.
Блокнот++ Главная Страница[^]
личные[^]
-----
[Обновление]
Я боюсь, что ваша процедура быстрой сортировки-это не алгоритм быстрой сортировки, а скорее пузырьковая сортировка.
Ваш первый код был O(n2)
Ваш новый код-O(N2/2)
Изменения, которые я предложил, являются O(N2/4)
Использование сбалансированного двоичного дерева может привести к чему-то вроде O(N*log(N))
Самобалансирующееся двоичное дерево поиска - Википедия[^]
Красно–черное дерево - Википедия[^]