This repository has been archived on 2022-06-22. You can view files and clone it, but cannot push or open issues or pull requests.
usaco-guide/content/3_Bronze/Rect_Geo.md
2020-06-16 20:42:08 -05:00

3.9 KiB

id title author
rect-geo Rectangle Geometry Darren Yao, Michael Cao

"Geometry" problems on USACO Bronze are usually quite simple and limited to intersections and unions of squares or rectangles.

  • Some only include two or three squares or rectangles, in which case you can simply draw out cases on paper. This should logically lead to a solution.
  • Also, the coordinates typically only go up to 1000, so a program that performs \approx 1000^2 operations (ex. with a nested loop) should pass.

Rectangle Class (Java)

A useful class in Java for dealing with rectangle geometry problems is the built-in Rectangle class. To create a new rectangle, use the following constructor:

//creates a rectangle with upper-left corner at (x,y) with a specified width and height
Rectangle newRect = new Rectangle(x, y, width, height); 

The Rectangle class supports numerous useful methods.

firstRect.intersects(secondRect) checks if two rectangles intersect.

firstRect.union(secondRect) returns a rectangle representing the union of two rectangles.

firstRect.contains(x, y) checks whether the integer point (x,y) exists in firstRect.

firstRect.intersect(secondRect) returns a rectangle representing the intersection of two rectangles.

This class can often lessen the implementation needed in a lot of bronze problems and codeforces problems.

For example, here is a nice implementation of the problem Blocked Billboard (see below). See the editorial here for more information on the solution.

import java.awt.Rectangle; //needed to use Rectangle class

public class BlockedBillboard{
    public static void main(String[] args) throws IOException{
        Scanner sc = new Scanner(new File("billboard.in"));
        PrintWriter pw = new PrintWriter(new FileWriter("billboard.out"));
        Rectangle firstRect = new Rectangle(sc.nextInt(), sc.nextInt(), sc.nextInt(), sc.nextInt());
        Rectangle secondRect = new Rectangle(sc.nextInt(), sc.nextInt(), sc.nextInt(), sc.nextInt());
        Rectangle truck = new Rectangle(sc.nextInt(), sc.nextInt(), sc.nextInt(), sc.nextInt());
        pw.println(getArea(firstRect) + getArea(secondRect) 
                - getArea(firstRect.intersect(truck)) - getArea(secondRect.intersect(truck)));
        pw.close();
    }

    public static long getArea(Rectangle r){
        return r.getHeight() * r.getWidth()
    }
}

(someone test code pls)

Rectangle Class (C++)

Unfortunately, C++ doesn't have a built in rectangle class, so you need to write the functions yourself. Here is the solution to Blocked Billboard written in C++ (thanks, Brian Dean!).

struct Rect{
    int x1, y1, x2, y2;
    int area(Rect r){
        return (y2 - y1) * (x2 - x1);
    }
};

int intersect(Rect p, Rect q){
  int xOverlap = max(0, min(p.x2, q.x2) - max(p.x1, q.x1));
  int yOverlap = max(0, min(p.y2, q.y2) - max(p.y1, q.y1));
  return xOverlap * yOverlap;
}

int main(){
  ifstream cin ("billboard.in");
  ofstream cout ("billboard.out");

  Rect a, b, t;  // billboards a, b, and the truck
 
  cin >> a.x1 >> a.y1 >> a.x2 >> a.y2;
  cin >> b.x1 >> b.y1 >> b.x2 >> b.y2;
  cin >> t.x1 >> t.y1 >> t.x2 >> t.y2;

  cout << area(a) + area(b) - intersect(a, t) - intersect(b, t);
}

Problems