#include #include #include #include using namespace std; struct Line { int x1, y1, x2, y2, index; Line(int x1, int y1, int x2, int y2, int index) : x1(x1), y1(y1), x2(x2), y2(y2), index(index) {} }; int orientation(int x1, int y1, int x2, int y2, int x3, int y3) { int val = (y2 - y1) * (x3 - x2) - (x2 - x1) * (y3 - y2); if (val == 0) return 0; return (val > 0) ? 1 : 2; } bool onSegment(int x1, int y1, int x2, int y2, int x3, int y3) { return (x2 <= max(x1, x3) && x2 >= min(x1, x3) && y2 <= max(y1, y3) && y2 >= min(y1, y3)); } bool doIntersect(Line& l1, Line& l2) { int o1 = orientation(l1.x1, l1.y1, l1.x2, l1.y2, l2.x1, l2.y1); int o2 = orientation(l1.x1, l1.y1, l1.x2, l1.y2, l2.x2, l2.y2); int o3 = orientation(l2.x1, l2.y1, l2.x2, l2.y2, l1.x1, l1.y1); int o4 = orientation(l2.x1, l2.y1, l2.x2, l2.y2, l1.x2, l1.y2); if (o1 != o2 && o3 != o4) return true; if (o1 == 0 && onSegment(l1.x1, l1.y1, l2.x1, l2.y1, l1.x2, l1.y2)) return true; if (o2 == 0 && onSegment(l1.x1, l1.y1, l2.x2, l2.y2, l1.x2, l1.y2)) return true; if (o3 == 0 && onSegment(l2.x1, l2.y1, l1.x1, l1.y1, l2.x2, l2.y2)) return true; if (o4 == 0 && onSegment(l2.x1, l2.y1, l1.x2, l1.y2, l2.x2, l2.y2)) return true; return false; } pair> findBeautifulPoint(vector& lines) { vector> intersections; for (int i = 0; i < lines.size(); i++) { for (int j = i + 1; j < lines.size(); j++) { if (doIntersect(lines[i], lines[j])) { int x1 = lines[i].x1, y1 = lines[i].y1; int x2 = lines[i].x2, y2 = lines[i].y2; int x3 = lines[j].x1, y3 = lines[j].y1; int x4 = lines[j].x2, y4 = lines[j].y2; int x = (x1 + x2 + x3 + x4) / 4; int y = (y1 + y2 + y3 + y4) / 4; intersections.push_back({x, y}); } } } sort(intersections.begin(), intersections.end()); int m = intersections.size(); int minDiff = INT_MAX; int minPosDiff = INT_MAX; int bestIndex = -1; for (int i = 0; i < m - 1; i++) { int diff = abs(intersections[i + 1].first - intersections[i].first) + abs(intersections[i + 1].second - intersections[i].second); if (diff < minDiff || (diff == minDiff && intersections[i + 1].first < minPosDiff)) { minDiff = diff; minPosDiff = intersections[i + 1].first; bestIndex = i; } } vector selectedLines; for (int i = 0; i < lines.size(); i++) { if (onSegment(lines[bestIndex].x1, lines[bestIndex].y1, intersections[bestIndex].first, intersections[bestIndex].second, lines[i].x2, lines[i].y2)) { selectedLines.push_back(lines[i].index); } } return {minDiff, selectedLines}; } int main() { int n; cin >> n; vector lines; for (int i = 0; i < n; i++) { int x1, y1, x2, y2; cin >> x1 >> y1 >> x2 >> y2; lines.push_back(Line(x1, y1, x2, y2, i + 1)); } auto result = findBeautifulPoint(lines); cout << result.first << "\n"; cout << result.second.size() << "\n"; for (int index : result.second) { cout << index << " "; } return 0; }