Editorial for COCI '06 Contest 2 #5 Stol


Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.

Suppose one dimension of the table is fixed. For example, let the table start in column s1 and end in column s2. For the table to span a certain row, all squares between s1 and s2 (inclusive) in that row must be free.

For each row we can determine if there are any blocked squares between columns s1 and s2 in constant time: we preprocess the apartment and calculate the number of blocked squares left of each square. Call this number sum(row,column). After calculating this, the expression sum(row,s2)sum(row,s11) tells us how many squares between s1 and s2 are blocked (if this number is zero, then the table can be placed in that row).

A single pass finds the largest consecutive number of rows that don't have walls between s1 and s2, giving the largest solution for the assumed columns s1 and s2. Exploring all possibilities for s1 and s2 we choose the one that gives the maximum perimeter.

The number of possibilities is O(N2).

Time complexity: O(N3)


Comments


  • 1
    Ivan_Li  commented on Oct. 20, 2023, 8:07 p.m. edited

    There is also an O(N2) solution to this problem by reducing the problem to largest rectangle in a histogram, and then solving with a monotonic stack. The only modification you need is to use the formula for perimeter instead of area. Example: https://dmoj.ca/src/5742708

    (You need this method to pass with Python.)