Школа179: Разбор задачи B

https://server.179.ru/wiki     редакция: 20.08.2016 19:00:47
Информатика/Олимпиады/2008/Школьная/Разбор/B
Условия задачи второго тура

// В данных переменных будем хранить исходные данные
// Первый прямоугольник: (x1,y1):(x2,y2)
// Второй прямоугольник: (x3,y3):(x4,y4)
int x1,y1,x2,y2,x3,y3,x4,y4;
cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3 >> x4 >> y4;

// Для каждого прямоугольника сделаем "каноническое" представление
// Первый прямоугольник: (X1,Y1):(X2,Y2), причем
// (X1,Y1) – его левый нижний угол, а (X2:Y2) – правый верхний угол.
int X1, Y1, X2, Y2, X3, Y3, X4, Y4;

// Тогда x-координата левого нижнего угла это min из x-координат двух его углов,
X1=min(x1,x2);
// x-координата правого верхнего угла – это max из x-координат двух его углов
X2=max(x1,x2);
// Аналогично находим Y1 и Y2
Y1=min(y1,y2);
Y2=max(y1,y2);

// Аналогично зададим канонические координаты для второго прямоугольника
X3=min(x3,x4);
X4=max(x3,x4);
Y3=min(y3,y4);
Y4=max(y3,y4);

// Введем переменные для хранения координат пересечения двух прямоугольников
// left – левая граница пересечения, это max из левых границ исходных прямоугольников
int left=max(X1,X3);
// right – правая граница пересечения, это min из правых границ исходных прямоугольников
int right=min(X2,X4);
// bottom – нижняя граница пересечения
int bottom=max(Y1,Y3);
// top – верхняя граница пересечения
int top=min(Y2,Y4);

// Пересечение непусто, если правая его граница больше левой,
// а верхняя граница больше нижней.
// В этом случае площадь пересечения равна (right-left)*(top-bottom)
// В противном случае она равна 0
if(right>left && top>bottom)
	cout<<(right-left)*(top-bottom)<<endl;
else
	cout<<0<<endl;