SPOJ – Tập hợp động – CPPSET (cơ bản về set)

SPOJ – Tập hợp động – CPPSET (cơ bản về set)

Cho một tập hợp S các số nguyên, bạn hãy lập trình thực hiện các thao tác sau:

  • ADD x: thêm số x vào tập S
  • DELETE x: xóa số x khỏi tập S
  • MININUM: tìm số nhỏ nhất trong tập S
  • MAXIMUM: tìm số lớn nhất trong tập S
  • SUCC x: tìm số nhỏ nhất lớn hơn x trong tập S
  • SUCC_2 x: tìm số nhỏ nhất và không nhỏ hơn x trong tập S
  • PRED x: tìm số lớn nhất nhỏ hơn x trong tập S
  • PRED_2 x: tìm số lớn nhất không vượt quá x trong tập S

Ghi chú: Đối với thao tác DELETE, giữ nguyên tập S nếu x không có trong tập S. Đối với các thao tác MINIMUM, MAXIMUM, SUCC, SUCC_2, PRED và PRED_2, in ra ’empty’ nếu tập S rỗng. Đối với các thao tác SUCC, SUCC_2, PRED và PRED_2, in ra ‘no’ nếu không tìm được số thỏa mãn.

Các thao tác ADD, DELETE, MINIMUM, MAXIMUM, SUCC, SUCC_2, PRED, PRED_2 lần lượt được mã hóa bởi các chỉ số 1 2 3 4 5 6 7 8.

Dữ liệu

Gồm nhiều dòng, mỗi dòng bắt đầu bằng một số từ 0 đến 8 cho biết chỉ số thao tác cần thực hiện. Số 0 báo hiệu kết thúc dữ liệu nhập. Đối với các thao tác 1, 2, 5, 6, 7, 8, số tiếp theo trên dòng là số nguyên x (|x| ≤ 109) cho biết tham số của thao tác. Biết số thao tác cần thực hiện không vượt quá 300000.

Kết quả

Đối với mỗi thao tác loại 3, 4, 5, 6, 7, 8 in ra một dòng là kết quả của thao tác.

Ví dụ

Dữ liệu
4
1 10
1 5
3
1 7
4
2 5
3
5 10
6 10
7 10
8 10
2 10
7 100
0

Kết quả
empty
5
10
7
no
10
7
10
7

Gợi ý

Bạn hãy dùng cấu trúc set trong thư viện STL của C++. Bài này bạn chỉ nộp được bằng C++ mà thôi.

 

link

#include <bits/stdc++.h>
 
using namespace std;
 
struct cmp {
   bool operator () (const int &u, const int &v) const {
       return u < v;
   }
};
 
int n, m, x;
set<int,cmp> s;
set<int,cmp>::iterator it;
 
int main()
{
 //freopen("INP.INP","r",stdin);
 //freopen("OUT.OUT","w",stdout);
 
 while (scanf("%d", &n) == 1) {
 switch (n) {
  case 0 :
    return 0;
  case 1 :
    scanf("%d", &x);
    s.insert(x);
    break;
  case 2 :
    scanf("%d", &x);
    s.erase(x);
    break;
  case 3 :
    if (s.size() == 0) {printf("empty\n"); continue;}
    printf("%d\n", *(s.begin()));
    break;
  case 4 :
    if (s.size() == 0) {printf("empty\n"); continue;}
    printf("%d\n", *(s.rbegin()));
    break;
  case 5 :
    scanf("%d", &x);
    if (s.size() == 0) {printf("empty\n"); continue;}
    it = s.upper_bound(x);
    if (it == s.end()) printf("no\n"); else printf("%d\n", *(it));
    break;
  case 6 :
    scanf("%d", &x);
    if (s.size() == 0) {printf("empty\n"); continue;}
    it = s.lower_bound(x);
    if (it == s.end()) printf("no\n"); else printf("%d\n", *(it));
    break;
  case 7 :
    scanf("%d", &x);
    if (s.size() == 0) {printf("empty\n"); continue;}
    it = s.lower_bound(x);
    if (it == s.begin()) printf("no\n"); else printf("%d\n", *(--it));
    break;
  case 8 :
    scanf("%d", &x);
    if (s.size() == 0) {printf("empty\n"); continue;}
    it = s.lower_bound(x);
    if (*(it) == x) printf("%d\n", x);
    else if (it == s.begin()) printf("no\n");
    else printf("%d\n", *(--it));
    break;
 }
 }
 
 return 0;
}
Bài này đã được đăng trong Bài tập, Binary Search Tree (BST), Lập trình C++ / Pascal, Spoj, Thuật toán. Đánh dấu đường dẫn tĩnh.

Bình luận về bài viết này