Skip to content

DTQG #2 Editorial

16 Nov 2023

Bài 1

Giả sử dãy có phần tử bằng 00. Ta luôn chọn nó đầu tiên vì luôn khiến đáp án tốt hơn. Nếu dãy có phần tử min là xx, phần tử này sẽ đóng góp vào đáp án a[x](n2)a[x] * (n - 2). Ta coi như là giảm dãy đi axa_x đơn vị, lúc này xuất hiện thêm các phần tử 00, ta chỉ việc xoá chúng đi và làm lại bước trên.

Đáp án cũng được cộng với min(a[x1],a[x+1])a[x]min(a[x - 1], a[x + 1]) - a[x] (không xoá luôn mà có thể để sau này mới xoá xx, chú ý: ta coi là dãy đang giảm đi a[x]a[x] đơn vị).

Tóm tắt các bước:

  • Tìm phần tử nhỏ nhất là xx.
  • Cộng vào đáp án cuối cùng a[x](n2)a[x] * (n - 2) với nn là số giá trị còn lại.
  • Cộng vào đáp án cuối cùng min(a[x1],a[x+1])a[x]min(a[x - 1], a[x + 1]) - a[x].
  • Giảm cả dãy đi a[x]a[x], xoá các phần tử 00.

Có thể cài đặt bằng Segment tree, không cần phải thực hiện thao tác xoá mà chỉ cần giảm trên Segtree.

Bài 2

Đáp án luôn 7\le 7 vì một số chỉ có tối đa 66 ước nguyên tố khác nhau. Ta tính mảng dp(i,j)dp(i, j) là số cách chọn jj phần tử sao cho có gcd=igcd = i.

Gọi số lượng số chia hết cho jjkk. Số cách chọn ii phần tử từ kk phần tử là CikC_{i}^{k}. Sau khi khởi tạo dp(i,j)=Ckidp(i, j) = C_{k}^{i}, ta chỉ cần trừ hết đi dp(i×2,j)dp(i \times 2, j), dp(i×3,j)dp(i \times 3, j), ...

Bài 3

Ta chặt nhị phân đáp án, giả sử xét giá trị xx, ta cần xem có tồn tại cách chọn sao cho số lượng phần tử x\le xk\ge k hay không. Ta sẽ coi những phần tử aixa_i \le xai=1a_i = 1, những phần tử ai>xa_i > xai=0a_i = 0. Ta nghĩ đến dpdp để chọn được tổng k\ge k.

Gọi dp(i,j)dp(i, j) là tổng nếu đã xét ii phần tử đầu và đã chọn tối đa jj đoạn. Công thức:

dp(i,j)=max(dp(i1,j),dp(i,j1))dp(i, j) = max(dp(i - 1, j), dp(i, j - 1)).

Nếu trong các phần tử 11, 22, ..., i+1i + 1, ta có đoạn [L,R][L, R] với RR lớn nhất thì ta sẽ ưu tiên chọn đoạn [L,R][L, R] này để mở rộng ra nhiều nhất, tổng được mở rộng ra đúng bằng aja_j với jj từ i+1i + 1 đến RR. Do đó dp(nxt(i),j+1)=max(dp(i,j)+sum(nxt(i))sum(i))dp(nxt(i), j + 1) = max(dp(i, j) + sum(nxt(i)) - sum(i)) với nxt(i)nxt(i)RR lớn nhất sao cho Li+1L \le i + 1sumsum là mảng tổng tiền tố.

Cách làm trên là đúng vì mỗi lần ta chỉ thêm các phần tử chưa được xét, dù một phần tử bị nhiều đoạn đè lên.