chuyên đề standard template library (STL) trong c++

31 148 1
chuyên đề standard template library (STL) trong c++

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

MỤC LỤC Mở đầu Một số kiến thức STL 1.1 Khái quát STL 1.2 Đối tượng chuyên đề Bài tập áp dụng 2.1 Bài Xếp hàng ưu tiên 2.1.1 Đề bài: MSE07B 2.1.2 Hướng dẫn giải thuật 10 2.1.3 Chương trình minh họa 10 2.1.4 Cảm nhận 11 2.2 Bài KRYP6 11 2.2.1 Đề KRYP6 11 2.2.2 Hướng dẫn giải thuật 12 2.2.3 Chương trình tham khảo 12 2.2.4 Cảm nhận 13 2.3 Bài Khôi phục lại mảng 13 2.3.1 Đề bài: ANUMLA 13 2.3.2 Hướng dẫn giải thuật 14 2.3.3 Chương trình tham khảo 14 2.3.4 Cảm nhận 15 2.4 Bài Ronaldo chuyển sang Juventus 15 2.4.1 Đề - CR7JUVE 15 2.4.2 Hướng dẫn giải thuật 16 2.4.3 Chương trình tham khảo 16 2.4.4 Cảm nhận 17 2.5 Bài – Cơng cụ xếp kì lạ 17 2.5.1 Đề bài: SORTTOOL 17 2.5.2 Hướng dẫn giải thuật 17 2.5.3 Chương trình tham khảo 18 2.5.4 Cảm nhận 19 2.6 Bài 6- Chỗ ngồi nhà hát 19 2.6.1 Đề - SEATS 19 Trang 2.6.2 Hướng dẫn giải thuật 20 2.6.3 Chương trình tham khảo 21 2.6.4 Cảm nhận 23 2.7 Bài Đoạn tổng 23 2.7.1 Đề bài: SUMSEQ0 23 2.7.2 Hướng dẫn giải thuật 23 2.7.4 Cảm nhận 24 2.8 Bài Không segment tree 25 2.8.1 Đề bài: NOST 25 2.8.2 Hướng dẫn giải thuật 25 2.8.3 Chương trình tham khảo 26 2.8.4 Cảm nhận 27 2.9 Bài Không Binary index tree 28 2.9.1 Đề bài: NOST2 28 2.9.2 Hướng dẫn giải thuật 28 2.9.3 Chương trình tham khảo 29 2.9.4 Cảm nhận 30 Một số tự giải 30 Kết luận 31 TÀI LIỆU THAM KHẢO 31 Trang Standard Template Library (STL) C++ Giáo viên: Nguyễn Như Thắng – THPT Chuyên Lào Cai Mở đầu Trang bị kiến thức ngơn ngữ lập trình chưa vấn đề lớn tin học Đương nhiên, chọn ngôn ngữ lập trình làm cơng cụ cho học sinh sử dụng vào thi lập trình cần trang bị cho học sinh hiểu biết, kĩ sau: - Điểm mạnh, điểm yếu ngôn ngữ lập trình hệ thống hỗ trợ - Các dịch vụ mà hệ thống lập trình cung cấp - Tạo thói quen suy nghĩ hành động phù hợp với ngơn ngữ lập trình hệ thống lập trình - Cần biết sâu tốt thư viện chuẩn hỗ trợ lập trình biết khai thác chúng cách linh hoạt, hiệu Trong xu mà việc sử dụng ngơn ngữ lập trình C++ trở nên phổ biến hầu hết thi lập trình, việc nắm vững, nắm ngơn ngữ lập trình C++ khai thác cơng cụ có sẵn cần thiết Do đó, chuyên đề này, xin chia sẻ số tập sử dụng thư viện STL ngôn ngữ lập trình C++ mà áp dụng toán trở nên đơn giản Một số kiến thức STL 1.1 Khái quát STL C++ đánh giá ngơn ngữ mạnh tính mềm dẻo, gần gũi với ngơn ngữ máy Ngồi ra, với khả lập trình theo mẫu (template ), C++ khiến ngơn ngữ lập trình trở thành khái qt, khơng cụ thể chi tiết nhiều ngôn ngữ khác Sức mạnh C++ đến từ STL, viết tắt Standard Template Library - thư viện template cho C++ với cấu trúc liệu giải thuật xây dựng tổng quát mà tận dụng hiệu tốc độ C Với khái niệm template, người lập trình đề khái niệm lập trình khái lược (generic programming), C++ cung cấp kèm với thư viện chuẩn STL Bộ thư viện thực tồn cơng việc vào liệu (iostream), quản lý mảng (vector), thực hầu hết tính cấu trúc liệu (stack, queue, map, set ) Ngoài ra, STL cịn bao gồm thuật tốn bản: tìm min, max, tính tổng, xếp (với nhiều thuật tốn khác nhau), thay phần tử, tìm kiếm (tìm kiếm thường tìm kiếm nhị phân), trộn Tồn tính nêu cung cấp dạng template nên việc lập trình ln thể tính khái qt hóa cao Nhờ vậy, STL làm cho ngơn ngữ C++ trở nên sáng nhiều Trang Để sử dụng STL bạn cần khai báo using namespace std; sau khai báo thư viện cần dùng Có thể tóm tắt thành phần STL hình vẽ sau: Như hình vẽ ta thấy STL gồm nhóm thành phần chính: Container, Iterator Algorithm Tôi đưa số khái niệm chúng: 1.1.2 Containers Một container đối tượng cụ thể lưu trữ tập đối tượng khác (các phần tử nó) Nó thực lớp mẫu (class templates) Container quản lý khơng gian lưu trữ cho phần tử cung cấp hàm thành viên (member function) để truy cập tới chúng, trực tiếp thông qua biến lặp (iterator – giống trỏ) Container xây dựng cấu trúc thuờng sử dụng lập trình như: mảng động - dynamic arrays (vector), hàng đợi – queues (queue), hàng đợi ưu tiên – heaps (priority queue), danh sách kiên kết – linked list (list), – trees (set), mảng ánh xạ -associative arrays (map), Nhiều container chứa số hàm thành viên giống Quyết định sử dụng loại container cho nhu cầu cụ thể nói chung khơng phụ thuộc vào hàm cung cấp mà phải dựa vào hiệu hàm thành viên Điều đặc biệt với container dãy (sequence containers), mà có khác độ phức tạp thao tác chèn/xóa phần tử hay truy cập vào phần tử Trang 1.1.3 Iterator Iterator đối tượng (giống trỏ) sử dụng để trỏ đến địa ô nhớ chứa Container Chúng ta sử dụng Iterator để duyệt qua phần tử Container Iterator đóng vai trị cầu nối quan trọng Algorithm với Container Mỗi loại Container khác lại có loại Iterator tương ứng 1.1.4 Algorithm Có nhiều Algorithm xây dựng sẵn STL (chẳng hạn thuật tốn xếp, tìm kiếm, tìm min-max, …) Các thuật tốn xây dựng sẵn xây dựng cách tối ưu có thể, áp dụng nhiều kiểu liệu khác 1.2 Đối tượng chuyên đề Chuyên đề không giới thiệu chi tiết thành phần STL điều khơng thể Mà tập trung vào chia sẻ tập có áp dụng Associative Containers (là loại Containers) mà thơi Trong trường hợp tốn cần cấu trúc liệu tương tự việc dùng Associative Containers thuận lợi nhiều so với việc tự xây dựng, cài đặt cấu trúc liệu từ đầu 1.2.1 Set (Tập hợp) Set loại associative containers để lưu trữ phần tử không bị trùng lặp (unique elements), phần tử khóa (keys) Khi duyệt set theo iterator từ begin đến end, phần tử set tăng dần theo phép toán so sánh Mặc định set sử dụng phép toán less, bạn viết lại hàm so sánh theo ý Trang Set thực giống tìm kiếm nhị phân (Binary search tree) Khai báo: #include set s; set s; Hoặc viết class so sánh theo ý mình: struct cmp{ bool operator() (int a,int b) {return asecond; // giống (*it).second Capacity: - size : trả kích thước map ĐPT O(1) - empty : true map rỗng, ngược lại ĐPT O(1) Truy cập tới phần tử: - operator [khóa]: Nếu khóa có map, hàm trả giá trị mà khóa ánh xạ đến Ngược lại, khóa chưa có map, gọi [] thêm vào map khóa ĐPT O(logN) Chỉnh sửa - insert : Chèn phần tử vào map Chú ý: phần tử chèn vào phải kiểu “pair” ĐPT O(logN) - erase : - xóa theo iterator ĐPT O(logN) - xóa theo khóa: xóa khóa map ĐPT: O(logN) - clear : xóa tất set ĐPT O(n) - swap : đổi set cho ĐPT O(n) Operations: - find : trả itarator trỏ đến phần tử cần tìm kiếm Nếu khơng tìm thấy iterator trỏ “end” map ĐPT O(logN) Trang - lower_bound : trả iterator đến vị trí phần tử bé mà lớn khóa (dĩ nhiên theo phép so sánh), khơng tìm thấy trả vị trí “end” map ĐPT O(logN) - upper_bound: trả iterator đến vị trí phần tử bé mà lớn khóa, khơng tìm thấy trả vị trí “end” map ĐPT O(logN) - count : trả số lần xuất khóa multiset ĐPT O(logN) Bài tập áp dụng Các tập Chuyên đề tác giả cho học sinh làm test trình dạy cho học sinh đội tuyển HSG Áp dụng tốt học sinh lớp 10, học sinh bắt đầu có tư lập trình Nhiều toán áp dụng STL việc code trở nên đơn giản nhiều, chương trình ngắn gọn, dễ hiểu Trong số dùng SET thay cấu trúc liệu Segment tree Binary Index tree Test sinh tự động trình sinh test riêng, sinh ngẫu nhiên theo điều kiện nêu đề 2.1 Bài Xếp hàng ưu tiên Nguồn tập: https://vn.spoj.com/problems/MSE07B/ 2.1.1 Đề bài: MSE07B Ngan hà ng BIG-Bank mở mọ t chi nhá nh ở Bucharest và được trang bị mọ t má y tính hiẹ n đạ i với cá c cong nghẹ mới nhạ p, C2#,VC3+ chỉ chuó i mõ i cá i là khong bié t lạ p trình Họ cà n mọ t phà n mè m mo tả hoạ t đọ ng củ a ngan hà ng sau: mõ i khá ch hà ng có mọ t mã só là só nguyen K, và đé n ngan hà ng giao dịch, họ sẽ nhạ n được só P là thứ tự ưu tien củ a họ Cá c thao tá c chính sau: (0) Ké t thú c phụ c vụ (1 K P) Them khá ch hà ng K và o hà ng đợi với đọ ưu tien P (2) Phụ c vụ người có đọ ưu tien cao nhá t và xó a khỏ i danh sá ch hà ng đợi (3) Phụ c vụ người có đọ ưu tien thá p nhá t và xó a khỏ i danh sá ch hà ng đợi Tá t nhien là họ cà n bạ n giú p rò i Input: Mõ i dò ng củ a input là yeu cà u, và chỉ yeu cà u cuó i cù ng mới có giá trị là Giả thié t là có yeu cà u thì khong có khá ch hà ng nà o khá c có đọ ưu tien là P (𝐾 ≤ 106 ; 𝑃 ≤ 107 , tổng số yêu cầu loại không 105 ) Mọ t khá ch hà ng có thẻ yeu cà u phụ c vụ nhiè u là n và với cá c đọ ưu tien khá c Output: Với mõ i yeu cà u hoạ c 3, in tren dò ng mã só củ a khá ch hà ng được phụ c vụ tương ứng Né u có yeu cà u mà hà ng đợi rõ ng, in só Example: Trang MSE07B.INP MSE07B.OUT 20 14 20 30 30 10 10 99 2 2.1.2 Hướng dẫn giải thuật Nhận xét: Nếu danh sách khách hàng đưa vào mảng không xếp theo độ ưu tiên P, có thao tác loại ta lại phải tìm min, max Mỗi thao tác loại có độ phức tạp thuật tốn phụ thuộc tuyến tính vào số lượng khách hàng Như chương trình khơng chạy thời gian cho phép Do vậy, danh sách khách hàng cần xếp theo độ ưu tiên tăng (hoặc giảm) Các thao loại 1, 2, xen kẽ nên danh sách khách hàng liên tục biến động, việc quản lý tương đối phức tạp Tuy nhiên, sử dụng kiểu liệu SET vấn đề trở nên đơn giản 2.1.3 Chương trình minh họa #include #define ii pair using namespace std; set s; set::iterator it; //iterator de tro den set s int x,k,p; int main() { freopen("MSE07B.inp","r",stdin); freopen("MSE07B.out","w",stdout); cin>>x; while (x!=0) { if (x==1) { //thao tac loai cin>>k>>p; s.insert({p,k}); } Trang 10 res++; } coutsecond.first)); } Trang 18 sort(v.begin(), v.end()); for(vector::iterator it=v.begin(); it!=v.end(); it++) { for(int i=0; icount; i++) { printf("%d ",it->val); } } printf("\n"); } 2.5.4 Cảm nhận Việc sử dụng STL rõ ràng tạo đơn giản việc xử lý tốn Nắm cơng cụ thư viện giúp học sinh đễ dàng tổ chức liệu triển khai kĩ thuật lập trình để giải toán Độ phức tạp: 𝑂(𝑁𝑙𝑜𝑔𝑁) Test kèm theo: https://drive.google.com/drive/folders/19ZOg8CcfcTpfhvzfE5LDCiYS2l7eX Anc?usp=sharing 2.6 Bài 6- Chỗ ngồi nhà hát 2.6.1 Đề - SEATS Trong nhà hát có 𝑁 chỗ ngồi, chúng xếp thành hàng dài đánh số từ đến 𝑁 từ trái qua phải Ghế số gần khán đài ghế số 𝑁 ghế xa Khi thấy phía nhà hát cịn ghế trống nhân viên bán vé bán vé cho khán giả vào Ban đầu tất ghế trống, khách vào chắn ngồi ghế (ghế số 1) Mỗi có khán giả vào thêm, họ ln chọn chỗ cho khoảng cách từ họ đến người gần xa Nếu có nhiều chỗ họ chọn ghế có số thứ tự nhỏ Trong suốt buổi hòa nhạc, nhân viên bán vé thấy có 𝑄 người vào Hỏi số ghế người vào sau số theo cách chọn chỗ Input: Dòng số 𝑁, 𝑄 ( 𝑁 số ghế; 𝑄 số người ra, vào) 𝑄 dịng mơ tả người ra, người vào: Nếu (1) có người vào cần tìm số ghế mà người chọn Nếu (2, i) người thứ i khỏi nhà hát Biết ≤ 𝑁 ≤ 1018 ; ≤ 𝑄 ≤ 105 Output: Gồm nhiều số tương ứng với số ghế người vào sau chọn Example: Trang 19 SEATS.INP SEAT.OUT Giải thích 27 Có ghế lượt vào Người vào, chọn ghế 1 Người vào, chọn ghế 21 Người ra, ghế trống Người vào, chọn ghế 22 Người ra, ghế trống 23 Người ra, ghế trống Người vào chọn ghế 2.6.2 Hướng dẫn giải thuật Gọi dãy ghế liên tục cịn trống chưa có người ngồi đoạn Các đoạn quản lý set S gồm thông tin sau: số đầu, số cuối, khoảng cách tạo có người vào, số ghế chọn Xét đoạn xác định số ghế đầu cuối Gọi đoạn dài đoạn [𝑖, 𝑗], đoạn có 𝑗 − 𝑖 + ghế trống Khi người vào họ chọn ghế 𝒌 đoạn Theo cách chọn đưa ra, vị trí chọn đoạn xác định sau: 𝑛ế𝑢 𝑖 = 𝑁 𝑛ế𝑢 𝑗 = 𝑁 𝒌 = 𝐴[𝑖, 𝑗] = { 𝑖+𝑗 ⌊ ⌋ 𝑐ò𝑛 𝑙ạ𝑖 Khi vị trí 𝒌 chọn khoảng cách 𝐷[𝑖, 𝑗] tạo là: 𝑗 𝑛ế𝑢 𝑖 = 𝒅𝒆𝒔 = 𝐷[𝑖, 𝑗] = { 𝐴[𝑖, 𝑗] − 𝑖 + 𝑛ế𝑢 𝑖 ≠ Tình 1: Khi vị trí 𝐴[𝑖, 𝑗] = 𝑘 có người ngồi vào đoạn [𝑖, 𝑗] cần loại bỏ khỏi S thêm tối đa đoạn có độ dài 𝐷[𝑖, 𝑗] [𝑖, 𝑘 − 1] [𝑘 + 1, 𝑗] vào S Hình sau mô tả việc thêm người vào đoạn [𝑖, 𝑗] i j .# # # i ' ' i k-1 k j # # # ' -' k+1 j Với vị trí # vị trí có người ngồi Tình 2: Khi có người rời Thì cần tìm vị trí 𝒌 họ Từ xây dựng lại đoạn [𝑖, 𝑗] tương ứng Trang 20 2.6.3 Chương trình tham khảo #include using namespace std; #define LL long long #define MAX 100005 LL n; struct data { //thong tin ve doan ghe LL st, ed, des, seat; //start, end, destination, seat bool make(LL a, LL b) { st = a, ed = b; if (a>b) return false; if(st == 1) seat = 1, des = (ed+1)-seat; else if(ed == n) seat = n, des = seat - (st-1); else { seat = (st+ed)/2; des = seat - (st-1); } return true; } }; bool operator < (data a, data b) { if(a.des == b.des) return a.seat < b.seat; return a.des > b.des; } setfilled;//tap hop vi tri da co nguoi setS;//chua thong tin ve cac doan ghe LL pos[MAX]; LL add(int p) { //tinh huong nguoi vao assert(S.size()); auto it = S.begin(); filled.insert(it->seat); LL a = it->st; LL b = it->seat-1; data tmp; if(tmp.make(a,b)) S.insert(tmp); //them doan truoc Trang 21 a = it->seat+1; b = it->ed; if(tmp.make(a,b)) { S.insert(tmp); //them doan sau } pos[p] = it->seat; S.erase(*it); return pos[p]; } void del(int p) { //tinh huong nguoi LL seat = pos[p]; auto it = filled.find(seat); it ; LL a = *it+1; LL b = seat-1; LL myA = a; data tmp; if(tmp.make(a,b)) S.erase(tmp); it++; it++; a = seat+1; b = *it-1; LL myB = b; if(tmp.make(a,b)) S.erase(tmp); if(tmp.make(myA, myB)) S.insert(tmp); filled.erase(seat); } int q,cnt,type,idx; int main() { freopen("SEATS.INP","r",stdin); freopen("SEATS.OUT","w",stdout); cin>>n; cin>>q; filled.insert(0); filled.insert(n+1); data tmp; tmp.make(1, n); S.insert(tmp); Trang 22 while(q ) { cin>>type; if(type == 1) { cnt++; LL ans = add(cnt); cout>n; s[0]=1; for(int i=1; i>a; sum=sum+a; res=res+s[sum]; s[sum]++; } coutn>>q; for(int i=1; i>a[i]; s[a[i]].insert(i); } for(int i=1; i>t; if(t==1) { int x,y; cin>>x>>y; s[a[x]].erase(x); a[x]=y; s[y].insert(x); Trang 26 } else { int l,r,mx=-10,mn=-1; cin>>l>>r; for(int i=1; imx) { mx=dif; mn=i; } } } } coutm; for(int i=1; ir) break; arr[*it]/=p; Trang 29 if (arr[*it]%p) del.push_back(*it); } for(vi it = del.begin(); it!=del.end(); it++) myset[p].erase(*it); //deleting the numbers } //xoa l khoi set[arr[l]] va them l vao set[d] if (type==2) { scanf("%d%d",&l,&d); if(arr[l]%2==0) myset[2].erase(l); if(arr[l]%3==0) myset[3].erase(l); if(arr[l]%5==0) myset[5].erase(l); //them d vao set if (d%2==0) myset[2].insert(l); if (d%3==0) myset[3].insert(l); if (d%5==0) myset[5].insert(l); arr[l] = d; } } for(int i=1; i

Ngày đăng: 18/08/2020, 22:11

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan