洛谷Oj-P1801 黑匣子-STL
2018-03-27 20:42
232 查看
nth_element函数法(90分):
MULTISET法(AC):
解决方法:
set的默认顺序是升序,所要求的是当前set中的第id小
迭代器初始时指向第一个元素,如果新元素比指向的元素小,则迭代器前移
#pragma GCC optimize(3)//STL必备 int add[200010],get[200010]; int main() { int m,n; cin >> m >> n; for(int i = 1; i <= m; ++i)//添加 scanf("%d",&add[i]); for(int i = 1; i <= n; ++i)//查询 scanf("%d",&get[i]); int j = 0;//其实j没有必要存在 int id = 1; for(int i = 1; i <= m; ++i)//对于每一个添加 { while(get[id] == i)//如果第id个查询是在第i个元素被添加后 { j++; //注意:若对数组add使用函数,则数组内元素的顺序发生了改变 nth_element(add + 1,add + j,add + i + 1); cout << add[j] << endl; id++; } } return 0; }
MULTISET法(AC):
int add[200010],get[200010]; multiset<int> mul_s;//因为元素值可能会重复 int main() { int m,n; cin >> m >> n; for(int i = 1; i <= m; ++i) scanf("%d",&add[i]); for(int i = 1; i <= n; ++i) scanf("%d",&get[i]); mul_s.insert(add[1]); multiset<int>::iterator it = mul_s.begin();//一定是set中有元素后再给迭代器赋初值 int id = 1; for(int i = 1; i <= m; ++i) { if(i != 1)//add[1]已经被放过了 { mul_s.insert(add[i]);//放入集合内 if(add[i] < *it)//如果比所指的值小 it--;//迭代器前移 } while(get[id] == i)//第id个查询是在放入了第i个元素之后 { if(id != 1)//如果是第一次查询的话直接输出就行,因为迭代器初始时指的就是最小的元素 it++;//之后需要向后移动 cout << *it << endl; id++; } } return 0; }
解决方法:
set的默认顺序是升序,所要求的是当前set中的第id小
迭代器初始时指向第一个元素,如果新元素比指向的元素小,则迭代器前移
相关文章推荐
- 洛谷Oj-P1801 黑匣子-堆
- 洛谷P1801 黑匣子_NOI导刊2010提高(06)
- P1801 黑匣子_NOI导刊2010提高(06)
- 洛谷 P1801 黑匣子_NOI导刊2010提高(06)
- P1801 黑匣子(对顶堆)
- 洛谷 [P1801] 黑匣子
- P1801 黑匣子_NOI导刊2010提高(06)
- [P1801]黑匣子
- 洛谷 P1801 黑匣子_NOI导刊2010提高(06)
- 洛谷 P1801 [NOI导刊2010提高(06)] 黑匣子
- 「洛谷 P1801」黑匣子
- 洛谷 P1801 黑匣子_NOI导刊2010提高(06)
- 洛谷 P1801 黑匣子_NOI导刊2010提高(06)
- 洛谷P1801 黑匣子
- C++的STL之set/multiset
- STL之map和set
- STL中map用法详解
- STL中的vector容器的一点总结
- uva101 (紫书-STL)
- STL - C++ 11的Lambda表达式(下)