Skip to content

Commit 9f17a70

Browse files
Points and Segments task
1 parent 7e64606 commit 9f17a70

File tree

2 files changed

+112
-0
lines changed

2 files changed

+112
-0
lines changed
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package algorithms.points_and_segments;
2+
3+
import java.util.Arrays;
4+
import java.util.Comparator;
5+
import java.util.Scanner;
6+
7+
public class Main {
8+
private void run() {
9+
Scanner scanner = new Scanner(System.in);
10+
StringBuilder outputBuilder = new StringBuilder();
11+
int segmentsNumber = scanner.nextInt();
12+
int pointsNumber = scanner.nextInt();
13+
Segment[] segmentsSortedByLeft = new Segment[segmentsNumber];
14+
for (int i = 0; i < segmentsNumber; i++) {
15+
int left = scanner.nextInt();
16+
int right = scanner.nextInt();
17+
segmentsSortedByLeft[i] = new Segment(left, right);
18+
}
19+
int[] points = new int[pointsNumber];
20+
for (int i = 0; i < pointsNumber; i++) {
21+
points[i] = scanner.nextInt();
22+
}
23+
24+
Segment[] segmentsSortedByRight = segmentsSortedByLeft.clone();
25+
Arrays.sort(segmentsSortedByLeft, Comparator.comparing(Segment::getLeft));
26+
Arrays.sort(segmentsSortedByRight, Comparator.comparing(Segment::getRight));
27+
for (int i = 0; i < pointsNumber; i++) {
28+
int lastLeftSegmentIndex = searchLastLeft(segmentsSortedByLeft, points[i]);
29+
int lastRightSegmentIndex = searchLastRight(segmentsSortedByRight, points[i]);
30+
outputBuilder.append(String.format("%d ", lastLeftSegmentIndex - lastRightSegmentIndex));
31+
}
32+
System.out.println(outputBuilder.toString());
33+
}
34+
35+
private int searchLastLeft(Segment[] segments, int point) {
36+
int left = -1;
37+
int right = segments.length;
38+
// segments[left].getLeft() <= point
39+
// segments[right].getLeft() > point
40+
while (left + 1 < right) {
41+
int current = (left + right) >> 1;
42+
if (segments[current].getLeft() <= point) {
43+
left = current;
44+
} else {
45+
right = current;
46+
}
47+
}
48+
if (left >= 0) {
49+
if (segments[left].getLeft() <= point) {
50+
return left;
51+
}
52+
}
53+
return -1;
54+
}
55+
56+
private int searchLastRight(Segment[] segments, int point) {
57+
int left = -1;
58+
int right = segments.length;
59+
// segments[left].getRight() < point
60+
// segments[right].getRight() >= point
61+
while (left + 1 < right) {
62+
int current = (left + right) >> 1;
63+
if (segments[current].getRight() < point) {
64+
left = current;
65+
} else {
66+
right = current;
67+
}
68+
}
69+
if (left >= 0) {
70+
if (segments[left].getRight() < point) {
71+
return left;
72+
}
73+
}
74+
return -1;
75+
}
76+
77+
public static void main(String[] args) {
78+
new Main().run();
79+
}
80+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package algorithms.points_and_segments;
2+
3+
public class Segment {
4+
private Integer left;
5+
private Integer right;
6+
7+
public Segment(int left, int right) {
8+
this.left = left;
9+
this.right = right;
10+
}
11+
12+
public Integer getLeft() {
13+
return left;
14+
}
15+
16+
public void setLeft(Integer left) {
17+
this.left = left;
18+
}
19+
20+
public Integer getRight() {
21+
return right;
22+
}
23+
24+
public void setRight(Integer right) {
25+
this.right = right;
26+
}
27+
28+
@Override
29+
public String toString() {
30+
return String.format("(%d, %d)", left, right);
31+
}
32+
}

0 commit comments

Comments
 (0)