---
# System prepended metadata

title: Ôn tập Mảng cộng dồn 2

---

# Ôn tập mảng cộng dồn 2

### Bài 2: CSES - Restaurant Customers
#### a. Hướng tiếp cận
- Mảng cộng dồn/ đánh dấu
- Giới hạn của đề bài 10<sup>9</sup> => Nếu như ta tạo mảng đánh dấu thì không thể đánh dấu tới 10<sup>9</sup>
=> Ta chỉ cần theo dõi lúc nào có giá trị thay đổi
=> lúc vào và lúc đi
=> lưu lại thời gian khách vào và đi và đánh dấu
#### b. Giải thuật
- Tạo ra mảng để đánh dấu giá trị thời gian và loại hành động vào hoặc đi và sắp xếp theo thứ tự thời gian
- tạo ra 1 mảng 2 chiều, lưu giá trị thời gian và đánh dấu hành động rồi sắp xếp lại
- Theo dõi biến động rồi tính và so sánh

#### c. Code


```python=
n = int(input())
a = []
for i in range(n):
    x,y = map(int,input().split())
    a.append((x,1))
    a.append((y,-1))

a.sort()

_max = 0
d = 0
#print(a)
for _,i in a:
    d += i
    _max = max(_max,d)

print(_max)

```


### Bài 3: Cộng tăng dần vào đoạn
#### a. Hướng tiếp cận
 - Đánh dấu điểm thay đổi
 - Cộng dồn các thay đổi 
 - Đánh dấu lại các điểm dừng
 - Cộng dồn theo bước nhảy

```python=
n,m = map(int,input().split())
a = [0]*(n+5)
b = [0]*(n+5)
c = [0]*(n+5)
l = [0]*(m+5)
r = [0]*(m+5)

for i in range(1, m + 1):
    l[i],r[i] = map(int,input().split())
    a[l[i]]+=1
    a[r[i]+1] -=1
    
for i in range(1, n + 1):
    b[i] = a[i] + b[i-1]
    
for i in range(1, m + 1):   
    b[r[i]+1] -= (r[i] - l[i] + 1)

for i in range(1, n + 1):
    c[i] = b[i] + c[i-1]

for i in range(1, n + 1):
    print(c[i],end=" ")
    
```


#### Bài 4: codefcs04
##### 1. Yêu cầu
- Tìm và xác định vị trí đoạn con liên tiếp có tổng lớn nhất 

##### 2. Phân tích 
s[a:b] là lớn nhất 
s[a:b] = s[b]-s[a-1]
s[a-1] nhỏ nhất
- cộng dồn
- đánh dấu giá trị cộng dồn nhỏ nhất từ b trờ về trước
- 
```python=
7
-82 82 -36 49 -51 42 -50

f = [0,-82,0,-36,13,-38,4,-46] # cộng dồn
m = [0,0,-82,-82,-82,-82,-82,-82] # đánh dấu giá trị nhỏ nhất

s = [0,-82,82,46,95,44,86,36]
```



#### Bài 1: Siêu thị 
```python=
3 4 3 2
1 1 1 4
2 2 3 3
2 3 3 4
```

##### Mảng cộng dồn 2 chiều
[Lý thuyết mảng cộng dồn 2 chiều](https://vnoi.info/wiki/algo/data-structures/prefix-sum-and-difference-array.md#m%E1%BA%A3ng-c%E1%BB%99ng-d%E1%BB%93n-hai-chi%E1%BB%81u)

![hinh1](https://hackmd.io/_uploads/SJMpTTH6T.gif)
https://meet.jit.si/ClinicalResolutionsNeedOverall

```python=
m = 3
n = 4
k = 3
s = 2
#a = [[3,   -6,    7,    8],
#[-7,   9,   4,  -4],  
#[1,    -1,    7,    1],  
#[4,     4,  -2,  -3]]
a = []
for i in range(m+2):
    a.append([0]*(n+2))
for i in range(k):
    x,y,u,v = map(int,input().split())
    a[x][y] +=1
    a[u+1][v+1] -=1
s = []
for i in range(m+1):
    s.append([0]*(n+1))

for i in range(1,m+1):
    for j in range(1,n+1):
        s[i][j] = s[i-1][j] + s[i][j-1] + a[i-1][j-1] - s[i-1][j-1]
print(s)
        
#s = [[0, 0, 0, 0, 0], 
#[0, 3, -3, 4, 12], 
#[0, -4, -1, 10, 14], 
#[0, -3, -1, 17, 22], 
#[0, 1, 7, 23, 25]]
        
```
