Hàng đợi ưu tiên và Hàng đợi hai đầu là hai cấu trúc dữ liệu trừu tượng rất hữu ích trong quá trình giải các bài toán trong các kì thi học sinh giỏi. Về nội dung kiến thức của hàng đợi hai đầu và hàng đợi ưu tiên đã có rất nhiều tài liệu đề cập đến, trong chuyên đề này tôi không trình bày lại khái niệm, nguyên lí hoạt động mà chỉ nhắc lại các thao tác cơ bản trên hàng đợi để đưa vào áp dụng để giải một số bài toán cụ thế, và cũng là tài liệu tham khảo cho học sinh và giáo viên trong quá trình học tập và giảng dạy các đội tuyển học sinh giỏi.
CẤU TRÚC DỮ LIỆU ĐẶC BIỆT KHI KHAI THÁC STL TRONG C++ A MỞ ĐẦU I Lý chọn đề tài Trong chuyên đề hội thảo năm 2014 Vĩnh Phúc thầy phân tích trình bày đầy đủ nguyên lí hoạt động, cách cài đặt ứng dụng số cấu trúc liệu trừu tượng Hàng đợi, Ngăn xếp, Heap-max… ứng dụng Tuy nhiên cài đặt ngơn ngữ lập trình cụ thể người viết phải xây dựng số hàm thủ tục để từ khai thác thuận lợi Ở ngơn ngữ lập trình C++ có sẵn thư viện lưu trữ cấu trúc liệu nâng cao thường gặp xử lí thuật tốn Có nhiều loại cấu trúc liệu đặc biệt, ta quan tâm đến lại cấu trúc: Hàng đợi hai đầu : dequeue Ngăn xếp: stack Hàng đợi ưu tiên(đống) : priority-queue Tập hợp ánh xạ (set/map) Vector Danh sách liên kết (list) Các thư viện có sẵn giúp giảm chi phí thời gian phải xây dựng hàm Đơn giản Pascal bạn phải viết thủ tục Quicksort (1,n) để xếp mảng gồm n phần tử C++ cần gõ dòng lệnh sort(a+1, a+n+1) mảng a xếp không giảm Tuy nhiên chuyên đề xin trình bày hai cấu trúc liệu: Hàng đợi hai đầu : dequeue Hàng đợi ưu tiên (đống): priority_queue II.Mục đích đề tài Hàng đợi ưu tiên Hàng đợi hai đầu hai cấu trúc liệu trừu tượng hữu ích trình giải tốn kì thi học sinh giỏi Về nội dung kiến thức hàng đợi hai đầu hàng đợi ưu tiên có nhiều tài liệu đề cập đến, chuyên đề tơi khơng trình bày lại khái niệm, ngun lí hoạt động mà nhắc lại thao tác hàng đợi để đưa vào áp dụng để giải số toán cụ thế, tài liệu tham khảo cho học sinh giáo viên trình học tập giảng dạy đội tuyển học sinh giỏi B NỘI DUNG: I HÀNG ĐỢI HAI ĐẦU Khai báo thư viện hàng đợi: Để sử dụng hàng đợi hai đầu ta phải khai báo thư viện queue: #include Định nghĩa Hàng đợi hai đầu container cho phép thực thao tác sau: + Thêm phần tử x vào cuối hàng đợi q: q.push_back(x) + Lấy phần tử cuối hàng đợi q: q.pop_back() + Thêm phần tử xvào đầu hàng đợi q: q.push_front(x); + Lấy phần tử đầu hàng đợi q: q.pop_front(); Như việc lấy thêm vào diễn hai đầu hàng đợi + q.empty(): cho giá trị true hàng đợi rỗng, giá trị false hàng đợi không rỗng + q.front(): cho giá trị phần tử đứng đầu hàng đợi + q.back(): cho giá trị phần tử đứng cuối hàng đơi Một số ví dụ khai báo hàng đợi Ví dụ 1: Khai báo hàng đợi q có phần tử kiểu int: deque q; Ví dụ 2: Khai báo hàng đợi q có phần tử kiểu double: deque q; Ví dụ 3:Khai báo hàng đợi q có phần tử kiểu long long: deque q; *Chú ý: Các phần tử hàng đợi phải kiểu kiểu người lập trình tự định nghĩa Ví dụ : Hàng đợi có phần tử cặp: typedef pair< int, int> II; deque q; Ví dụ 2:Hàng đợi có phần tử cặp ba số nguyên: typedef pair III; deque q; Bài tập Bài tập (dqueue.cpp) Cho dãy số nguyên a1, a2, …,an m truy vấn Truy vấn dãy lệnh có dạng q(i,j) với ý nghĩa tìm phần tử nhỏ dãy ai, ai+1, …,aj (i≤j) Cho m truy vấn Q(i1,j1), Q(i2, j2), …, Q(im,jm) thỏa mãn 1.i1≤i2≤….≤im j1≤j2≤….≤jm Hãy in giá trị câu trả lời cho truy vấn tương ứng Input: file dqueue.inp gồm có: Dịng ghi hai số nguyên dương n, m (1≤n,m≤105) Dòng thứ hai ghi n số nguyên a1, a2, …,an m dòng tiếp theo, dòng thứ k ghi hai số ik,jk thể cho truy vấn thứ k (dữ liệu đảm bảo thỏa mãn điều kiện trên) Output : file dqueue.out gồm m dòng, dòng thứ k ghi kết truy vấn thứ k Example : Dqueue.inp Dqueue.out 55 23145 13 23 34 35 45 Thuật toán: Dễ dàng ta tìm kết m truy vấn cách sử dụng vòng lặp for sau: for (int k=1; k