fork download
  1. /* package whatever; // don't place package name! */
  2.  
  3. import java.util.*;
  4. import java.lang.*;
  5. import java.io.*;
  6.  
  7. /* Name of the class has to be "Main" only if the class is public. */
  8. class Ideone
  9. {
  10. static class RangeHolder {
  11. TreeMap<Double, Double> map;
  12. RangeHolder() {
  13. map = new TreeMap<Double, Double>();
  14. }
  15.  
  16. Map.Entry<Double, Double> occupy(Double rangeStart, Double rangeEnd) {
  17. Map.Entry<Double, Double> floor = map.floorEntry(rangeStart);
  18. if (floor != null && floor.getValue() >= rangeStart) {
  19. map.remove(floor.getKey());
  20. rangeStart = Math.min(floor.getKey(), rangeStart);
  21. rangeEnd = Math.max(floor.getValue(), rangeEnd);
  22. }
  23. Map.Entry<Double, Double> ceiling = map.ceilingEntry(rangeStart);
  24. if (ceiling != null && ceiling.getKey() <= rangeEnd) {
  25. map.remove(ceiling.getKey());
  26. rangeEnd = Math.max(ceiling.getValue(), rangeEnd);
  27. }
  28. map.put(rangeStart, rangeEnd);
  29. return map.ceilingEntry(rangeStart);
  30. }
  31.  
  32. /** Checks if the whole range is occupied -- no free areas */
  33. boolean isFree(Double rangeStart, Double rangeEnd) {
  34. Map.Entry<Double, Double> floor = map.floorEntry(rangeStart);
  35. if (floor != null && floor.getValue() >= rangeStart) return false;
  36. Map.Entry<Double, Double> ceiling = map.ceilingEntry(rangeStart);
  37. if (ceiling != null && ceiling.getKey() <= rangeEnd) return false;
  38. return true;
  39. }
  40.  
  41. /** Checks if the whole range is free -- no occupied areas */
  42. boolean isOccupied(Double rangeStart, Double rangeEnd) {
  43. Map.Entry<Double, Double> floor = map.floorEntry(rangeStart);
  44. if (floor != null && floor.getValue() >= rangeEnd) return true;
  45. return false;
  46. }
  47.  
  48. Map.Entry<Double, Double> getRange(Double value) {
  49. Map.Entry<Double, Double> floor = map.floorEntry(value);
  50. if (floor.getValue() >= value) return floor;
  51. return null;
  52. }
  53.  
  54. Double[] getRangeStarts() {
  55. Double[] a = new Double[0];
  56. return map.keySet().toArray(a);
  57. }
  58. }
  59.  
  60. public static void printRanges(RangeHolder rh) {
  61. Double[] ranges = rh.getRangeStarts();
  62. System.out.println("Ranges:");
  63. for (Double r: ranges) {
  64. System.out.println(" " + r + "..." + rh.getRange(r).getValue());
  65. };
  66. System.out.println();
  67. }
  68.  
  69. public static void main(String[] args) {
  70. RangeHolder rh = new RangeHolder();
  71. rh.occupy(1d, 2d);
  72. rh.occupy(3d, 4d);
  73. rh.occupy(5d, 6d);
  74. printRanges(rh);
  75.  
  76. rh.occupy(2d, 3d);
  77. printRanges(rh);
  78.  
  79. System.out.println("rh.isFree(0d,100d): " + rh.isFree(0d,100d));
  80. System.out.println("rh.isFree(0d,0.2d): " + rh.isFree(0d,0.2d));
  81. System.out.println("rh.isFree(0.5d,3d): " + rh.isFree(0.5d,3d));
  82. System.out.println("rh.isFree(2d,3d): " + rh.isFree(2d,3d));
  83. System.out.println("rh.isFree(3d,5d): " + rh.isFree(3d,5d));
  84. System.out.println("rh.isFree(5d,7d): " + rh.isFree(5d,7d));
  85. System.out.println("rh.isFree(7d,8d): " + rh.isFree(7d,8d));
  86.  
  87. System.out.println();
  88. System.out.println("rh.isOccupied(0d,100d): " + rh.isOccupied(0d,100d));
  89. System.out.println("rh.isOccupied(0d,0.2d): " + rh.isOccupied(0d,0.2d));
  90. System.out.println("rh.isOccupied(0.5d,3d): " + rh.isOccupied(0.5d,3d));
  91. System.out.println("rh.isOccupied(2d,3d): " + rh.isOccupied(2d,3d));
  92. System.out.println("rh.isOccupied(3d,5d): " + rh.isOccupied(3d,5d));
  93. System.out.println("rh.isOccupied(5d,7d): " + rh.isOccupied(5d,7d));
  94. System.out.println("rh.isOccupied(7d,8d): " + rh.isOccupied(7d,8d));
  95.  
  96. System.out.println();
  97. Map.Entry<Double, Double> range = rh.getRange(3d);
  98. System.out.println("3 falls in range " + range.getKey() + "..." + range.getValue());
  99.  
  100. }
  101.  
  102. }
Success #stdin #stdout 0.04s 711168KB
stdin
Standard input is empty
stdout
Ranges:
  1.0...2.0
  3.0...4.0
  5.0...6.0

Ranges:
  1.0...4.0
  5.0...6.0

rh.isFree(0d,100d): false
rh.isFree(0d,0.2d): true
rh.isFree(0.5d,3d): false
rh.isFree(2d,3d): false
rh.isFree(3d,5d): false
rh.isFree(5d,7d): false
rh.isFree(7d,8d): true

rh.isOccupied(0d,100d): false
rh.isOccupied(0d,0.2d): false
rh.isOccupied(0.5d,3d): false
rh.isOccupied(2d,3d): true
rh.isOccupied(3d,5d): false
rh.isOccupied(5d,7d): false
rh.isOccupied(7d,8d): false

3 falls in range 1.0...4.0