Processing math: 91%
Solutions of Yet another problem - ReimuOJ: Reimu Online Judge

Solutions of Yet another problem

Select solution language

Write solution here.


User Avatar tuongll    Created at    46 likes

Ta sẽ xử lý bài toán này offline. Cụ thể, trước tiên ta sắp xếp lại các giá trị k trong các truy vấn theo chiều tăng dần. Để ý rằng k càng lớn, trong mảng A càng có nhiều số không vượt quá k. Vậy, thuật toán của ta sẽ bao gồm các bước sau: 1. Xét giá trị k trong truy vấn hiện tại. Đánh dấu tất cả các số k trong một mảng mark (có giá trị 0/1) mà chưa được đánh dấu từ một truy vấn trước đó (do ta xử lý offline). 2. Tìm dãy con liên tiếp dài nhất của mảng mark gồm toàn giá trị 1. Ý thứ 2 là một ứng dụng phổ biến của cấu trúc DSU. Cụ thể, giả sử ta thêm giá trị thứ i của A trong truy vấn hiện tại, ta xét hai phần tử liền kề với nó: + Nếu i>1mark[i1]=1, ta gộp hai tập hợp chứa phần tử thứ ii1. + Nếu i<nmark[i+1]=1, ta gộp hai tập hợp chứa phần tử thứ ii+1. Kết quả với từng truy vấn là kích thước của tập hợp lớn nhất trong DSU. Code mẫu: cpp#clude<bitsstdc++.h>#defelllonglong#defeall(a)a.beg(),a.end()usingnamespacestd;constmxn=1e5+3;n,q,a[mxn];par[mxn],sz[mxn];blmark[mxn];res=0;/trưckhixlý