The `heuristics` function takes as input a distance matrix (shape: n by n) and a vector of customer demands (shape: n), where the depot node is indexed by 0 and the customer demands are normalized by the total vehicle capacity. 
It returns prior indicators of how promising it is to include each edge in a solution. The return is of the same shape as the distance matrix. 
The heuristics should contain negative values for undesirable edges and positive values for promising ones. Use efficient vectorized implementations.

### Solution Function Signature
```python
def heuristics(distance_matrix: torch.Tensor, demands: torch.Tensor) -> torch.Tensor:
```