ACM练习 校赛183F:公平的游戏(TLE)【set的使用,给迭代器增加指定偏移量】
總時間限制: 1000ms 內存限制: 256000kB
描述
如果說考試還會受到天賦的影響,那最公平的游戲就非抽獎莫屬了。
輸入
第一行輸入一個整數 N,代表操作的總數
接下來的 N 行中,第 i 行包含兩個整數,分別為操作碼 p 和操作數 k
操作碼 p 定義如下:
0: 將號碼 k 添加到記錄中(忽略重復)
1: 將號碼 k 從記錄中刪除
2: 宣布記錄中第 k 大的號碼中獎(保證該號碼存在)
保證輸入的操作碼一定在上述定義中。
除滿足上述條件外,0 < N <= 100000, -1000000000 <= k <= 1000000000
輸出
對于每一個操作,若 p = 0 或 p = 1,不進行輸出
對于每一個操作,若 p = 2,輸出一行,包含一個整數,為該操作選出的中獎號碼
樣例輸入
8
0 1
0 2
0 2
0 3
2 3
1 2
2 2
2 1
樣例輸出
1
1
3
SET的使用
順序容器包括vector、deque、list、forward_list、array、string,所有順序容器都提供了快速順序訪問元素的能力。
關聯容器包括set、map
關聯容器和順序容器有著根本的不同:關聯容器中的元素是按關鍵字來保存和訪問的。與之相對,順序容器中的元素是按它們在容器中的位置來順序保存和訪問的。
關聯容器不支持順序容器的位置相關的操作。原因是關聯容器中元素是根據關鍵字存儲的,這些操作對關聯容器沒有意義。而且,關聯容器也不支持構造函數或插入操作這些接受一個元素值和一個數量值得操作。
關聯容器支持高效的關鍵字查找和訪問。兩個主要的關聯容器(associative container)類型是map和set。map中的元素是一些關鍵字----值(key–value)對:關鍵字起到索引的作用,值則表示與索引相關聯的數據。set中每個元素只包含一個關鍵字:set支持高效的關鍵字查詢操作----檢查一個給定關鍵字是否在set中。
標準庫提供set關聯容器分為:
1、按關鍵字有序保存元素:set(關鍵字即值,即只保存關鍵字的容器);multiset(關鍵字可重復出現的set);
2、無序集合:unordered_set(用哈希函數組織的set);unordered_multiset(哈希組織的set,關鍵字可以重復出現)。
set就是關鍵字的簡單集合。當只是想知道一個值是否存在時,set是最有用的。
在set中每個元素的值都唯一,而且系統能根據元素的值自動進行排序。set中元素的值不能直接被改變。set內部采用的是一種非常高效的平衡檢索二叉樹:紅黑樹,也稱為RB樹(Red-Black Tree)。RB樹的統計性能要好于一般平衡二叉樹。
-
set具備的兩個特點:
-
set中的元素都是排序好的
set中的元素都是唯一的,沒有重復的
set用法:
begin(); // 返回指向第一個元素的迭代器end(); // 返回指向最后一個元素的迭代器clear(); // 清除所有元素count(); // 返回某個值元素的個數empty(); // 如果集合為空,返回trueequal_range(); // 返回集合中與給定值相等的上下限的兩個迭代器erase(); // 刪除集合中的元素find(); // 返回一個指向被查找到元素的迭代器get_allocator(); // 返回集合的分配器insert(); // 在集合中插入元素lower_bound(); // 返回指向大于(或等于)某值的第一個元素的迭代器key_comp(); // 返回一個用于元素間值比較的函數max_size(); // 返回集合能容納的元素的最大限值rbegin(); // 返回指向集合中最后一個元素的反向迭代器rend(); // 返回指向集合中第一個元素的反向迭代器size(); // 集合中元素的數目swap(); // 交換兩個集合變量upper_bound(); // 返回大于某個值元素的迭代器value_comp(); // 返回一個用于比較元素間的值的函數使用迭代器遍歷set
// set::begin/end #include <iostream> #include <set>int main() {int myints[] = { 75,23,65,42,13 };std::set<int> myset(myints, myints + 5);std::cout << "myset contains:";for (std::set<int>::iterator it = myset.begin(); it != myset.end(); ++it)std::cout << ' ' << *it;std::cout << '\n';return 0; }Output: myset contains : 13 23 42 65 75給迭代器指定偏移量
本題代碼
#include<iostream> #include<set> #include<algorithm> #include <iterator> // std::advance using namespace std;int main() {set<int> arr;//輸入總數int total;cin >> total;//循環int i;int p, k;std::set<int>::iterator pos;for (i = 0; i < total; i++){cin >> p >> k;if (p == 0)//添加{arr.insert(k);}else if (p == 1)//刪除k{arr.erase(arr.find(k));}else if (p == 2)//中獎{//找位置輸出pos = arr.end();advance(pos,-k);/*for (int j = 0; j < k; j++){pos--;}*/cout << *pos << "\n";}}system("pause"); }總結
以上是生活随笔為你收集整理的ACM练习 校赛183F:公平的游戏(TLE)【set的使用,给迭代器增加指定偏移量】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ACM练习 校赛183F:公平的游戏(T
- 下一篇: vb循环 Do While…Loop 语