# Bài 1: Truy vấn tổng mảng tĩnh ## <span style="color:red;">Cày trâu</span> - Với mỗi truy vấn $q$ ta sẽ thực hiện tính tổng các phần tử $x$ trong mảng từ vị trí $a$ đến $b$ như yêu cầu của đề. Độ phức tạp là $O(n \times q)$ ## <span style="color:red;">Thuật AC</span> - Ta sẽ sử dụng kĩ thuật dùng mảng để tính tổng cộng dồn. Ta sẽ tạo một mảng $prefix[i]$ để lưu tổng giá trị của các phần tử từ $1$ đến vị trí thứ $i$ -> tổng giá trị từ vị trí thứ $a$ đến vị trí thứ $b$ sẽ là $prefix[b]-prefix[a-1]$. Độ phức tạp là $O(q)$ - VD: ```= 8 4 3 2 4 5 1 1 5 3 ``` Ta sẽ tạo được mảng cộng dồn $prefix[i]$ là: ```cpp= prefix[1]=x1; prefix[2]=prefix[1]+x2; ... prefix[n]=prefix[n-1]+xn; ``` ### Code: ```cpp= #include<bits/stdc++.h> using namespace std; int prefix[200005]; int main() { ios_base::sync_with_stdio(0); cout.tie(0);cin.tie(0); int n,q; cin>>n>>q; for(int i=1;i<=n;i++) { int x; cin>>x; prefix[i]=prefix[i-1]+x; } for(int i=1;i<=q;i++) { int a,b; cin>>a>>b; cout<<prefix[b]-prefix[a-1]<<'\n'; } } ``` # Bài 2: Mua Quà ## <span style="color:red;">Cày Trâu</span> - Ta sẽ thử $m$ cách chọn $n$ món quà (thử hết tất cả trường hợp). Độ phức tạp là $O(C^{m}_{n})$ ## <span style="color:red;">Thuật AC</span> - Ta sẽ dùng phương pháp tham lam: - Nhận xét: Sau khi ta sắp xếp các phần tử theo thứ tự tăng dần và bắt đầu xét từ phần tử có vị trí thứ $m$. Nếu ta lấy phần tử thứ $i$ $(m \leq i \leq n)$ là món quà có giá trị lớn nhất trong $m$ món quà mình chọn thì độ chênh lệch nhỏ nhất chính là phần tử thứ $i$ đang xét trừ cho phần tử thứ $i-m+1$. Độ phức tạp sẽ là $O(n-m+1)$ ```cpp= #include<bits/stdc++.h> using namespace std; long long a[100005]; int main() { int n,m; cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i]; sort(a+1,a+1+n);//sắp xếp tăng dần các phần tử mảng a long long res=1e18; for(int i=m;i<=n;i++) { long long phu=a[i]-a[i-m+1];//giá trị chênh lệch nhỏ nhất khi a[i] là món quà có giá trị lớn nhất mình chọn res=min(res,phu);//lấy giá trị chênh lệch nhỏ nhất } cout<<res; } ```