forked from int28h/JavaTasks
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcoverSegments.java
More file actions
124 lines (118 loc) · 4.26 KB
/
coverSegments.java
File metadata and controls
124 lines (118 loc) · 4.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
/**
* По данным n отрезкам необходимо найти множество точек минимального размера, для которого каждый из отрезков
* содержит хотя бы одну из точек.
*
* В первой строке дано число 1 <= n <= 100 отрезков.
* Каждая из последующих n строк содержит по два числа 0 <= l <= r <= 10^9, задающих начало и конец отрезка.
* Выведите оптимальное число m точек и сами m точек. Если таких множеств точек несколько, выведите любое из них.
*
* Пример
* input
* 3
* 1 3
* 2 5
* 3 6
* output
* 1
* 3
*
* input
* 4
* 4 7
* 1 3
* 2 5
* 5 6
* output
* 2
* 3 6
*/
import java.util.Scanner;
import java.util.Stack;
public class Main {
public static void insertionSort(int[][] data, int count) {
for(int j = 0; j < count; j++){
int i = j - 1;
while(i >= 0 && data[i][2] > data[i+1][2]) {
int temp0 = data[i][0];
int temp1 = data[i][1];
int temp2 = data[i][2];
data[i][0] = data[i+1][0];
data[i][1] = data[i+1][1];
data[i][2] = data[i+1][2];
data[i+1][0] = temp0;
data[i+1][1] = temp1;
data[i+1][2] = temp2;
if(i != 0) {
if(data[i-1][2] == data[i][2]) {
System.out.println("Нашлись две одинаковые точки с ключом " + data[i][2]);
if(data[i-1][1] > data[i][1]) {
System.out.println("Они в неправильном порядке; они поменяются местами");
temp0 = data[i-1][0];
temp1 = data[i-1][1];
temp2 = data[i-1][2];
data[i-1][0] = data[i][0];
data[i-1][1] = data[i][1];
data[i-1][2] = data[i][2];
data[i][0] = temp0;
data[i][1] = temp1;
data[i][2] = temp2;
}
}
}
i--;
}
}
}
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
int strings = sc.nextInt();
int count = strings * 2;
int currentString = 0;
int[][] data = new int[count][3];
//заполнение массива
//[i][0] - номер отрезка
//[i][1] - начало или конец отрезка; 0 начало, 1 конец
//[i][2] - точка
for(int i = 0; i < count; i++) {
if(currentString % 2 == 0) {
data[i][0] = currentString / 2 + 1;
data[i][1] = 0;
} else {
data[i][0] = currentString / 2 + 1;
data[i][1] = 1;
}
data[i][2] = sc.nextInt();
currentString++;
}
insertionSort(data, count);
Stack<Integer> stack = new Stack<Integer>();
boolean[] isSegmentCovered = new boolean[strings];
StringBuilder answer = new StringBuilder();
int answersCount = 0;
for(int i = 0; i < count; i++) {
//System.out.println("Обрабатывается точка " + data[i][2] + " из отрезка " + data[i][0]);
//if(data[i][0] == 0) continue;
if(data[i][1] == 0) {
//System.out.println("Эта точка является началом отрезка " + data[i][0]);
stack.push(data[i][0]);
//System.out.println("В стек помещен отрезок " + data[i][0]);
} else {
//System.out.println("Эта точка является концом отрезка " + + data[i][0]);
if (!isSegmentCovered[data[i][0] - 1]) {
//System.out.println("Данный отрезок еще не покрыт");
answersCount++;
answer.append(data[i][2] + " ");
while(!stack.isEmpty()) {
int cur = stack.pop();
isSegmentCovered[cur - 1] = true;
//System.out.println("Отрезок "+ cur + " покрыт");
}
} else {
//System.out.println("Данный отрезок уже покрыт");
}
}
}
System.out.println(answersCount);
System.out.println(answer);
}
}