> For the complete documentation index, see [llms.txt](https://hao-fu-1.gitbook.io/oj/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hao-fu-1.gitbook.io/oj/greedy/1488.-avoid-flood-in-the-city.md).

# 1488. Avoid Flood in The City

Your country has an infinite number of lakes. Initially, all the lakes are empty, but when it rains over the `nth` lake, the `nth` lake becomes full of water. If it rains over a lake which is **full of water**, there will be a **flood**. Your goal is to avoid the flood in any lake.

Given an integer array `rains` where:

* `rains[i] > 0` means there will be rains over the `rains[i]` lake.
* `rains[i] == 0` means there are no rains this day and you can choose **one lake** this day and **dry it**.

Return *an array `ans`* where:

* `ans.length == rains.length`
* `ans[i] == -1` if `rains[i] > 0`.
* `ans[i]` is the lake you choose to dry in the `ith` day if `rains[i] == 0`.

If there are multiple valid answers return **any** of them. If it is impossible to avoid flood return **an empty array**.

Notice that if you chose to dry a full lake, it becomes empty, but if you chose to dry an empty lake, nothing changes. (see example 4)

**Example 1:**

```
Input: rains = [1,2,3,4]
Output: [-1,-1,-1,-1]
Explanation: After the first day full lakes are [1]
After the second day full lakes are [1,2]
After the third day full lakes are [1,2,3]
After the fourth day full lakes are [1,2,3,4]
There's no day to dry any lake and there is no flood in any lake.
```

**Example 2:**

```
Input: rains = [1,2,0,0,2,1]
Output: [-1,-1,2,1,-1,-1]
Explanation: After the first day full lakes are [1]
After the second day full lakes are [1,2]
After the third day, we dry lake 2. Full lakes are [1]
After the fourth day, we dry lake 1. There is no full lakes.
After the fifth day, full lakes are [2].
After the sixth day, full lakes are [1,2].
It is easy that this scenario is flood-free. [-1,-1,1,2,-1,-1] is another acceptable scenario.
```

**Example 3:**

```
Input: rains = [1,2,0,1,2]
Output: []
Explanation: After the second day, full lakes are  [1,2]. We have to dry one lake in the third day.
After that, it will rain over lakes [1,2]. It's easy to prove that no matter which lake you choose to dry in the 3rd day, the other one will flood.
```

**Example 4:**

```
Input: rains = [69,0,0,0,69]
Output: [-1,69,1,1,-1]
Explanation: Any solution on one of the forms [-1,69,x,y,-1], [-1,x,69,y,-1] or [-1,x,y,69,-1] is acceptable where 1 <= x,y <= 10^9
```

**Example 5:**

```
Input: rains = [10,20,20]
Output: []
Explanation: It will rain over lake 20 two consecutive days. There is no chance to dry any lake.
```

**Constraints:**

* `1 <= rains.length <= 10^5`
* `0 <= rains[i] <= 10^9`

给定数组的元素值nums\[i] 为\[1, n]时表示第i天湖nums\[i]会降雨，为0时表示该天为晴，可以选任意一个湖抽水，当一个湖有两次降水且中间没有抽过时会溢出，问如何抽水能防止出现溢出。贪心，对每一个0，选它后面最近的且需要抽水的湖。选最近用min heap。将每个湖所下雨的天数提前记下，每次遇到一个湖，把它的下一个雨天放入heap中。

```python
class Solution:
    def avoidFlood(self, rains: List[int]) -> List[int]:
        pos, dry, res = collections.defaultdict(collections.deque), [], [-1] * len(rains)
        for i, lake in enumerate(rains):
            pos[lake].append(i)
        for i, lake in enumerate(rains):
            if lake:
                if pos[lake] and pos[lake][0] < i: 
                    return []
                if pos[lake] and len(pos[lake]) > 1:
                    heappush(dry, pos[lake][1])
            else:
                if dry:
                    res[i] = rains[heappop(dry)]
                    pos[res[i]].popleft()
                else:
                    res[i] = 1
        return res
    
```
